在WWDC2014大会之前是不允许使用动态库,在wwdc2014大会上,苹果对ios8开放了动态库挂载,通过动态库来实现热更新,现在貌似已经不能通过审核了,这里推介一个滴滴大神写的 JSpatch ,话不多说,直奔主题。
创建iOS动态库
打开Xcode,左上角选择File->New->Project...
编码工作,在这里我简单的写了一个MyTest的类,并写一个log方法
把你创建的MyTest类的.h 添加上去,方便后边引用只引用只一个类就行。
设置开放的头文件:Framework中有些类可能是一些私有的辅助工具,不需要使用者看到,在这里只需要把开放出去的类放到Public下, 如图把Project里的MyTest.h拖到Public里,Public都是对外暴露的.h文件
到这可以说一个简单的framework就已经完成了。但是,但是,但是我们要做一个高大上的通用动态库,不仅仅自己使用,可以分享给别人使用,逼格瞬间提升了好多,有木有!
制作通用动态库
那我们该怎样制作一个通用的动态库呢? 简单的方法是分别生成模拟器和真机上运行的库,然后在合并,这个方法,在每次生成动态库的时候,过程都会很繁琐,下面我们用一个脚本来自动完成它。Xcode 左上角Fiel ->New->Target...
脚本内容如下:
之后我们运行程序,需要注意的一点事,如果要支持64位,需要在编译选项中设置,如下:
到此时,我们的framework库文件就制作完成,在xcode的window->projects中选中我们的这个项目,点击进入文件夹的小箭头:
在build->product中便可以找到我们的framework文件,我们将其赋值出来即可以使用了
一个framework就制作完成了。
测试
新建个项目,添加刚才弄好的MyFirstFramework.Framework 。这里注意一下,在下图把MyFirstFramework.Framework添加上去,不然会运行崩溃。
我们引用一下,调用方法,可以使用。
**Xcode7 制作通用静态库 **
在上面的基础上只要修改一个参数即可生成静态库。
运行一下,复制出来就可以使用了。使用静态库的话,就可以把Framework从‘Embedded Binaries’中删除了。
如何在 Xcode 工程中添加动态库(Dynamic Library)。
首先我们知道,对于 “.a 静态库” 和 “静态 framework”,直接把相关文件拖拽到工程中,并勾选 Copy if needed 选项即可,无需其它额外的设置;
而对于添加“动态 framework”,稍微比较麻烦,主要有以下几种方式。
PS:我们这里说的“添加动态库”是指第三方动态库,而不是像 UIKit.framework、Foundation.framework 或者 libc++ 等系统自带的动态库,对于它们的依赖添加很简单,直接在 General ->Linked Frameworks and Libraries 中点击加号搜索添加即可。
在 Xcode 工程中选中 app 对应的 target,然后在 General ->Embedded Binaries 下点击加号,如图 1,在d出的窗口选择 Add Other…,最后在 Finder 中选择你要添加的“动态 framework”,并勾选 Copy if needed 即可。需要注意的是,你不能直接在 Finder 中把 .framework 文件拖拽到 Embedded Binaries 中,否则会报错。
关于手动添加动态库的更多细节以及遇到问题的解决办法,可参考苹果官方的教程: 《Embedding Frameworks In An App》
但是!这种方式看似很方便,其实有个坑是:我们上一条小集提到,一般动态二进制文件都会包含很多处理器架构,例如:i386, x86_64, armv7, armv7s, arm64 等,然后 Xcode 在编译链接时,对动态二进制文件是直接拷贝到 .ipa 包中,并不会像链接静态库那样筛选掉未用到 architecture,而苹果又不允许把包含 i386, x86_64 等模拟器架构的包上传到 App Store Connect 后台,会报错。因此,我们在打 Release 正式包时往往需要手动通过 lipo 命令或者编写脚本移除掉这些 Invalid Architectures。(除非你的开发工程只通过真机来调试,不准备在模拟器里运行,且添加的动态库刚好又不包含 i386、x86_64)
对于通过 Carthage 集成的第三方库,在 Cartfile 文件中添加好依赖后,然后执行 carthage update 命令会帮我们生成一个个“动态 framework”,例如 AFNetworking.framework、SDWebImage.framework 等,然后把它们拖拽到工程中的 General ->Linked Frameworks and Libraries ,然后在配置相关拷贝脚本和命令,详细可参考 Carthage 的 Quick Start 教程。
这里有个关键 *** 作是,需要在 Xcode 工程的 Build Phases 中添加一个执行脚本(New Run Script Phase),并在脚本中执行如下命令:
如图 2 所示:
该命令的作用大概就是,在打包拷贝动态库时自动帮我们移除掉其中的 i386、x86_64。
同样地,通过 CocoaPods 集成动态库时,也会在工程中自动帮我们添加一个 Shell 脚本用于做这件事,如图 3 中的 [CP] Embed Pods Frameworks,
大家可以自行查阅该 Pods-xxx-frameworks.sh 脚本的内容,里面有个函数 strip_invalid_archs() 就是用于在打包时移除无用的处理器架构,如图 4:
因此,我们可以把自己开发的或者他人提供的动态 framework,通过 CocoaPods 来集成到工程中:创建一个 Pods 私有 git 库(相信大家已经很熟悉了),在 git 库中添加相关动态 .frameworks 文件,然后其 Podspec 文件的写法大致如图 5 所示,最后在你的工程中 pod install 即可。
最后我们思考一个问题:“静态 framework” 和 “动态 framework” 在使用上似乎也没什么不同,而工程添加 “动态 framework” 又比较繁琐,那么在 iOS/macOS 开发中什么情况下会使用动态库呢?
1,打开项目的TARGETS
2,选择Build Phases选项
3,选择Link Binary With Libraries, 如下图
4, 点击Link Binary With Libraries 左下角 + 号,d出framework搜索框,如下图
5,搜索或选择自己要添加的 framework, 点击右下角add即可,或点击add Other, 添加其他外部framework
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)