1. ホーム
  2. ios

[解決済み] iOS 10のシミュレータでXcode 8のSecItemAddは常にエラー-34018を返します。

2022-12-07 19:44:41

質問

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

なぜ私は は常に を呼び出すと、エラー -34018 が発生します。 SecItemAdd 機能 を呼び出すと、エラーが発生します。 ?

再現のための手順

Xcode 8 で新しい Single page iOS app プロジェクトを作成します。 以下のコードを 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.

構成

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

iOS 9.3 シミュレータでテストしているとき、Xcode 8 では発生しません。

デモ

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

参考文献

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

Apple Developer Forums。 https://forums.developer.apple.com/message/179846

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

どのように解決するのですか?

私のアプリでは、この問題を回避するために キーチェーン・アクセス・グループ を Entitlements ファイルに追加することで回避できました。私は キーチェーンシェアリング スイッチをオンにしました。 機能 セクションにあるスイッチをクリックすると、私のところでも動作しています。

エンタイトルメントに追加する項目です。

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

macOS Sierra(10.12)でしか試していないので、10.11.5でうまくいくかどうかはわかりません。