iOS SDK 封装和开发实战iOS SDK 封装和开发

iOS 高级开发_ 打包与封装 SDK_ 封装静态库 . a

2017-06-22  本文已影响70人  Sunny_Fight

什么是库?

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

在实际的项目开发中,经常会使用到库,库分为静态库和动态库两种。和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

静态库和动态库区别

注意:项目中如果使用了自制的动态库(framework)不能被上传到AppStore

.a和.framewrok有什么区别?

静态库的应用场景

1. a静调库的编译

1.静态库的创建:左侧为.framework 右侧为.a

1.png

2.创建工具类,并暴露接口新建工具类,并在buildPhrase中添加需要暴露的.h文件

2.png

3.分别在不同的环境下编译,从而得到支持不同环境的静调库

3.png

4.查看不同环境下的静态库


4.png

在不同的文件夹下可以查看不同环境使用的.a静调库文件,新建项目,将.a文件拖拽到项目中估计可使用

5.png

静态库中的架构问题

当使用真机环境的.a文件在模拟中编译或者运行时,会报架构的错误 。

如何使静调库支持多种CPU架构

想要制作的静态库既支持i386架构也支持x86_64架构,有两种解决方法.

  1. 修改静态库的编译环境并重新编译


    6.png

    在termnal中使用命令将多个静态库合并

 $ lipo -create Debug-iphoneos/libStaticLibrary.a Debug-iphonesimulator/libStaticLibrary.a -output libnewstatic.a

合并后的静调库的大小>=合并之前静态库大小之和
开发环境:需要支持真机以及模拟器的静态库
生产环境:只需要支持真机的静态库即可

2 .framework静态库的编译

第一步与.a文件文件创建一样,选择framework,点开以后发现,项目中已经存在一个与项目名称一样的主头文件(这是苹果推荐的方式 )
1.将需要暴露的头文件添加到public(拖入即可)

1.png

注意:将需要暴露的头文件放到主头文件中
2.步骤跟.a文件一致,分别在真机以及模拟器环境编译,得到两个不同环境的.framework

2.png

3.使用.framework并运行

3.png

查看控制台发现报错,发现制作的framework为动态库,动态库的使用,需要在target中手动添加动态库。(只能作为测试使用,苹果禁止自制的动态库上架,上架前切记修改为静态库)
4.修改编译环境,编译静态库buildsetting 搜索mach 并修改

4.png

使用该方法制作的静态库,可以运行,但是在4s中是无法运行的,会报CPU架构的错误,通过$lipo -info StaticFramework查看framework所支持的架构,目前这样制作的framework只支持x86架构,因此4s不能运行** 注意 :**cd 到.framework的路径是不够的,因为仅仅是一个文件夹,真正的静态库是一个二进制文件.因此查看架构信息的时候需要跟这个静态库名字修改架构,使制作的framework支持所有架构

5.png

静调库的合并与.a文件一样,在此就不做赘述。至此SDK的开发就到此为止,真正的SDK开发需要在项目中一边开发一边调试

3 SDK静调库的调试

单独进行核心代码SDK的开发,开发完成以后需要拖到项目中调试,这样是本末倒置的。SDK的开发需要在项目中调试以及开发。

6.png

创建完成以后,项目中的结构发生变化,变化的位置已经已经圈出

7.png

在framework文件目录下创建核心代码类,并在项目中需要的地方import主头文件,静调库的制作就不赘述了,与上面的一致。

4 制作静态库时注意的几点:

  1. 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容可以向其中添加图片资源。
  2. category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC -all_load
上一篇 下一篇

猜你喜欢

热点阅读