我找到了一个在 Swift 框架中成功使用 CommonCrypto 的 GitHub 项目:SHA256-Swift。此外,这篇关于sqlite3 相同问题的文章也很有用。
基于以上,步骤如下:
1)在项目目录中创建一个CommonCrypto
目录。在其中,创建一个module.map
文件。模块映射将允许我们将 CommonCrypto 库用作 Swift 中的模块。它的内容是:
module CommonCrypto [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/usr/include/CommonCrypto/CommonCrypto.h"
link "CommonCrypto"
export *
}
2) 在 Build Settings 中,在Swift Compiler - Search Paths中,将CommonCrypto
目录添加到Import Paths ( SWIFT_INCLUDE_PATHS
)。
3) 最后,在您的 Swift 文件中导入 CommonCrypto 和任何其他模块一样。例如:
import CommonCrypto
extension String {
func hnk_MD5String() -> String {
if let data = self.dataUsingEncoding(NSUTF8StringEncoding)
{
let result = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))
let resultBytes = UnsafeMutablePointer<CUnsignedChar>(result.mutableBytes)
CC_MD5(data.bytes, CC_LONG(data.length), resultBytes)
let resultEnumerator = UnsafeBufferPointer<CUnsignedChar>(start: resultBytes, length: result.length)
let MD5 = NSMutableString()
for c in resultEnumerator {
MD5.appendFormat("%02x", c)
}
return MD5
}
return ""
}
}
限制
在另一个项目中使用自定义框架在编译时失败并出现错误missing required module 'CommonCrypto'
。这是因为 CommonCrypto 模块似乎没有包含在自定义框架中。一种解决方法是在使用框架的项目中重复步骤 2(设置Import Paths
)。
模块映射不是独立于平台的(它当前指向一个特定的平台,iOS 8 模拟器)。我不知道如何使标题路径相对于当前平台。
iOS 8 的更新 <= 我们应该删除行链接 "CommonCrypto",以获得成功的编译。
更新/编辑
我不断收到以下构建错误:
ld:未找到用于架构 x86_64 的 -lCommonCrypto 的库 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
除非我link "CommonCrypto"
从module.map
我创建的文件中删除了该行。一旦我删除了这条线,它就构建好了。