2

最近、iOS 7.1 シミュレーターと新しい Xcode 5.1 をインストールしました。私のアプリは iOS 7 で正常に動作しました。Apple の KeychainItemWrapper クラスを使用しています。更新後、次のメッセージでクラッシュしました。

*** Assertion failure in -[KeychainItemWrapper writeToKeychain]

具体的には 299 行目:

NSAssert( result == noErr, @"Couldn't update the Keychain Item." );

エラーが聞こえる -25300 ( errSecItemNotFound )

資格ファイルでキーチェーン アクセス グループを指定しました。このエラーは iOS 7.1 シミュレーターでのみ発生し、実際の iPhone や 7.0 シミュレーターでは発生しませんでした。

7.1 の Keychain で何が変わったのか知っている人はいますか?

4

2 に答える 2

5

KeychainItemWrapper はバグだらけの古い実装です。別のラッパーを使用するか、独自のラッパーを作成することをお勧めします。

そうは言っても、以前は多くのエラーがありましたが、これはそうではありませんでした。基本的に何が起こるかは、アイテムを追加または更新するために、保存中にアイテムがすでにキーチェーンにあることを確認することです。ここでは、アイテムがまったく異なっていても、そのチェックは true を返します。そのため、SecItemUpdate はアイテムが存在しないと認識しているため、アイテムを更新できません。

キーチェーンをリセットする必要があります。これには 2 つのオプションがあります。

  • シミュレーター メニュー シミュレーター -> コンテンツと設定のリセット

  • コードのどこかでこのスニペットを実行します。

ここのVegardの回答に基づいて、iPhoneアプリのキーチェーンをリセットします

-(void)resetKeychain {
     [self deleteAllKeysForSecClass:kSecClassGenericPassword];
     [self deleteAllKeysForSecClass:kSecClassInternetPassword];
     [self deleteAllKeysForSecClass:kSecClassCertificate];
     [self deleteAllKeysForSecClass:kSecClassKey];
     [self deleteAllKeysForSecClass:kSecClassIdentity];
}

-(void)deleteAllKeysForSecClass:(CFTypeRef)secClass {
     NSMutableDictionary* dict = [NSMutableDictionary dictionary];
    [dict setObject:(__bridge id)secClass forKey:(__bridge id)kSecClass];
    OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict);
     NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%ld)", result);
}
于 2014-03-12T09:11:46.697 に答える