SDK
因为公司的组件化开发的深入,虽然自己只是使用不需要去处理组件(组件模块是另外的小伙伴+大佬架构师负责的),还是需要自己造轮子。就屡屡了...花了点时间整理了下简单的,这些都是为组件做基础,后续会持续更新并实现组件。
废话就不多说了,关于SDK可以自行百度这边就不扯了,开始下面的正文。
静态库
静态库:.a
和.framework
动态库
动态库:.dylib
和.framework
.a 和 .framework 的区别
-
.a
是单纯的二进制文件 -
.framework
是二进制文件+资源文件 -
.a
不能直接使用,需要.h
文件配合 -
.framework
则可以直接使用,.framework = .a + .h + sourceFile(资源文件)
-
.framework
可静可动,取决于你Mach-O Type
配置
静态库
1、创建工程
选择Cocoa Touch Static Library
:
2、Build Active Architecture Only
Build Active Architecture Only
设置为YES,表示只编译当前的Architecture
版本,为了适配各种机型需要关闭当前的设置。
可以在编译完成后查看生成的静态库支持的系统架构,终端命令:
lipo -info 静态库文件路径/静态库名.a
结果如下:
Architectures in the fat file: **/**.a are: armv7 i386 x86_64 arm64
3、设置静态库当前支持的系统版本
4、切换debug、release环境
一般第三方只提供release
的版本。
5、Header配置
6、国际化语言
这边就不多讲了,国际化语言跟平时设置是一样的,具体的就附上个通道吧iOS之SDK开发的总结,查看上面介绍的第四点即可。
7、编译生成静态库
真机、模拟器各需要运行一次生成对应的静态库,根据第4点
切换环境编译生成对应的静态库,编译快捷键cmd + B
。
如何查看编译是否成功,查看工程目录如下图红色框里面的名字,如果是红色的则未编译,下图是已经编译后的颜色:
编译完成后可以点击上面红色框Show In Finder
进入该文件目录。
8、合并真机、模拟器静态库
终端命令
lipo -create 模拟器静态库路径/**.a 真机静态库路径/**.a -output 存放路径/静态库名.a
注:格式如上,上面的空格不是为了美观,而是格式
举个例子:
lipo -create /Library/Developer/Xcode/DerivedData/DZStaticLibrary-cvrjreurkbbaszcaczcvkzvfnijm/Build/Products/Release-iphoneos/libDZStaticLibrary.a /Library/Developer/Xcode/DerivedData/DZStaticLibrary-cvrjreurkbbaszcaczcvkzvfnijm/Build/Products/Release-iphonesimulator/libDZStaticLibrary.a -output /Desktop/aFile/releaseTest.a
静态库制作完成,将静态库拖入工程中,记得导入相应需要暴露的头文件。因为静态库没有提供相应的头文件,只是单纯的一个.a文件。
使用framework制作静态库
使用framework
制作静态库的方法就放到动态库
中一起说明,具体的可以查看动态库--2、配置Mach
动态库
在制作动态库上跟制作静态库的流程是大同小异,主要介绍不同的。
1、创建framework
新建工程,选择如下:
2、配置Mach
Mach-O Type
默认为动态库,如果需要制作静态库的话在这边修改framework
类型即可。
3、配置支持
- 配置
Build Active Architecture Only
参考制作静态库--2、Build Active Architecture Only - 配置支持系统,参考制作静态库--3、设置静态库当前支持的系统版本
- 配置多环境,参考制作静态库--4、切换debug、release环境
- 配置暴露头文件,参考制作静态库--5、Header配置
- 配置国际化语言,参考制作静态库--6、国际化语言
配置完成后,cmd + B
分别编译生成模拟器、真机Framework
。
4、合并模拟器、真机Framework
终端命令与制作.a静态库是一样的,不同的是选择的文件,需要用来合并的文件如下:
终端命令如下:
lipo -create 真机文件路径/DZFramework.framework/DZFramework 模拟器文件路径/DZFramework.framework/DZFramework -output 输出文件路径
别忘了该空格的地方带上空格。
举个例子:
lipo -create /Developer/Xcode/DerivedData/DZFramework-bwtjxsorbswshmgovbeuairmclos/Build/Products/Debug-iphoneos/DZFramework.framework/DZFramework /Developer/Xcode/DerivedData/DZFramework-bwtjxsorbswshmgovbeuairmclos/Build/Products/Debug-iphonesimulator/DZFramework.framework/DZFramework -output /Desktop/result
输出的文件是result.lipo
,它的格式是.lipo
,将该文件修改成合并文件时的文件名并放入其中一个framework
中替换,通用的Framework
制作好了。
图中红色框的文件是替换合并后的文件。
5、使用
将库导入需要使用的工程中即可。
bundle资源库
创建bundle
在工程中新建bundle,iOS->Resource->Setting Bundle 命名bundle,比如Resource.bundle。
添加文件
创建一个文件夹如:images,将需要放入的图片拖进去即可,拖进去后Xcode还是未显示出加入的图片,可以将bundle取出然后重新添加进去就有了。
调用
//加载自定义名称为Resources.bundle中对应images文件夹中的图片
//从mainbundle中获取resources.bundle
NSString *strPath = [[NSBundle mainBundle] pathForResource:@"Resource" ofType:@"bundle"];
//找到对应images夹下的图片
NSString *strImage = [[NSBundle bundleWithPath:strPath] pathForResource:@"cff2" ofType:@"png" inDirectory:@"images"];
UIImage *ima = [UIImage imageWithContentsOfFile:strImage];
编译参数
项目中导入使用的时候需要配置的编译参数Build Settings -> Linking -> Other Linker Flags
,相关的介绍附上。
-ObjC
如果静态库中有category
,那么需要添加 -ObjC
参数标识,否则可能会报:unrecognized selector sent to instance
,因为链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中。
-all_load
会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol
错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC
失效的情况下使用-force_load
参数。
-force_load
所做的事情跟-all_load
其实是一样的,但是-force_load
需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载
相关参考
iOS-SDK从无到有(学有所出,有所记)
配置和使用静态库
iOS之SDK开发的总结
iOS 库.a 和 framework的区别和创建