Update:この問題はXcode 8.2で修正されました。キーチェーンは、キーチェーンの共有を有効にせずにシミュレーターで機能します。
なぜalwaysSecItemAdd
関数を呼び出すときにエラー-34018を受け取るXcode 8/iOS 10シミュレーターですか?
Xcode 8で新しいシングルページiOSアプリプロジェクトを作成します。viewDidLoad
で次のコードを実行します(または this 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)を返します
エンタイトルメントファイルにKeychain Access Groupsを追加することで、アプリでこの問題を回避できました。テストのCapabilitiesセクションでKeychain Sharingスイッチをオンにしましたアプリ、そしてそれも私のために働いています。
資格に追加するアイテム:
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string>
</array>
これはmacOS Sierra(10.12)でのみ試したため、10.11.5で動作するかどうかはわかりません。
Xcode 8.1 GMリリースノート Appleは問題を認め、よりクリーンな回避策を提案しました。
エンタイトルメントファイルにアプリケーション識別子のエンタイトルメントの値が含まれていない場合、シミュレータでキーチェーンAPIが機能しない場合があります。 (28338972)回避策:ENTITLEMENTS_REQUIREDという名前のターゲットにユーザー定義のビルド設定を追加し、値をYESに設定します。これにより、ビルド時にXcodeがアプリケーション識別子の資格を自動的に挿入します。
私が試したことから、Xcode 8.1でのみ機能することに注意してください。このテキストはビルド設定を誤解させる可能性がありますが、必要なことは、これをスキームの環境変数に追加することです。
Xcode 8.2はこれを解決します:
Xcode 8.2ベータ版で解決済み-IDEキーチェーンAPIはシミュレータで正しく機能します。 (28338972)
メールでの署名、新しいユーザーの作成、またはfirebaseを使用したログアウトでエラーが発生しました。
エラーは:
firauthエラードメインコード17995
テストアプリの[機能]セクションで[キーチェーン共有]スイッチをオンにしましたが、それも同様に機能しています。
私が探していた機能ではないため、キーチェーン共有を使用しないソリューションを探していました。 開発者フォーラム iOS 10シミュレーターのみに範囲を制限できるEvergreenCoderの回避策があるようです(これが唯一の影響を受けるシミュレーターのようです)。投稿から:
問題は、Xcodeがビルドされたアプリケーションに「application-identifier」エンタイトルメントを適切に追加するために、少なくとも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
投稿で述べたように、この資格により、デバッガーを接続することができます。
デバイスで実行しようとすると-34018エラーが発生していましたが、同様の問題がありました。 iOS 10.1を搭載したSierraでXCode 8.1を使用しています。私はチームで働いており、プロジェクト設定で「署名の自動管理」に切り替えたときに突然この問題が発生しました。これをオフにしてプロファイルを手動で選択すると、すべてが正常に機能します。キーチェーンから開発者証明書を削除し、「署名の自動管理」を再度選択する必要がありました。次のビルドで、新しい署名証明書が生成され、すべてが正常に機能するようになりました。 XCodeで管理されている場合ではなく、手動で選択した場合に他の証明書が正常に機能したため、問題の原因はまだわかりません。これが他の誰かのための長い時間の頭痛を止めるのに役立つことを願っています。
機能でキーチェーン共有を有効にした後に機能します。