小编典典

在 Swift 框架中导入 CommonCrypto

all

如何CommonCrypto在 iOS 的 Swift 框架中导入?

我了解如何CommonCrypto在 Swift 应用程序中使用:您添加#import <CommonCrypto/CommonCrypto.h>到桥接头。但是,Swift
框架不支持桥接头。文档说:

您可以导入具有纯 Objective-C 代码库、纯 Swift
代码库或混合语言代码库的外部框架。无论框架是用一种语言编写的还是包含来自两种语言的文件,导入外部框架的过程都是相同的。当您导入外部框架时,请确保您要导入的框架的“定义模块”构建设置设置为“是”。

您可以使用以下语法将框架导入到不同目标中的任何 Swift 文件中:

import FrameworkName

不幸的是,导入CommonCrypto不起作用。也不会添加#import <CommonCrypto/CommonCrypto.h>到伞形标题中。


阅读 97

收藏
2022-07-28

共1个答案

小编典典

我找到了一个在 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我创建的文件中删除了该行。一旦我删除了这条线,它就构建好了。

2022-07-28