美文网首页iOS Developer
xcode 8 Framework 打包(一)将整个工程打Fr

xcode 8 Framework 打包(一)将整个工程打Fr

作者: _海角_ | 来源:发表于2017-08-10 17:47 被阅读980次

    无论是是整个xcode工程还是将部分代码打包Framework 方法是一致的,对于AppDelegate来讲,不要包含进去即可

    1.创建Framework的target

    选择Targets中的+ --> iOS -->Cocoa Touch Framework --> Next


    图例1.png

    对于使用了Cocoapod导入第三方的xcode工程来讲 需要在Podfile中 做如下修改 之后 pod install

    需要同时对住工程target 和Framework的target 配置pod环境

    # Uncomment the next line to define a global platform for your project
    # platform :ios, '9.0'
    use_frameworks!
    target 'xxx' do
        react_native_path = "./ReactNative/node_modules/react-native"
        pod "React", :path => react_native_path,:subspecs => [
        'Core',
        'RCTText',
        'RCTImage',
        'RCTLinkingIOS',
        'RCTSettings',
        'RCTVibration',
        'RCTGeolocation',
        'RCTActionSheet',
        'RCTNetwork',
        'RCTWebSocket'
        ]
        pod "Yoga", :path => "#{react_native_path}/ReactCommon/yoga"
        pod 'Masonry', '1.0.2'
        pod 'FMDB', '2.6.2'
        pod 'MJExtension', '3.0.13'
        pod 'MJRefresh', '3.1.12'
        pod 'AFNetworking', '3.1.0'
        pod 'SVProgressHUD', '2.1.2'
        pod 'TZImagePickerController', '1.7.8'
        pod 'BeeCloud', '3.6.1'
        pod 'HyphenateLite','3.3.2'
        pod 'EaseUILite', :git =>'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git’,:tag => '3.3.2'
        pod 'BaiduMapKit' #百度地图SDK
        pod 'EDStarRating', '1.1'
        pod 'ReactiveObjC', '3.0.0' #测试使用
    
    end
    
    
    
    target ‘xxx_Framework’ do
        react_native_path = "./ReactNative/node_modules/react-native"
        pod "React", :path => react_native_path,:subspecs => [
        'Core',
        'RCTText',
        'RCTImage',
        'RCTLinkingIOS',
        'RCTSettings',
        'RCTVibration',
        'RCTGeolocation',
        'RCTActionSheet',
        'RCTNetwork',
        'RCTWebSocket'
        ]
        pod "Yoga", :path => "#{react_native_path}/ReactCommon/yoga"
        pod 'Masonry', '1.0.2'
        pod 'FMDB', '2.6.2'
        pod 'MJExtension', '3.0.13'
        pod 'MJRefresh', '3.1.12'
        pod 'AFNetworking', '3.1.0'
        pod 'SVProgressHUD', '2.1.2'
        pod 'TZImagePickerController', '1.7.8'
        pod 'BeeCloud', '3.6.1'
        pod 'HyphenateLite','3.3.2'
        pod 'BaiduMapKit' #百度地图SDK
        pod 'EaseUILite', :git =>'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git’,:tag => '3.3.2'
        pod 'EDStarRating', '1.1'
        pod 'ReactiveObjC', '3.0.0' #测试使用
    end
    
    post_install do |installer|
        installer.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
                config.build_settings['ENABLE_BITCODE'] = 'NO'
            end
        end
    end
    
    

    2.build Setting 设置

    选择工程文件>target第一项>Build Setting>搜索linking,然后几个需要设置的选项都显现出来,首先是Dead Code Stripping设置为NO,网上对此项的解释如下,大致意思是如果开启此项就会对代码中的”dead”、”unreachable”的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原framework中的代码,将此项关闭也未曾不可。
    The resulting executable will not include any “dead” or unreachable code
    然后将Link With Standard Libraries关闭,我想可能是为了避免重复链接
    最后将Mach-O Type设为Static Library,framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库。

    图例3.png

    开始将下图中的build Active Architecture only选项设为YES,导致其编译时只生成当前机器的框架,将其设置为NO后,发现用模拟器编译后生成的framework同时包含x86_64和i386架构。不过这个无所谓,我们之后会使用编译脚本,脚本会将所有的架构全包含

    图例4.png

    Header中将需要暴露的头文件暴露出去,Complie Sources 中需要编译的xxxx.m源文件添加进去

    图例5.png

    3.向外暴露引用文件

    build Phases 中header只是声明那些文件可以在外部可以被引用
    在framework目录下的.h 文件中讲需要暴露出去的头文件声明一下

    图例6.png

    否则在引用的时候会出现如下 Miss submodule 'xxxxx.xxxx.h'的警告


    图例7.png

    4.编译

    编译成功之后 xxx.framwork 即变为黑色 show in finder 就会看到

    图例8.png

    show in finder 如下
    Debug-iphoneos 为Debug模式下真机使用的
    Debug-iphonesimulator 为Debug模式下模拟器使用的
    Release -iphoneos 为Release模式下真机使用的
    Release-iphonesimulator 为Release模式下模拟器使用的

    图例9.png

    5.framework框架

    1.检查framework支持的框架

    使用 lipo -info 即可查看 framework所支持的架构

    lipo -info xxx_Framework 
    Architectures in the fat file: xxx_Framework are: armv7 arm64
    

    2.合并framework

    使用lipo -create xxx xxx -output xxx 即可将支持单个架构的framework融合成一个支持多种架构的framework

    MacBook-Pro:Products $ lipo -create /Users/sqq/Library/Developer/Xcode/DerivedData/xxxx-ahamypgonskszeeayqaqqzajlxvq/Build/Products/Release-iphoneos/PTYL_Client_Framework.framework/PTYL_Client_Framework /Users/sqq/Library/Developer/Xcode/DerivedData/xxxx-ahamypgonskszeeayqaqqzajlxvq/Build/Products/Release-iphonesimulator/PTYL_Client_Framework.framework/xxxx -output xxx
    MacBook-Pro:Products $ ls
    Debug-iphoneos      xxxx    Release-iphonesimulator
    Debug-iphonesimulator   Release-iphoneos    Release-universal
    MacBook-Pro:Products $ lipo -info xxx
    Architectures in the fat file: xxxx are: armv7 i386 x86_64 arm64 
    

    最后将output 生成的 文件 复制到Debug-iphoneos 或者Debug-iphonesimulator 任意一个下面的framework目录下 即可
    这个很重要

    完毕

    这里为手动合并框架,下一篇将介绍如何自动合并
    下一篇
    Xcode8 下 Framework 打包(二)自动打包脚本创建过程

    参考
    上传APP到应用商店时出现 ERROR ITMS-90668错误

    相关文章

      网友评论

        本文标题:xcode 8 Framework 打包(一)将整个工程打Fr

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