无论是是整个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目录下 即可

这个很重要

完毕