[解決済み] SwiftフレームワークでCommonCryptoをインポートする
質問
どのようにインポートするのですか?
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になりました。
関連
-
[解決済み] Xcode 6.3 - 現在の iOS Development 証明書または保留中の証明書要求がすでにあります。
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] iOS7でスタイルUITableViewStyleGroupedを持つUITableViewの上部に余分なパディングがあるのはなぜですか?
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] Objective-CでNSNotificationCenterを通してメッセージを送受信する?
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] Swiftで配列に要素を追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
iOS classic error Undefined symbols for architecture XXX:
-
[解決済み] Xcode 10でコマンドCompileSwiftが0以外の終了コードで失敗する [重複] 。
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] フレームワークを使用したiOSアプリがデバイス上でクラッシュ、dyld: ライブラリがロードされない、Xcode 6 Beta
-
[解決済み] UIViewに角丸をつける
-
[解決済み] UIDevice uniqueIdentifierは非推奨 - どうしたらいいの?
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] SwiftからC言語を呼び出すには?