1. ホーム
  2. ios

[解決済み] SwiftフレームワークでCommonCryptoをインポートする

2022-04-14 19:19:05

質問

どのようにインポートするのですか? CommonCrypto を iOS 用の Swift フレームワークで使用することはできますか?

の使い方は理解しています。 CommonCrypto をSwiftアプリで使用します。 Swift アプリで #import <CommonCrypto/CommonCrypto.h> をブリッジングヘッダーに追加します。 しかし、Swiftのフレームワークはブリッジングヘッダをサポートしていません。そのため ドキュメント と書いてあります。

純粋な Objective-C コードベース、純粋な Swift コードベース、または言語混在のコードベースを持つ外部フレームワークをインポートすることができます。インポート方法は 外部フレームワークのインポート方法は、そのフレームワークが フレームワークが単一言語で書かれている場合、または両方のファイルを含んでいる場合。 言語があります。外部フレームワークをインポートするときは、そのフレームワークの インポートするフレームワークの Defines Module build 設定を を「はい」に設定してください。

フレームワークを別のSwiftファイルにインポートすることができます。 ターゲットの場合、次のような構文になります。

import FrameworkName

残念ながら、インポート CommonCrypto はうまくいきません。を追加することもできません。 #import <CommonCrypto/CommonCrypto.h> をアンブレラヘッダーに追加しました。

解決方法は?

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) ビルド設定内の Swift コンパイラ - 検索パス を追加します。 CommonCrypto ディレクトリを インポートパス ( SWIFT_INCLUDE_PATHS ).

3) 最後に、CommonCryptoを他のモジュールと同様にSwiftファイル内にインポートしてください。例えば

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(Config.xmlの設定)を繰り返すことです。 Import Paths ) を、そのフレームワークを使用するプロジェクトで使用します。

モジュールマップはプラットフォームに依存しません(現在、特定のプラットフォーム、iOS 8 Simulator を指しています)。ヘッダーパスを現在のプラットフォームからの相対パスにする方法がわかりません。

iOS 8 のためのアップデート <= 行を削除する必要があります。 リンク "CommonCrypto" を実行すると、コンパイルが正常に行われます。

UPDATE / EDIT

以下のようなビルドエラーが出続けています。

ld: アーキテクチャ x86_64 の -lCommonCrypto に対応するライブラリが見つかりませんでした。 clang: error: linker command failed with exit code 1 (use -v to see invocation) リンカーのコマンドは終了コード1で失敗しました。

という行を削除しない限り link "CommonCrypto" から module.map ファイルを作成しました。この行を削除したら、ビルドはOKになりました。