web-dev-qa-db-ja.com

キーチェーンのテスト-OSStatusエラー-34018

Xcodeで基本的なSenTestフレームワークを使用して、キーチェーンを読み取って変更するコードをテストしようとしています。コードはデバイス上では正常に機能しますが、テストを開始すると、SecItemDelete/SecItemAdd/etcでキーチェーンに触れるたびにこれらのエラーが発生します。

The operation couldn’t be completed. (OSStatus error -34018 - client has neither application-identifier nor keychain-access-groups entitlements)

一致するワイルドカードプロビジョニングプロファイル(iOS Team Provisioning Profile: *)ビルドターゲットとテストターゲットの両方。

これらの(未確認の)スタックオーバーフローの答え:

キーチェーンから読み取った結果、errSecItemNotFound 253

キーチェーンを使用するたびにアプリ識別子に一致するプロビジョニングプロファイルが必要ですが、それは正しくないか、テストターゲット以外で同じエラーが発生します。

より深く掘り下げると、(未確認の)答えはここにあります:

SecItemAddおよびSecItemCopyMatchingはエラーコード-34018(errSecMissingEntitlement)を返します

キーチェーン内、より一般的にはSecurity.framework、それは率直に恐ろしいです。

私の質問は誰かがテストターゲットにいたときにOSStatusエラー-34018onlyをヒットしましたか?それは私が見ている行動のようです。

編集:追加 この答え その JorgeDeCorte 以下の彼の答えで使用されています。

問題がユニットテストのターゲットで終了した場合、このスレッドには解決策が含まれているようです。

https://devforums.Apple.com/message/917498#917498

基本的に、テストターゲットに以下を実行スクリプトとして追加して、.xcttestフォルダーをコード署名する必要があります。

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

デバイスでキーチェーンをテストすると、多くの-34018エラーが発生し、これを修正することができました。

テストターゲットに問題が存在しない場合、これはおそらく解決策ではありません。

だから私は解決策だと思う:テストターゲットに強制的に署名する。

41
Andrew

あなたの質問に答えるには:はい、私は同じ問題を経験します。私のアプリを実行するとき、それはうまくいくようです。しかし、デバイスでXCTestsを実行すると、キーチェーンがエラー-34018を返すようです。奇妙なことは、シミュレータでテストを実行するときにそれが起こらないということです。

編集:私は説明した解決策を見つけました この回答では

6
JorgeDeCorte

Grand Central Dispatchを介してキーチェーン操作を実行しようとすると、このエラーが発生しました。 メインスレッドでキーチェーン(またはキーチェーンラッパー)をインスタンス化する方法を見つけます。

//results in code -34018
   static dispatch_once_t token;
    dispatch_once(&token, ^{
        keychain = [[KeychainWrapper alloc] init];

    });

//works fine
keychain = [[KeychainWrapper alloc] init];
4
Alex Stone

.xctestバンドルの共同設計は、場合によっては思ったほど簡単ではありません。主にJorgeDeCorteは、彼の answer として与えられた短い線がRun Scriptはほとんどの開発者にとって十分です。

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

ただし、キーチェーンに複数の証明書がある場合、次の行で失敗します

iPhone Developer: ambiguous (matches "iPhone Developer: Your Name (ABC123DEF45)" and "iPhone Developer: Your Name (123ABC456DE)"

複数の証明書がある場合でも正しい証明書を取得するためのソリューションは、この短いスクリプトです。確かにこれは理想的ではありませんが、私の知る限り、Xcodeが見つけて.appの署名に使用する証明書を取得する機会はありません。

echo "codesign --verify --force --sign \"$CODE_SIGN_IDENTITY\" \"$CODESIGNING_FOLDER_PATH\""
IDENTITIES=`security find-identity -v -s "Code Signing" | grep "iPhone Developer" | awk '{ print $2 }'`

for SHA in $IDENTITIES; do
    codesign --verify --force --sign $SHA "$CODESIGNING_FOLDER_PATH"
    if [ $? -eq 0 ]; then
        echo "Matching identity found: $SHA"
        exit 0
    fi
done;

exit 1
1
Patrik

「OSStatusエラー-34018」も表示されます。プロビジョニングプロファイルを再作成して解決しました。

1
vomako

キーチェーンに関係するテストも実行できませんでした。

私のために働いたのはテスト用の「ホストアプリケーション」を追加することでした。プロジェクトターゲットに行き、「MyTestTarget」をタップし、「一般」タブをクリックして「ホストアプリケーション」を選択します。 」ドロップダウン付き。

CocoaTouch Frameworkをテストしていたため、ホストアプリケーションはありませんでした。テスト用に1つ(例: "MyFrameworkTestApp")を作成する必要がありました。

それでも解決しない場合は、「MyFrameworkTestApp」ターゲットの「機能」タブに移動して、「キーチェーン共有」機能を有効にしてみてください。

0
kgaidis