web-dev-qa-db-ja.com

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

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)を返します

101
Evgenii

エンタイトルメントファイルにKeychain Access Groupsを追加することで、アプリでこの問題を回避できました。テストのCapabilitiesセクションでKeychain Sharingスイッチをオンにしましたアプリ、そしてそれも私のために働いています。

Screenshot of turning on the switch

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

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

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

182
Deyton

Xcode 8.1 GMリリースノート Appleは問題を認め、よりクリーンな回避策を提案しました。

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

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

enter image description here

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

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

17
Tiago Almeida

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

  1. ダミーのホストアプリを追加します: enter image description here

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

enter image description here

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

enter image description here

10
Mustafa

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

エラーは:

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

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

5
kavita patel

私が探していた機能ではないため、キーチェーン共有を使用しないソリューションを探していました。 開発者フォーラム 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

投稿で述べたように、この資格により、デバッガーを接続することができます。

4
ahtierney

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

1
johnrechd

機能でキーチェーン共有を有効にした後に機能します。

0
Vid