web-dev-qa-db-ja.com

iOSキーチェーンが値を書き込むとエラーコード-34018が発生する

キーチェーンに機密情報を保存するiOSアプリケーションがあります。キーチェーンに値を書き込むと、エラーコード-34018が発生します。

現在、AppleのiOS KeyChainItemWrapperクラスを使用しています。

次のコード行はどちらも同じエラーコードを受け取ります。

OSStatus res1 = SecItemCopyMatching((__bridge CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes);
OSStatus res = SecItemUpdate((__bridge CFDictionaryRef)updateItem, (__bridge CFDictionaryRef)tempCheck);

この問題は毎回発生するわけではなく、断続的に発生します。このエラーが発生すると、キーチェーンに値を書き込むことができなくなります。

私はエラーの説明を次のように印刷しました:

NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:res userInfo:nil];

これはエラーが出力されるものです:

Error: Error Domain=NSOSStatusErrorDomain Code=-34018 "The operation couldn’t be completed. (OSStatus error -34018.)"
25
Rohit Nisal

これはキーチェーンのバグのようで、xcodeからアプリを起動したときにのみ発生します。ここを参照してください: https://github.com/soffes/sskeychain/issues/52

私たちはそれをたくさんデバッグしました、そしてそれはアプリがバックグラウンドから起動されるときキーチェーンにアクセスする問題のようです。これはデバッガーでのみ発生しています(Xcodeから起動した場合など)。この問題は、OSによって強制終了された場合でも、デバッガーがアプリを存続させることに関係していると考えられます。実際にアプリを実行してバックグラウンドで実行し、RAMを占有する他の多くのアプリを起動しようとしました。デバッガーを使用すると、アプリをバックグラウンドから再開するときにバグが発生しましたが、デバッガーを使用しないと、バグは発生しませんでした(少なくともそれぞれ10個のテストを実行しました)。

34
iCaramba

誰かがこのエラーとXCode8 with iOS10でここに戻ってくる場合、おそらくKeyChain ShareタブCapabilities

Activate KeychainShare ONenter image description here

28
Zeb

他の人が述べたように、これはキーチェーンのバグであり、Appleは2015年半ば以降に認識され、認識されています。

ただし、2016年3月22日現在、Appleは次のように述べています。

これらの問題はiOS 9.3で解決されたと思われます。

iOS 9.3は2016年3月21日にリリースされました。

スレッドを参照してください: https://forums.developer.Apple.com/thread/474

Apple従業員が回答を引用するには:

2016年3月22日3:28 AM

はい、こちらが最新です。これは、複数の原因が考えられる複雑な問題です。

  • 問題のいくつかのインスタンスは、不正なアプリ署名によって引き起こされます。問題は100%再現可能であるため、このケースは簡単に区別できます。

  • この問題の一部の例は、iOSがアプリ開発をサポートする方法のバグが原因です(r。23,991,853)。これをデバッグすることは、OSの別のバグ(r。23,770,418)がその影響を覆い隠すという事実によって複雑になりました。つまり、この問題は、デバイスにメモリの負荷がかかっているときにのみ発生しました。

    これらの問題はiOS 9.3で解決されたと思われます。

  • この問題の原因はまだまだあると思われます。

そのため、iOS 9.3以降を実行しているユーザーデバイス(Xcodeから通信されていないデバイス)でこの問題が発生した場合は、バグレポートを提出してください。バグレポートにデバイスのシステムログを含めてみてください(お客様のデバイスを扱う場合は注意が必要です。1つのオプションは、Apple Configuratorをインストールして、システムログ)。バグを報告する場合は、念のため、バグ番号を投稿してください。

Appleを代表して、この恐ろしい問題の追跡を支援してくれた皆さんに感謝します。

共有して楽しむ

4
j.f.

これは私がすばやく「修正」を見つける前に2時間私を保持しました-iOSデバイスを再起動します

http://forums.developer.Apple.com/thread/474 での議論からの引用

ユーザーからlittledetails

他の人が報告したように、この不可解なキーチェーンエラーは、デバッガーが接続されたXcodeを介して起動したときに最も簡単に観察できます。エラーが発生し始めると、デバイスを再起動するまで、メモリプレッシャーに関係なく、キーチェーンは正常に動作しないようです

デバイスを再起動するとエラーが解消され、テストを続行できました。他に何をすべきかわからない。私の状況では、NSUserDefaultsまたは他のストレージソリューションに移動することは不可能でした。

3
jperl

キーチェーンでこの問題を回避する1つの方法は、dispatch_asyncを使用してアプリの起動を許可することです。これは、アプリがバックグラウンドから開かれたときに機能します。また、キーチェーンにkSecAttrAccessibleAfterFirstUnlockアクセシビリティ設定があることを確認してください。

 dispatch_async(dispatch_get_main_queue(), ^{
    // save/write to keychain
 })
2
Mustafa

私はAppleのGenericKeychainクラスを使用しています:

https://developer.Apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html#//Apple_ref/doc/uid/DTS40007797-Intro-DontLinkElementID_2

struct KeychainConfiguration {

static let serviceName = "MyAppService"



/*

    Specifying an access group to use with `KeychainPasswordItem` instances will create items shared accross both apps.



    For information on App ID prefixes, see:

        https://developer.Apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/AppID.html
    and:
        https://developer.Apple.com/library/ios/technotes/tn2311/_index.html
*/

//    static let accessGroup = "[YOUR APP ID PREFIX].com.example.Apple-samplecode.GenericKeychainShared"



/*

    Not specifying an access group to use with `KeychainPasswordItem` instances

    will create items specific to each app.

*/

static let accessGroup: String? = nil

}

このファイルでは、この行にカスタムaccessGroupを指定していましたstatic let accessGroup = "[YOUR APP ID PREFIX] .com.example.Apple-samplecode.GenericKeychainShared"

staticに戻った後、accessGroup:String? = nil問題は解消されました。 :)

1

プロジェクトTargetCapabilitiesの下でkeychain sharingが必須onであることを確認してください。

私の場合、App_Name.entitlementsファイルには、プロジェクトのバンドルIDとは異なるバンドルIDがあります。したがって、プロジェクトバンドルIDの時点でApp_Name.entitlementsファイルのバンドルIDを変更します。たとえば、プロジェクトバンドルIDがcom.Apple.testAppであるとします。

  1. App_Name.entitlementsファイルのオープンキーKeychain Access Groupsの配列タイプのキー。
  2. Item0の下で、プロジェクトバンドルIDの値を次のように設定します。-$(AppIdentifierPrefix)com.Apple.testAp。
0
Gurjinder Singh

@iCarambaの答えによると。回避策を見つけました:

  1. アプリを強制終了するタスクを停止します(すでにアプリを実行している場合)
  2. デバイス上のアプリを手動で起動します。 Xcodeを使用しないでください
  3. Xcodeを使用してアプリを再起動します
0
ultragtx