美文网首页编程开发
iOS framework静态库创建

iOS framework静态库创建

作者: cyhai | 来源:发表于2019-08-22 11:51 被阅读0次

    .a库是静态库,framework可以是动态库也可以是静态库,但是我们编译动态库在上架的时候是会被拒的。.a库是二进制的东西,而framework是除了二进制的东西还有资源文件,.a库要配合.h文件配合使用,framework则不需要。进入正题。

    创建项目

    image.png

    放入功能代码文件


    image.png
    image.png

    设置项目

    image.png
    image.png image.png image.png

    在公开头文件的地方,.a库是需要我们自己去设置的,但是framework已经有默认设置了


    image.png

    然后调至如下图


    image.png

    接着只需把#import "UIColor+Category.h"放到FrameworkDemo.h就行了(这里纠正一下,当前时间 2021-12-10,Project中不需要放入m文件,其次,#import 头文件应该放置在最后,下图位置并不正确,其实注释的绿色英文应该交代清楚了,再次,framework使用category,如果导入后发现报错,方法找不到之类的问题,需要在项目setting中的Other Linker Flags 中添加-ObjC)

    image.png

    生成framework

    这里做法和.a生成一样


    屏幕快照 2019-08-22 上午10.55.49.png
    image.png
    command + B
    

    生成一个debug调试用的
    然后再选择


    image.png

    注意这里


    image.png
    command + B
    
    屏幕快照 2019-08-22 上午10.55.49.png image.png

    然后将这个两个文件夹复制到一个新建文件夹,在另外创建一个newFile文件夹(用来装合并两个framework)


    image.png

    合并framework

    使用命令`lipo -create xxxxx/name.framework/name xxxxx/name2.framework/name2 -output xxxx/name3

    lipo -create /Users/chenhaige/Desktop/aFile/framework/Debug-iphonesimulator/FrameworkDemo.framework/FrameworkDemo /Users/chenhaige/Desktop/aFile/framework/Release-iphoneos/FrameworkDemo.framework/FrameworkDemo -output /Users/chenhaige/Desktop/aFile/framework/newFile/FrameworkDemo
    

    这时候会生成一个新的FrameworkDemo文件,但不是framework,接着我们复制一个framework,然后用新的FrameworkDemo替换掉原来的FrameworkDemo。

    image.png
    查看替换后的framework,支持设备有哪些,lipo -info xxxx/name.framework/name
    image.png

    使用framework

    直接拖进工程


    image.png

    然后引入头文件

    #import <FrameworkDemo/FrameworkDemo.h>
    

    实现方法

    self.view.backgroundColor = [UIColor colorWithHexString:@"#333aaa" alpha:1];
    
    image.png

    另外

    如果想通过cocoapods集成,可以查看另一篇相关文章,https://www.jianshu.com/p/845f2f60b221

    http://www.cyhai.club/?p=185
    但要注意的是
    framework的引入使用

    spec.vendored_frameworks = "xxxx/name.framework"
    

    结束

    (当前时间2021-12-10)补充:

    制作通用的Framework脚本

    image.png image.png
    # Merge Script
    
    # 1
    # Set bash script to exit immediately if any commands fail.
    set -e
    
    # 2
    # Setup some constants for use later on.
    FRAMEWORK_NAME= "你的framework名称" 
    
    # 3
    # If remnants from a previous build exist, delete them.
    if [ -d "${SRCROOT}/build" ]; then
    rm -rf "${SRCROOT}/build"
    fi
    
    # 4
    # Build the framework for device and for simulator (using
    # all needed architectures).
    xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no defines_module=yes -sdk "iphoneos"
    xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch x86_64 -arch i386 only_active_arch=no defines_module=yes -sdk "iphonesimulator"
    
    # 5
    # Remove .framework file if exists on Desktop from previous run.
    if [ -d "${HOME}/Desktop/${FRAMEWORK_NAME}.framework" ]; then
    rm -rf "${HOME}/Desktop/${FRAMEWORK_NAME}.framework"
    fi
    
    # 6
    # Copy the device version of framework to Desktop.
    cp -r "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework" "${HOME}/Desktop/${FRAMEWORK_NAME}.framework"
    
    # 7
    # Replace the framework executable within the framework with
    # a new version created by merging the device and simulator
    # frameworks' executables with lipo.
    lipo -create -output "${HOME}/Desktop/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}"
    
    # 8
    # Copy the Swift module mappings for the simulator into the
    # framework.  The device mappings already exist from step 6.
    cp -r "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${HOME}/Desktop/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule"
    
    # 9
    # Delete the most recent build.
    if [ -d "${SRCROOT}/build" ]; then
    rm -rf "${SRCROOT}/build"
    fi
    
    

    注意脚本要修改framework的名称,脚本lipo -create -output 输出的是桌面,所以,跑完后会在桌面看到一个framework,还值得注意的是,第8个步骤,如果你用的是OC,不存在与Swift的混合.swiftmodule是不存在,也不需要,请把第8个步骤注释掉
    当然,也可以手动操作build完再合并

    但是但是,苹果又搞事情了,xcode新版本,framework,合并之后会出现 Building for iOS, but the linked and embedded framework ‘xxx.framework’ was built for iOS + iOS Simulator.
    因为构建方式改变,这种方式合并,并不能通用,网上给出了有修改构建方式为旧版本方式,另一种是修改setting里面的Validate WorkSpace 设置为 YES。但是苹果给出的答案是,使用新的framework打包方式,XCFramewrok,

    XCFramewrok

    set -e
    
    FRAMEWORK_NAME="FrameWork名字"
    IOS_SCHEME_NAME="Scheme名字"
    
    if [ -d "${SRCROOT}/build" ]; then
    rm -rf "${SRCROOT}/build"
    fi
    
    SIMULATOR_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphonesimulator.xcarchive"
    DEVICE_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphoneos.xcarchive"
    
    OUTPUT_DIR="${SRCROOT}/framework_out_universal/"
    
    # Simulator xcarchieve
    xcodebuild archive \
      -scheme ${IOS_SCHEME_NAME} \
      -archivePath ${SIMULATOR_ARCHIVE_PATH} \
      -configuration Release \
      -sdk iphonesimulator \
      SKIP_INSTALL=NO
    
    # Device xcarchieve
    xcodebuild archive \
      -scheme ${IOS_SCHEME_NAME} \
      -archivePath ${DEVICE_ARCHIVE_PATH} \
      -sdk iphoneos \
      -configuration Release \
      SKIP_INSTALL=NO
    
    # Clean up old output directory
    rm -rf "${OUTPUT_DIR}"
    
    # Create xcframwork combine of all frameworks
    xcodebuild -create-xcframework \
      -framework ${SIMULATOR_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
      -framework ${DEVICE_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
      -output ${OUTPUT_DIR}/${FRAMEWORK_NAME}.xcframework
    
    # Delete the most recent build.
    if [ -d "${SRCROOT}/build" ]; then
    rm -rf "${SRCROOT}/build"
    fi
    
    

    注意了,这里构建过来的路径是你的Framework项目本身文件夹下,别再桌面找了。
    当然也可以手动处理

    xcodebuild -create-xcframework -framework /Users/youthmba/Desktop/FrameWork/debug/Debug-iphoneos/MyFrameWork.framework -framework /Users/youthmba/Desktop/FrameWork/debug/Debug-iphonesimulator/MyFrameWork.framework -output /Users/youthmba/Desktop/FrameWork/All/MyFrameWork.xcframework
    

    如果出现,安装提示uninstall,应该是


    image.png image.png

    使用Do Not Embed。

    相关文章

      网友评论

        本文标题:iOS framework静态库创建

        本文链接:https://www.haomeiwen.com/subject/fkngsctx.html