CommonCryptoをSwiftフレームワークにインポートする


184

CommonCryptoiOSのSwiftフレームワークにどのようにインポートしますか?

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

純粋なObjective-Cコードベース、純粋なSwiftコードベース、または混合言語コードベースを持つ外部フレームワークをインポートできます。外部フレームワークをインポートするプロセスは、フレームワークが単一の言語で記述されていても、両方の言語のファイルが含まれていても同じです。外部フレームワークをインポートするときは、インポートするフレームワークの定義モジュールのビルド設定が[はい]に設定されていることを確認してください。

次の構文を使用して、フレームワークを別のターゲット内の任意のSwiftファイルにインポートできます。

import FrameworkName

残念ながら、インポートCommonCryptoは機能しません。#import <CommonCrypto/CommonCrypto.h>アンブレラヘッダーへの追加も行いません。


CommonCryptoはCベースのフレームワークであり、Objective-Cフレームワークではありません。
rmaddy 2014

1
@rmaddy Objective-CはCスーパーセットです。SwiftのCommonCryptoは使用できないとおっしゃっていますか?
hpique 2014

4
@rmaddyモジュールマップを使用してCommonCryptoを機能させることができました。私は解決策を磨き、それを今日後で投稿します。
hpique 2014

あなたが便利だと思って、あなたが探しているものがすでに実装されているなら、CryptoSwiftを
Marcin

1
AppleはオープンソースのCommonCryptoをオープンしました。ソースがあれば実行できるかもしれません。
eyeballz 2015年

回答:


137

もう少し簡単で堅牢な方法は、スクリプトの実行フェーズで「CommonCryptoModuleMap」という集約ターゲットを作成し、モジュールマップを自動的に生成し、正しいXcode / SDKパスを使用することです。

ここに画像の説明を入力してください ここに画像の説明を入力してください

スクリプトの実行フェーズには、次のbashが含まれている必要があります。

# This if-statement means we'll only run the main script if the CommonCryptoModuleMap directory doesn't exist
# Because otherwise the rest of the script causes a full recompile for anything where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger the rest of the script to run
if [ -d "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap" ]; then
    echo "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap directory already exists, so skipping the rest of the script."
    exit 0
fi

mkdir -p "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap"
cat <<EOF > "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap/module.modulemap"
module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
EOF

シェルコード${SDKROOT}を使用するxcode-selectと、特にシステム間で異なるXcode.appパスをハードコーディングする必要がないことを意味します。特に、ベータバージョンに切り替える場合、または複数のバージョンがインストールされているCIサーバーでビルドしている場合非標準の場所で。また、SDKをハードコーディングする必要もないので、これはiOS、macOSなどで機能します。プロジェクトのソースディレクトリに何かを置く必要もありません。

このターゲットを作成した後、ライブラリ/フレームワークがターゲット依存関係アイテムでそれに依存するようにします。

ここに画像の説明を入力してください

これにより、フレームワークがビルドされる前にモジュールマップが生成されます。

macOSに関する注意:サポートしmacOSている場合はmacosxSupported Platforms作成したばかりの新しい集約ターゲットのビルド設定に追加する必要があります。そうしないと、モジュールマップが正しいDebug派生データフォルダーに残りません。フレームワーク製品。

ここに画像の説明を入力してください

次に、モジュールマップの親ディレクトリを${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMapSwiftセクション(SWIFT_INCLUDE_PATHS)の下の「インポートパス」ビルド設定に追加します。

ここに画像の説明を入力してください

$(inherited)プロジェクトまたはxcconfigレベルで検索パスが定義されている場合は、必ず行を追加してください。

これで終わりです。これで、 import CommonCrypto

Xcode 10のアップデート

Xcode 10にはCommonCryptoモジュールマップが同梱されており、この回避策は不要です。Xcode 9と10の両方をサポートする場合は、スクリプトの実行フェーズでモジュールマップが存在するかどうかを確認できます。たとえば、

COMMON_CRYPTO_DIR="${SDKROOT}/usr/include/CommonCrypto"
if [ -f "${COMMON_CRYPTO_DIR}/module.modulemap" ]
then
   echo "CommonCrypto already exists, skipping"
else
    # generate the module map, using the original code above
fi

8
この答えが一番です。シンプルでエレガント
Abdullah Saeed 2017年

1
これはゲームに遅れますが、これが選択された答えになるはずです。これはシンプルで、同じプロジェクトに取り組んでいる他の開発者が要件を確認する方が簡単です。
fatuous.logic

1
すばらしい答えです。ありがとう!
クラウスブッセ2017

1
.frameworkでこれを行う場合、このフレームワークを含めるプロジェクトでも同じようにする必要がありますか?
Ravi Kiran 2017

2
@IanDundas上記のコードを更新して、再コンパイルの問題の修正と、macOSでこれを使用するための修正を
追加しました

91

実際に「機能する」ソリューションを構築できます(ここで他のソリューションで必要なように、module.modulemapSWIFT_INCLUDE_PATHS設定をプロジェクトにコピーする必要はありません)。ただし、ダミーのフレームワーク/モジュールを作成する必要があります。適切なフレームワークにインポートします。我々はまた、(それがプラットフォームに関係なく動作することを確認することができiphoneosiphonesimulatorまたはmacosx)。

  1. 新しいフレームワークターゲットをプロジェクトに追加し、システムライブラリにちなんだ名前を付けます(例: "CommonCrypto")。(アンブレラヘッダーCommonCrypto.hを削除できます。)

  2. 新しい追加の構成設定ファイルを、それを名前を付け、例えば、「CommonCrypto.xcconfig」。(ターゲットが含まれているかどうかを確認しないでください。)以下を入力します。

    MODULEMAP_FILE[sdk=iphoneos*]        = \
        $(SRCROOT)/CommonCrypto/iphoneos.modulemap
    MODULEMAP_FILE[sdk=iphonesimulator*] = \
        $(SRCROOT)/CommonCrypto/iphonesimulator.modulemap
    MODULEMAP_FILE[sdk=macosx*]          = \
        $(SRCROOT)/CommonCrypto/macosx.modulemap
  3. 上記の3つの参照モジュールマップファイルを作成し、それらに以下を入力します。

    • iphoneos.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }
    • iphonesimulator.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }
    • macosx.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }

    (ベータ版を実行している場合は、「Xcode.app」を「Xcode-beta.app」に置き換えます。ElCapitanを実行して10.11いない場合は、現在のOS SDKに置き換えます。)

  4. 上の情報プロジェクト設定のタブの下に設定、設定のデバッグリリースの構成CommonCryptoをするCommonCrypto(参照CommonCrypto.xcconfig)。

  5. フレームワークターゲットの[ ビルドフェーズ ]タブで、CommonCryptoフレームワークをターゲットの依存関係に追加します。さらに、libcommonCrypto.dylibリンクバイナリとライブラリのビルドフェーズに追加します。

  6. ProductsCommonCrypto.frameworkを選択し、ラッパーのターゲットメンバーシップOptionalに設定されていることを確認します。

これimport CommonCryptoで、ラッパーフレームワーク内でビルド、実行、実行できるはずです。

例として、SQLite.swiftがダミーのsqlite3.frameworkを使用する方法を参照してください。


4
ステップ(5)がなくても機能します。それを私は、ビルドエラーを取得:ld: cannot link directly with /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.2.sdk/usr/lib/system/libcommonCrypto.dylib. Link against the umbrella framework 'System.framework' instead. for architecture x86_64
stannie

4
優れた!これを使用してgithub.com/soffes/Cryptoを作成しましたが、リンクする必要はありませんでしSystem.frameworkた。注目に値するのは、フレームワークがクロスプラットフォームの場合は、MacとiOS用に別個のラッパーフレームワークを作成する必要があることです。
Sam Soffes 2015

32
どのように、またはどこで人々はこのようなものを見つけますか?
ホラ2015

5
注意事項として、ステップ1で言語としてObjective-Cを選択する必要があることを明確にします。これは簡単に見落とされます。また、多分私はは.dylibを持っていなかったので、私はステップ5で.frameworkを追加するために必要な
テオサルトーリ

7
これは恐ろしいことです。Xcodeの動物園でそれぞれが異なる方法で分割されており、ヘッダーへの絶対パスがいたるところにあると、起動しやすくなります。クパチーノ、または少なくともこのモジュールマップの混乱を担当している人との間で何かがひどく間違っている
Anton Tropashko

82

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モジュールがカスタムフレームワークに含まれていないように見えるためです。回避策はImport Paths、フレームワークを使用するプロジェクトでステップ2(設定)を繰り返すことです。

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

iOS 8の更新<= コンパイルを成功させるには、「CommonCrypto」という行リンクを削除する必要があります。

更新/編集

次のビルドエラーが何度も発生しました。

ld:アーキテクチャx86_64の-lCommonCryptoのライブラリが見つかりませんclang:エラー:リンカーコマンドが終了コード1で失敗しました(-vを使用して呼び出しを確認してください)

作成link "CommonCrypto"したmodule.mapファイルから行を削除しない限り。この行を削除すると、問題なく構築されました。


30
ああ、アップルは確かに物事を困難にしたいと考えています。このすべてのBSを経由せずにファイル/フレームワークをインポートできるようにするには、Swiftを殺しますか?
zaph

4
$SDKROOT変数はプラットフォームにとらわれないパスを可能にするはずなので、これは腹立たしいですが、私はSwiftでそれを取得する方法がわかりません。
danimal 2014年

2
私にとってはlink "CommonCrypto"、module.mapファイルからを削除するまで機能しませんでした。
Teo Sartori

1
Xcode 7.3で動作していることを誰かが確認できますか?このソリューションは、更新後に機能しなくなりました。
Nikita Kukushkin

1
修正:シミュレータ用にビルドすると正常に動作しますが、iOS 9.3デバイス用にビルドすると、「ld:ライブラリがアーキテクチャーarm64の-lCommonCryptoに見つかりません」
Nikita Kukushkin

50

この回答では、フレームワーク内で、CocoapodsとCarthageを使用して機能させる方法について説明します

🐟modulemapアプローチ

私が使用しmodulemapCommonCryptoのまわりで私のラッパーにhttps://github.com/onmyway133/arcanehttps://github.com/onmyway133/Reindeer

を取得しているheader not found場合は、https://github.com/onmyway133/Arcane/issues/4を確認するか、実行してくださいxcode-select --install

  • CCommonCrypto含むフォルダを作成しますmodule.modulemap

      module CCommonCrypto {
        header "/usr/include/CommonCrypto/CommonCrypto.h"
        export *
      }
  • ビルド設定->パスのインポートに移動します

      ${SRCROOT}/Sources/CCommonCrypto

module modulemapアプローチによるCocoapods

🐘パブリックヘッダーアプローチ

publicパブリックヘッダーアプローチのCocoaPods

🐝興味深い関連記事


1
うわー!驚いたことに、以前のmodulemapファイルが多くの問題を引き起こしていたときに、トップのアプローチ(module.modulemapファイルの作成)からのヘッダーパスはうまく機能しました。XCodeの名前を変更した人が手動で変更する必要がある/CommonCrypto/CommonCrypto.h内への絶対パスを含むmodule.modulemapファイルを使用して、しばらくの間これに苦労していましたApplications/XCode.app/Contents/Developer/Platforms/iPhoneOS....。確認するためにその行を切り替えることは"/usr/include/CommonCrypto/CommonCrypto.h"、いくつかのXCodeバージョンを持つチームにとってはうまくいくようです。どうもありがとうございます!
ナタリア2017年

3
ポッドを作成して、SWIFT_INCLUDE_PATHSとpreserve_pathsを設定しました。を実行pod lib lintしましたが、ビルドがエラーで失敗しました:そのようなモジュール「CommonCrypto」はありません。どうすれば対処できますか。
クラインミオケ2017年

1
問題とは関係ありませんが、弾丸として絵文字を使用するのが好きです!😊
Fomentia

2
@ onmyway133で置き換える$(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCryptoと、ローカル開発ポッドを使用できます$(PODS_TARGET_SRCROOT)/Sources/CCommonCryptoPODS_TARGET_SRCROOTローカルポッドに対して正しく設定されています。
Orkhan Alikhanov

すばらしい答え、私の命を救った!100万人に感謝
ハッサンシャーバジ

45

朗報!Swift 4.2(Xcode 10)がついにCommonCryptoを提供します!

import CommonCryptoSwiftファイルに追加するだけです。


素晴らしいニュース!ドキュメントへのリンクを追加できますか?
Kryštofマテイ

ドキュメントへのリンクがありません。回避策の1つがあるプロジェクトをXcode 10でコンパイルしようとしたときにこれを発見しました。2つのCommonCryptoモジュールが見つかるとの不満があったため、Appleが回避策を削除すると、ほら!本当だった。私はそれについてつぶやき、それが意図されていることを確認するためにアップルのエンジニアが返信しました。
mxcl 2018年

1
App Storeで利用可能なアップデートとして9.4.7のみが表示されていますが、Xcode 10はどのように入手しましたか?
Hammad Tariq

1
ささいなグーグル検索があなたに言ったであろうように、それはベータ版です。
mxcl 2018年

1
@SomoyDasGuptaはい。以前のインポートを削除して、再度コンパイルするだけです。つまり、MikeWellerの回答からの手順を実行する必要はありません
COLD ICE

7

警告:iTunesConnect は、この方法を使用しているアプリを拒否する場合があります。


私のチームの新しいメンバーが、トップの回答の1つによって与えられたソリューションを誤って破ったので、CommonCryptoModuleと呼ばれる小さなラッパープロジェクトに統合することにしました。手動またはCocoapods経由でインストールできます。

pod 'CommonCryptoModule', '~> 1.0.2'

次に、必要CommonCryptoなモジュールを必要な場所にインポートするだけです。

import CommonCryptoModule

他の誰かがこれが便利だと思うことを願っています。


警告:この方法を使用すると、アプリケーションは拒否されます!
セガボンド2018年

そうです、この方法を使用して数か月間問題なくアップロードしていたので、非常に奇妙なことに、拒否されました。
Nikita Kukushkin

5

私はマイク・ウェラーの素晴らしい仕事に改善があったと思います。

Compile Sourcesこのbashを含むフェーズの前に、スクリプトの実行フェーズを追加します。

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework directory doesn't exist because otherwise
# the rest of the script causes a full recompile for anything
# where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger
# the rest of the script to run

FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
cat <<EOF > "${FRAMEWORK_DIR}/Modules/module.modulemap"
module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
EOF

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

このスクリプトは、module.mapを適切な場所に置いて最小限のフレームワークを構築し、Xcodeの自動検索に依存します BUILT_PRODUCTS_DIRフレームワークます。

オリジナルのCommonCryptoインクルードフォルダーをフレームワークのヘッダーフォルダーとしてリンクしたので、結果はObjective Cプロジェクトでも機能するはずです。


CocoaPodsでの使用をカバーする改善点については、dvdblkの回答を参照してください。
jjrscott


4

@mogstadは、@ stephencelisソリューションをCocoapodでラップするのに十分親切です。

ポッド「libCommonCrypto」

利用可能な他のポッドが機能しませんでした。


4

modulemapソリューションは優れている可能性があり、SDKの変更に対して堅牢ですが、実際に使用するのは厄介であり、物事を他の人に渡す場合ほど信頼性が高くありません。それをもっと簡単にできるようにするために、私は別の方法で行きました:

ヘッダーをコピーするだけです。

私は知っています、壊れやすいです。しかし、AppleがCommonCryptoに大幅な変更を加えることはほとんどありません。私は、CommonCryptoを最終的にモジュラーヘッダーにすることなく、重要な変更を加えないという夢を生きています。

「ヘッダーをコピーする」とは、「プリプロセッサーが行うように、必要なすべてのヘッダーをプロジェクトの1つの大きなヘッダーにカットアンドペーストする」ことを意味します。コピーまたは適応できるこの例として、RNCryptor.hを参照してください

これらのファイルはすべてAPSL 2.0でライセンスされており、このアプローチは著作権とライセンスの通知を意図的に維持していることに注意してください。私の連結手順はMITでライセンスされており、次のライセンス通知までしか適用されません)。

これが美しいソリューションであると言っているわけではありませんが、これまでのところ、実装とサポートの両方にとって非常にシンプルなソリューションであるようです。


これは確実にコンパイルできることがわかりました。フレームワークを使用するアプリケーションは特別なものにリンクする必要がありますか、それともCommonCryptoは常に利用可能ですか?
codeingFriend1 2017

1
Security.frameworkは自動的にリンクされていると思います(新しいプロジェクトを開始してから少し時間がかかります)。エラーが発生した場合、それはリンクするフレームワークです。
Rob Napier

これは最も単純な解決策のように見え、1つのマシンでうまく機能しますが、別のフレームワークまたはアプリでフレームワークを使用すると、別のマシンで「モジュールがありません」エラーが発生します。
richever 2017

2

私はこれが古い質問であることを知っています。しかし、私はSwiftプロジェクトでライブラリを使用する別の方法を見つけました。これは、これらの回答で紹介されているフレームワークをインポートしたくない人には役立つかもしれません。

Swiftプロジェクトで、Objective-Cブリッジングヘッダーを作成し、Objective-CでNSDataカテゴリ(またはライブラリを使用するカスタムクラス)を作成します。唯一の欠点は、Objective-Cですべての実装コードを記述しなければならないことです。例えば:

#import "NSData+NSDataEncryptionExtension.h"
#import <CommonCrypto/CommonCryptor.h>

@implementation NSData (NSDataEncryptionExtension)
- (NSData *)AES256EncryptWithKey:(NSString *)key {
    //do something
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {
//do something
}

そして、あなたのobjective-cブリッジングヘッダーに、これを追加します

#import "NSData+NSDataEncryptionExtension.h"

そしてSwiftクラスでも同様のことを行います:

public extension String {
func encryp(withKey key:String) -> String? {
    if let data = self.data(using: .utf8), let encrypedData = NSData(data: data).aes256Encrypt(withKey: key) {
        return encrypedData.base64EncodedString()
    }
    return nil
}
func decryp(withKey key:String) -> String? {
    if let data = NSData(base64Encoded: self, options: []), let decrypedData = data.aes256Decrypt(withKey: key) {
        return decrypedData.UTF8String
    }
    return nil
}
}

期待どおりに動作します。


これは非常にスムーズに機能し、内部を内部に保つこともできます(NSData+NSDataEncryptionExtension.h公開する必要はありません)。
ラファエル

しかし、これを使用するには、どのOSフレームワークをリンクする必要がありますか?他とは異なり-私はObj-CプロジェクトでCommonCryptoを使用する必要があり、それだけでMacOS-10.13 SDKのXcode 9で壊れます
Motti Shneor

@MottiShneor 10.9以上のOSをリンクします。私は同じ環境で作業していますが、問題なく動作します。
Terence

2

ココアポッドライブラリでCommonCryptoを使用する必要がある場合に備えて、ココアポッドの魔法をjjrscottの回答に追加しました。


1)この行をpodspecに追加します。

s.script_phase = { :name => 'CommonCrypto', :script => 'sh $PROJECT_DIR/../../install_common_crypto.sh', :execution_position => :before_compile }

2)これをライブラリフォルダーまたは好きな場所に保存します(ただし、それに応じてscript_phaseを変更することを忘れないでください...)

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework directory doesn't exist because otherwise
# the rest of the script causes a full recompile for anything
# where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger
# the rest of the script to run
FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
echo "module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}" >> "${FRAMEWORK_DIR}/Modules/module.modulemap"

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

魅力のように動作します:)


ポッドスペックファイルと一緒に、デモまたはサンプルフレームワークプロジェクトを提供できますか?
Gowtham 2018

0

Xcode 9.2で何かが変更されたかどうかはわかりませんが、これを実現する方がはるかに簡単になりました。私がしなければならなかったことは、フレームワークプロジェクトディレクトリに「CommonCrypto」というフォルダーを作成し、その中に2つのファイルを作成することです。1つは「cc.h」と呼ばれます。

#include <CommonCrypto/CommonCrypto.h>
#include <CommonCrypto/CommonRandom.h>

そして別のmodule.modulemapと呼ばれます:

module CommonCrypto {
    export *
    header "cc.h"
}

(モジュールマップファイルでSDKROOT領域のヘッダーファイルを直接参照できない理由はわかりませんが、それを機能させることができませんでした)

3つ目は、「インポートパス」設定を見つけて$(SRCROOT)に設定することです。実際、ルートレベルにしたくない場合は、CommonCryptoフォルダーを任意のフォルダーに設定できます。

この後、あなたは使うことができるはずです

import CommonCrypto

すべてのSwiftファイルとすべてのタイプ/関数/など。利用可能です。

警告の言葉-ただし、アプリがlibCommonCrypto(またはlibcoreCrypto)を使用している場合、あまり高度な知識を持たないハッカーがデバッガをアプリに接続して、これらの関数に渡されているキーを見つけるのは非常に簡単です。


0

以下の問題がある場合:

ld:-lapple_cryptoのライブラリが見つかりませんclang:エラー:リンカーコマンドが終了コード1で失敗しました(-vを使用して呼び出しを確認してください)

Xcode 10では、Swift 4.0。CommonCryptoはフレームワークの一部です。

追加

 import CommonCrypto

削除する

  • リンクバイナリのCommonCrpto libファイルとビルドフェーズのライブラリ
  • import CommonCrypto ブリッジヘッダーから

これは私のために働いた!


-1

Xcodeを更新した後も同じことが起こりました。ココアポッドの再インストールやプロジェクトのクリーニングなど、できることはすべて試しましたが、うまくいきませんでした。これは、システムを再起動した後に解決されました。


-13

とても簡単です。追加

#import <CommonCrypto/CommonCrypto.h>

.hファイル(プロジェクトのブリッジヘッダーファイル)に。慣例として、YourProjectName-Bridging-Header.hと呼ぶことができます。

次に、プロジェクトのビルド設定に移動し、Swiftコンパイラ-コード生成を探します。その下で、「Objetive-Cブリッジヘッダー」エントリにブリッジヘッダーの名前を追加します。

完了です。Swiftコードにインポートは必要ありません。このブリッジヘッダーファイルにリストされているすべてのパブリックObjective-Cヘッダーは、Swiftに表示されます。


メソッドがエラーを返す:フレームワークターゲットでのブリッジヘッダーの使用はサポートされていません
gorgi93

5
@ gorgi93エラーが示すように、フレームワークターゲットでブリッジヘッダーを使用することはできません。残念ながら、唯一のオプションは、メインフレームワークのヘッダーファイルに配置することです。
Charles A.

1
このスレッドのタイトルを実際に赤にした場合、その男がCommonCryptoライブラリをSwiftフレームワークにインポートしようとしていることがわかります。フレームワークでブリッジヘッダーを使用することはできません。また、CommonCryptoフレームワークをアンブレラヘッダーにインポートすることもできません。
miken.mkndev 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.