如何将 CommonCrypto 用在一个 Swift Framework 中

最近在做签名及解密的相关内容,需要用到 CommonCrypto 这个系统库,由于苹果官方并没有为这个库做 Swift 的桥接,你要用的时候得找到你的 YourApp-Bridging-Header.h ,写上 #import <CommonCrypto/CommonCrypto.h>就完事了。我做测试的时候也是这么干的。但实际集成的时候需要把代码移到公司公用的 Framework 中,于是想当然地觉得把 import 放到 YourFramework.h 的头文件中就完事了。但是一但编译就会收到 Include of non-modular header inside framework module 'YourFramework' 的错误。找了很多解决方法,但是大多需要手动集成一些文件。但可这是 Framework 啊,直接 pod install 就能用才 cool。

不久之后在 Github 上发现了 CommonCrypto.swift 这个库,一样用 Swift ,一样用了 CommonCrypto 这个系统库,关键是,人家可以自动部署!勤快人可以去研究一下他的库,懒人就可以直接看结果了。

首先在你的 Framework/Target 下建一个文件夹,可以叫做 CommonCrypto ,并新建一个 module.modulemap 的文件,内容如下:

1
2
3
4
module CommonCrypto {
header "/usr/include/CommonCrypto/CommonCrypto.h"
export *
}

然后在你的 Target 的 Build Setting 中找到 Swift ComCompiler - Search PathsImport Paths ,键值修改为 ${SRCROOT}/CommonCrypto

最后到你的 YourFramework.podspec 中增加如下的内容,路径请仔细核对,确保能够正确引用:

1
2
s.xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/YourFramework/YourTarget/CommonCrypto' }
s.preserve_paths = 'YourTarget/CommonCrypto/module.modulemap'

搞定!So Easy!


更新 2016-5-19

今天代码被正式合并到公共库中,但是问题很快就来了。有同事反应,不能找到该路径 /usr/include/CommonCrypto/CommonCrypto.h,但是又有别的同事说没问题,但是打包机上也出现了找不到该路径的问题。So, What happened ?

其实这一系列的头文件是由 Xcode Command Line Tools 部署的,在终端中执行以下命令,可以快速完成该工具的安装,以后的更新会自动由 Mac App Store 为你完成。

1
xcode-select --install

当然如果你已经安装了该工具,就会收到如下的错误反馈:

1
xcode-select: error: command line tools are already installed, use "Software Update" to install updates