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);
}