如何CommonCrypto在 iOS 的 Swift 框架中导入?
CommonCrypto
我了解如何CommonCrypto在 Swift 应用程序中使用:您添加#import <CommonCrypto/CommonCrypto.h>到桥接头。但是,Swift 框架不支持桥接头。文档说:
#import <CommonCrypto/CommonCrypto.h>
您可以导入具有纯 Objective-C 代码库、纯 Swift 代码库或混合语言代码库的外部框架。无论框架是用一种语言编写的还是包含来自两种语言的文件,导入外部框架的过程都是相同的。当您导入外部框架时,请确保您要导入的框架的“定义模块”构建设置设置为“是”。 您可以使用以下语法将框架导入到不同目标中的任何 Swift 文件中:
您可以导入具有纯 Objective-C 代码库、纯 Swift 代码库或混合语言代码库的外部框架。无论框架是用一种语言编写的还是包含来自两种语言的文件,导入外部框架的过程都是相同的。当您导入外部框架时,请确保您要导入的框架的“定义模块”构建设置设置为“是”。
您可以使用以下语法将框架导入到不同目标中的任何 Swift 文件中:
import FrameworkName
不幸的是,导入CommonCrypto不起作用。也不会添加#import <CommonCrypto/CommonCrypto.h>到伞形标题中。
我找到了一个在 Swift 框架中成功使用 CommonCrypto 的 GitHub 项目:SHA256-Swift。此外,这篇关于sqlite3 相同问题的文章也很有用。
基于以上,步骤如下:
1)在项目目录中创建一个CommonCrypto目录。在其中,创建一个module.map文件。模块映射将允许我们将 CommonCrypto 库用作 Swift 中的模块。它的内容是:
module.map
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)。
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)。
missing required module 'CommonCrypto'
Import Paths
模块映射不是独立于平台的(它当前指向一个特定的平台,iOS 8 模拟器)。我不知道如何使标题路径相对于当前平台。
iOS 8 的更新 <= 我们应该删除行 链接 “CommonCrypto” ,以获得成功的编译。
更新/编辑
我不断收到以下构建错误:
ld:未找到用于架构 x86_64 的 -lCommonCrypto 的库 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
除非我link "CommonCrypto"从module.map我创建的文件中删除了该行。一旦我删除了这条线,它就构建好了。
link "CommonCrypto"