轻松玩转自定义ios库

1.库的介绍。

  • 什么是库?
    • 库是程序代码的集合,是共享程序代码的一种方式
  • 根据源代码的公开情况,库可以分为2种类型
    • 开源库
      • 公开源代码,能看到具体实现
      • 比如SDWebImage、AFNetworking
    • 闭源库
      • 不公开源代码,是经过编译后的二进制文件,看不到具体实现
      • 主要分为:静态库、动态库
  • 静态库和动态库
    • 静态库和动态库的存在形式
      • 静态库:.a 和 .framework
      • 动态库:.dylib 和 .framework
    • 静态库和动态库在使用上的区别
      • 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
      • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
      • 需要注意的是: 项目中如果使用了自制的动态库,不能被上传到AppStore
  • 应用场景
    • 静态库应用场景(一)
      • 百度地图想开发者在应用程序中集成百度地图
      • 但是百度不想公布自己的技术实现,如何完成呢?
      • 百度将自己的核心代码编译成静态库
      • 对外暴露统一的接口
      • 开发者集成静态库,并且调用静态库即可集成
    • 静态库应用场景(二)
      • 公司项目开发有一部分代码为核心代码
      • 如果任何人都可以拿到核心代码,那么一旦有人离职,公司核心代码就会一起被拿到.如何防止这种情况呢?
      • 公司抽出一部分核心团队成员,专门开发这部分核心代码
      • 开发后,将核心代码编译成静态库给其他程序员调用
      • 核心成员很少会离职,非核心成员离职无法带走核心代码

2.制作库:

下面有请我们的攻城利器闪亮登场!!!


轻松玩转自定义ios库_第1张图片
Snip20161120_13.png

你没有看错在开发ios库时,Xcode为我们提供了两个开发工具,左边工具是生成后缀为.Framework的库的,默认生成的是动态库,开发语言是可选的(Swift或者OC),;右边工具只能生成后缀为.a的静态库,开发语言不可选(只能是OC)
说了辣么多,到底我们该选哪个呢?
其实上文我已经给出答案:"项目中如果使用了自制的动态库,不能被上传到AppStore",所以实际开发中我们常用的是右边的工具(Cocoa Touch Static Library)来自定义静态库,当然了这也并不绝对下文我会告诉你如何使用Cocoa Touch Framework 制作静态库顺利上传AppStore。

2.1如何自定义.a静态库

  • 创建项目时,选择Framework&Library-->Static Library
轻松玩转自定义ios库_第2张图片
Paste_Image.png
  • 编写核心代码(例子如下)
轻松玩转自定义ios库_第3张图片
Paste_Image.png
  • 编译静态库前,将头文件暴露出去
轻松玩转自定义ios库_第4张图片
Paste_Image.png
  • 选择模拟器/真机分别编译(原因如下)
    知识点补充:
  • 设备的CPU架构
    • 不同的设备使用的CPU是不同的
    • CPU的不同造成使用的CPU架构(指令集)不同
  • 静态库有其支持的CPU架构
    • 如果静态库在不支持的CPU架构上运行就会报错
  • 模拟器使用的CPU架构
    • iPhone4s-iPhone5 : i386
    • iPhone5s-iPhone6plus : x86_64
  • 真机使用的CPU架构
    • iPhone3gs-iPhone4s : armv7
    • iPhone5-iPhone5c : armv7s
    • iPhone5s-iPhone6plus : arm64
    • 唯一特殊:只要支持armv7的静态库可以在armv7s上正常运行
  • 综上:
    暂且不考虑真机和模拟器共存,仅仅当我们决定好在某一环境下使用时,最好在这个环境下编译一次处处运行吧!操作如下:
轻松玩转自定义ios库_第5张图片
Paste_Image.png

注意:
观察编译前后:


轻松玩转自定义ios库_第6张图片
Paste_Image.png
Paste_Image.png

让我们进入里面一探究竟!

轻松玩转自定义ios库_第7张图片
Paste_Image.png
Paste_Image.png

从里面内容我们也可以发现我们编译是在调试(Debug)模式下,并且是区分设备的,此时显示时的是Phone模拟器 => 验证了我们之前的说法,编译创建的库是分设备(架构)的。

之前我们考虑好了各个环境下都应该是一次编译处处运行,是时候该考虑模拟器和真机通用的时候了,模仿模拟器的编译过程我们当然首先也要编译生成一个真机架构下的库

轻松玩转自定义ios库_第8张图片
Paste_Image.png

再次进入库


轻松玩转自定义ios库_第9张图片
Paste_Image.png

两个库!!不可能一次拖两个库吧!!让我们来合并一下他们好了。
终端命令补充:

  • 查看静态库支持的架构
    • lipo -info 静态库
  • 合并静态库
    • lipo -create 静态库1 静态库2 -output 合并的静态库

为了验证我们合并是否成功,我们先分别查看他们所支持的架构:
先看真机的:

轻松玩转自定义ios库_第10张图片
Paste_Image.png

再看模拟器:

轻松玩转自定义ios库_第11张图片
Paste_Image.png

接下来进入最激动人心的时刻:合并

轻松玩转自定义ios库_第12张图片
Paste_Image.png

合并成不成功,验证一下就可以了

轻松玩转自定义ios库_第13张图片
Paste_Image.png

恭喜你,还差最后一步
生成了一个指定的合并库,总不能就直接拖它进入你的项目吧(库是看不到源码的,你知道怎么使用??这下你该知道头文件暴露的好处了吧,暴露了你就应该把它和你新生成的库存放在同一个文件夹下呀!!!)具体操作如下

轻松玩转自定义ios库_第14张图片
Paste_Image.png

最后试试你的库到底好不好使(测试下自己会不会用)


轻松玩转自定义ios库_第15张图片
Paste_Image.png

2.2如何自定义.Framewor静态库
声明:默认情况下利用Cocoa Touch Framework 制作的库为动态库,动态库虽然能在模拟器下正常使用,但是不能上传AppStore,故我在这里不做深入介绍。其制作过程几乎与制作.a静态库一样。

一.编译.framework静态库

  • 创建项目时,选择Framework&Library-->Frameword
轻松玩转自定义ios库_第16张图片
Paste_Image.png
  • 默认创建的项目中有一个主头文件,可以将其他头文件在该头文件中import一下
轻松玩转自定义ios库_第17张图片
Paste_Image.png
  • 编写核心代码
  • 编译库前,将头文件都暴露出去
轻松玩转自定义ios库_第18张图片
Paste_Image.png
  • 分别设置好模拟器和真机环境下都适配
轻松玩转自定义ios库_第19张图片
Paste_Image.png
  • 将库设置为编译生成静态库!!!
轻松玩转自定义ios库_第20张图片
Paste_Image.png
  • 再进入库内部文件,去合并两个库,具体操作和生成静态库一致,这里就不在赘述。

3实际开发中如何自定义库
1.直接新建一个库,写代码 -> 编译 -> 合并 -> 好了??文件一多,你能确保百分百正确?故这种方式不可取!!
2.将两个程序,一个测试,一个写库。。。可以,只要你不嫌麻烦!!
3主流:边开发边调试静态库
操作如下:

轻松玩转自定义ios库_第21张图片
Paste_Image.png

接下来操作与常规开发一致,当确保库无误之后,切换编译Target,转为库,再分别编译 => 合并

注意:
1.如果制作的是动态库的话,一定要embeded binaries中将库导入一下,
2.如果编译的静态库中有分类的话必须在 Build Settings --> Other Linker Flags 中加 -Objc 如果还崩溃,还得加上 -all_load

3.关于在静态库中添加资源,一般使用的是bundle文件夹,如何创建呢?很简单先创建一个文件夹,然后将所需资源扔进去,最后将文件夹名称加上后缀bundle就ok了。***注意,默认的静态库编辑是不会将bundle一起编译进去的,所以这个文件夹需要我们手动添加到使用静态库的工程中去。
4.如果在swift中使用OC动态库,可不用建立桥接文件
5.用swift建立动态库:记得类和方法需要public 或open 具体看需求

4.关于库的那些坑!
1添加自定义动态库位置得手动添加!!!


轻松玩转自定义ios库_第22张图片
Paste_Image.png

修改如下:

轻松玩转自定义ios库_第23张图片
Paste_Image.png

2.合并库后的取名注意不要随便取,尽量与原库名一致,否则一致报错

轻松玩转自定义ios库_第24张图片
Paste_Image.png

(对了,如果你想提升用户体验,那么你真正用到项目中的编译好的静态库其实只要支持真机的架构就行,那样app的占用空间会相对很小)

你可能感兴趣的:(轻松玩转自定义ios库)