iOS扩充---制作Framework

1、使用静态库的原因:
2、方便共享代码、便于合理使用;
3、实现iOS程序的模块化。
4、开发第三方sdk的需要。

2、库的概述:

库是共享程序代码的方式,一般分为静态库动态库

1.静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。【.a和.framework】

2.动态库:链接时不复制,程序运行时系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。【.dylib和.framework】

注:系统的.framework是动态库,我们自己建立的.framework是静态库。

3、a与.framework的区别:

.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合.framework文件可以直接使用。

.a + .h + sourceFile = .framework。

建议用.framework.

制作Framework的注意事项:


1 注意理解:无论是.a静态库还.framework静态库,我们需要的都是二进制文件+.h+其它资源文件的形式,不同
的是,.a本身就是二进制文件,需要我们自己配上.h和其它文件才能使用,而.framework本身已经包含了.h
和其它文件,可以直接使用。


2 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或
.framework的名字相同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容
可以向其中添加图片资源。


3 category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,
调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),
解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC。


4 如果一个静态库很复杂,需要暴露的.h比较多的话,就可以在静态库的内部创建一个.h文件(一般这个.h文件
的名字和静态库的名字相同),然后把所有需要暴露出来的.h文件都集中放在这个.h文件中,而那些原本需要
暴露的.h都不需要再暴露了,只需要把.h暴露出来就可以了。


iOS扩充---制作Framework_第1张图片
1
iOS扩充---制作Framework_第2张图片
2
iOS扩充---制作Framework_第3张图片
3
iOS扩充---制作Framework_第4张图片
4
iOS扩充---制作Framework_第5张图片
5
iOS扩充---制作Framework_第6张图片
6

制作过程结束,拷贝出Framework,导入新的项目中即可使用;

创建新工程,导入刚创建的Framework

iOS扩充---制作Framework_第7张图片
7
iOS扩充---制作Framework_第8张图片
8

为什么会这样的?因为我们做的是动态库,在使用的时候需要额外加一个步骤,要把Framework同时添加到‘Embedded Binaries’中

iOS扩充---制作Framework_第9张图片
9

下边是Link binary with libraries Embed Frameworks的区别


Link binary with libraries Link frameworks and libraries with your project’s object files to produce a binary file. You can link a target’s source files against libraries in the target’s active SDK or against external libraries.
Embed Frameworks You can create an embedded framework to share code between your app extension and its containing app.
Timeline If your containing app target links to an embedded framework, it must include the arm64 architecture or it will be rejected by the App Store.

iOS扩充---制作Framework_第10张图片
Paste_Image.png

运行结果成功!

制作通用动态库

新建Aggregate Target

iOS扩充---制作Framework_第11张图片
10

添加script到新建的Target

iOS扩充---制作Framework_第12张图片
11


# Sets the target folders and the final framework product. # 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME # 例如: FMK_NAME = "MyFramework" FMK_NAME=${PROJECT_NAME}  # Install dir will be the final output to the framework. # The following line create it in the root folder of the current project. INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework  # Working dir will be deleted after the framework creation. WRK_DIR=build DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework  # -configuration ${CONFIGURATION} # Clean and Building both architectures. xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build  # Cleaning the oldest. if [ -d "${INSTALL_DIR}" ] then rm -rf "${INSTALL_DIR}" fi  mkdir -p "${INSTALL_DIR}"  cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"  # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product. lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"  rm -r "${WRK_DIR}"  open "${INSTALL_DIR}" 


选中新建的Target,Run,如果没有异常的话,会自动弹出生成的Framework文件

iOS扩充---制作Framework_第13张图片
12

这样生成的动态库就能同时支持模拟器和真机了

XCode6下制作通用静态库

上面我们也提到了,这样生成的动态库恐怕很难在XCode5上使用,那我们为什么非要用动态库呢,一般情况下不是用静态库就好了吗? So Easy!只需要修改一个参数即可生成静态库了

iOS扩充---制作Framework_第14张图片
13

使用静态库的话就可以把Framework从‘Embedded Binaries’中删除了. 亲测在XCode5下可用。把新生成的库导入到测试工程,试试在模拟器和真机上运行,一切OK.
不巧,如果你用的真机是iPhone5 C, 那悲剧又要发成了,生成的Framework竟然不支持armv7s,不知是xCode6的bug,还是因为苹果认为使用armv7s的设备太少,可以不支持了.xCode6新建工程,默认的Arch itectures竟然不包含armv7s

iOS扩充---制作Framework_第15张图片
14

想要生成的库支持armv7s,把armv7s添加到Architectures中,重新生成Framework即可

iOS扩充---制作Framework_第16张图片
15

判断一个Framework支持哪些架构
我们该怎么验证生成的Framework支持哪些平台呢,总不能一个个测试吧?当然不用.下面的命令是加上armv7s前后生成的framework的对比


Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework  Architectures in the fat file: ./MyFramework.framework/MyFramework are: i386 x86_64 armv7 arm64  


Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework  Architectures in the fat file: ./MyFramework.framework/MyFramework are: armv7 armv7s i386 x86_64 arm64 

参考文档:
http://years.im/Home/Article/detail/id/52.html
http://stackoverflow.com/questions/27015154/link-binary-with-libraries-vs-embed-frameworks
http://www.cocoachina.com/ios/20150127/11022.html
http://www.raywenderlich.com/65964/create-a-framework-for-ios
http://www.cocoachina.com/ios/20150127/11022.html
http://www.cocoachina.com/ios/20141126/10322.html
http://www.tuicool.com/articles/VFFjmq6

更多精彩内容请关注“IT实战联盟”哦~~~


iOS扩充---制作Framework_第17张图片
IT实战联盟.jpg

你可能感兴趣的:(iOS扩充---制作Framework)