组件:制作SDK

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版本,为了适配各种机型需要关闭当前的设置。

设置Architecture

可以在编译完成后查看生成的静态库支持的系统架构,终端命令:

lipo -info 静态库文件路径/静态库名.a

结果如下:

Architectures in the fat file: **/**.a are: armv7 i386 x86_64 arm64

3、设置静态库当前支持的系统版本

系统版本

4、切换debug、release环境

切换环境

一般第三方只提供release的版本。

5、Header配置

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

新建工程,选择如下:


创建framework

2、配置Mach

Mach-O Type默认为动态库,如果需要制作静态库的话在这边修改framework类型即可。

配置Mach

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的区别和创建

你可能感兴趣的:(组件:制作SDK)