SecItemAddが常にエラーを返す-iOS 10シミュレーターのXcode 8で-34018


103

更新:この問題はXcode 8.2で修正されました。キーチェーンは、キーチェーンの共有を有効にしなくてもシミュレータで機能します。

Xcode 8 / iOS 10シミュレータで関数呼び出すと、常にエラー-34018が発生するのはなぜですか?SecItemAdd

再現する手順

Xcode 8で新しいシングルページiOSアプリプロジェクトを作成します。次のコードを実行しますviewDidLoad(またはこの Xcodeプロジェクトを開きます)。

let itemKey = "My key"
let itemValue = "My secretive bee 🐝"

// Remove from Keychain
// ----------------

let queryDelete: [String: AnyObject] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrAccount as String: itemKey as AnyObject
]

let resultCodeDelete = SecItemDelete(queryDelete as CFDictionary)

if resultCodeDelete != noErr {
  print("Error deleting from Keychain: \(resultCodeDelete)")
}


// Add to keychain
// ----------------

guard let valueData = itemValue.data(using: String.Encoding.utf8) else {
  print("🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣 Error saving text to Keychain")
  return
}

let queryAdd: [String: AnyObject] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrAccount as String: itemKey as AnyObject,
  kSecValueData as String: valueData as AnyObject,
  kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
]

let resultCode = SecItemAdd(queryAdd as CFDictionary, nil)

if resultCode != noErr {
  print("🐝🐝🐝🐝🐝🐝🐝🐝🐝 Error saving to Keychain: \(resultCode).")
} else {
  print("🍀🍀🍀🍀🍀🍀🍀🍀🍀 Saved to keychain successfully.")
}

推測される結果

キーホルダーにアイテムが追加されました。

実績

関数SecItemAddは次のエラーコードを返します:-34018

バージョン

Xcodeバージョン8.1(8B62)、macOS Sierra 10.12.1。

構成

iOS 10シミュレーターでテストする場合、ベータ2以降のXcode 8で常に発生します。

iOS 9.3シミュレーターでテストする場合、Xcode 8では発生しません。

デモ

https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip

参考文献

レーダー:https : //openradar.appspot.com/27422249

Apple開発者フォーラム:https : //forums.developer.apple.com/message/179846

この問題は、Xcode 8で一貫して発生するため、次の投稿とは異なります。SecItemAddおよびSecItemCopyMatchingがエラーコード-34018(errSecMissingEntitlement)を返す


8
これはまだXcode 8 GMの問題のようです。Appleがまだゲームのトップにいるのを見るのは
うれしい

1
私にとっても同じですが、まだこのエラー
Kostiantyn Koval

私は本当にあなたのコンソールログを掘っています:-)
Nicolas Miari

この問題はXcode 8.2で修正されましたが、Xcode 9.0に戻っています。
Adil Hussain 2017

回答:


183

キーチェーンアクセスグループをエンタイトルメントファイルに追加することで、アプリでこれを回避することができました。私はオンキーホルダー共有のスイッチ機能のテストアプリでセクション、そしてそれは同様に私のために働いています。

スイッチをオンにするスクリーンショット

資格に追加するアイテム:

<key>keychain-access-groups</key>
<array>
    <string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string>
</array>

これはmacOS Sierra(10.12)でのみ試したので、10.11.5で動作するかどうかはわかりません。


ここでも同じですが、現在Xcode 8ベータ5を使用しているだけです(iOS 10シミュレーター。以前のベータでは問題は発生しませんでした。実際のiOS 9 iPhoneで8b5を使用してテストした場合も発生しません)。残念ながら、機能のプッシュ通知には修正(つまり、ボタンを押す)が必要であると同時に、残念ながら同時にキーチェーンの共有をオンにしていることに気付きました。その後、アプリはエラーをもう取得しませんでした。投入後オフ再びキーホルダー共有、それはまだ動作します!
Stefan

2
キーチェーンのテストターゲットを使用すると失敗します-これを回避するにはどうすればよいですか?(テストターゲットには機能がないため)
Sam Jarman

1
@SamJarman私もこの問題を抱えていました。テストターゲットのビルド設定に進み、資格フィールドの設定を解除しました。その後はうまくいきました。
ジョーダンボンド2016

3
このソリューションはアプリターゲットに適しています。残念ながら、エラーのためにもうビルドされないKeychainSwiftを使用するSwiftフレームワークに取り組んでいます。フレームワークターゲットでは、資格ファイルafaikを追加できません。このケースの回避策を知っている人はいますか?
Jan Nash

5
@JanNash、これが私がどうやってテスト作業を成功させたかですevgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii

17

Xcode 8.1 GMリリースノート Appleは問題を認め、クリーナーの回避策を示唆しました。

エンタイトルメントファイルにアプリケーション識別子のエンタイトルメントの値が含まれていない場合、キーチェーンAPIがシミュレータで機能しない可能性があります。(28338972)回避策:ユーザー定義のビルド設定をENTITLEMENTS_REQUIREDという名前のターゲットに追加し、値をYESに設定します。これにより、Xcodeはビルド時にアプリケーション識別子の資格を自動的に挿入します。

私が試したことから、それはXcode 8.1でのみ機能することに注意してください。テキストによってビルド設定に誤解を招く可能性がありますが、必要なのは、これを環境変数のスキーマに追加することです。

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

Xcode 8.2はこれを解決します:

Xcode 8.2ベータ版で解決-IDEキーチェーンAPIはシミュレータで正しく動作します。(28338972)


1
@Tiagoこのリリースノートの回避策は、iOS 10.1シミュレータのXcode 8.1でも機能しますか?この設定(ターゲットのユーザー定義設定とスキームの環境変数の両方)を追加しようとしましたが、iOS 10.1シミュレーターで実行した場合でも-34018の戻り値が返されます。
guywithmazda 2016年

3
@guywithmazda、ここも同じ。引き続き-34018を取得し、ビルド設定と環境変数の両方を試しました。
keithbhunter 2016年

ビルド設定でも、SierraのXcode 8.1(8B62)のスキームの環境変数としても、私には機能しません。何か不足していますか?
Evgenii

4
Xcode 8.2.1を使用していますが、この問題はまだ再現可能です。また、私の質問は、ホストアプリがなく、Frameworkターゲットを作成している場合、この問題を解決するにはどうすればよいですか?
DShah

2
この場合、資格が必要なのはテストホストスタブであるため、この問題はフレームワークターゲットの単体テストにも影響します。問題を認識していますが、それがブロッカーである場合は、重複するバグを報告してください。
russbishop 2017年

10

これは、ホストアプリがないテストターゲットがある場合に発生する可能性があります。修正する

  1. ダミーのホストアプリを追加します。 ここに画像の説明を入力してください

  2. 自動コード署名を有効にして、チームを追加します。

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

  1. 機能でキーチェーン共有を有効にする

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


5

メールでの署名、新しいユーザーの作成、またはFirebaseを使用したログアウトでエラーが発生しました。

エラーは:

firauthエラードメインコード17995

テストアプリの[機能]セクションでキーチェーン共有スイッチをオンにしましたが、これも機能します。


4

キーチェーン共有を使用しないソリューションを探していましたが、それは私が探していた機能ではありませんでした。開発者フォーラムは、範囲をiOS 10シミュレーターのみに制限できるEvergreenCoderから良い回避策があるようです(これは影響を受ける唯一のシミュレーターのようです)。投稿から:

問題は、Xcodeがビルドされたアプリケーションに「アプリケーション識別子」のエンティティを適切に追加するために、少なくとも1つのエンタイトルメントが必要であるようです。これが、キーチェーンの共有が解決策であるように思われる理由ですが、それは間接的にそうであるだけです。他の資格は正常に動作するようです。

次の.plistように作成できます:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-/  
<plist version="1.0">  
    <dict>  
        <key>get-task-allow</key>  
        <true/>  
    </dict>  
</plist>

のビルド設定でそのファイルへのパスを指定します

Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file

投稿で述べたように、この資格はデバッガーの接続を許可するだけです。


1

同様の問題がありましたが、デバイスで実行しようとすると-34018エラーが発生しました。iOS 10.1のSierraでXCode 8.1を使用しています。私はチームで作業していて、プロジェクト設定で「署名の自動管理」に切り替えたときに突然この問題が発生しました。これをオフにして手動でプロファイルを選択すると、すべてが正常に動作します。キーチェーンから開発者証明書を削除し、[署名を自動的に管理する]を再度選択する必要がありました。次のビルドでは、新しい署名証明書が生成され、すべて正常に動作します。他の証明書を手動で選択した場合は問題なく動作したが、XCodeで管理している場合は問題がなかったため、問題の原因はまだわかりません。これが他の誰かの1時間の長い頭痛を止めるのに役立つことを願っています。


1

資格を調整することなく、Xcode 11でこの問題を解決できました。

フレームワークのプロジェクトに、MyFrameworkTestsHostAppという新しいアプリターゲットを追加しただけです。

次に、MyFrameworkTestsターゲットを選択し、そのホストアプリケーションをMyFrameworkTestsHostAppとして選択しました。


0

機能でキーチェーンの共有を有効にすると機能します。


0

この問題をすばやく解決するには、3つのステップがあります。

  1. プロジェクト機能でキーチェーンの共有をオンにします。
  2. プロファイルを使用した自動プロビジョニングを選択します
  3. カスタム資格オプションがEntitlement.plistに設定されていることを確認します。

これは魔法になります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.