Kadang-kadang ketika saya menjalankan aplikasi pada perangkat dari Xcode, saya mencoba mengakses rantai kunci tetapi gagal karena kesalahan -34018. Ini tidak cocok dengan kode kesalahan rantai kunci yang didokumentasikan dan tidak dapat direproduksi secara konsisten. (terjadi mungkin 30% dari waktu, dan tidak jelas bagi saya mengapa itu terjadi). Apa yang membuat debugging masalah ini sangat sulit adalah kurangnya dokumentasi. Tahu apa yang menyebabkan ini dan bagaimana cara memperbaikinya? Saya menggunakan Xcode 5 dan menjalankan iOS 7.0.4 di perangkat.
Ada masalah terbuka tentang ini di sini: https://github.com/soffes/sskeychain/issues/52
EDIT: Menambahkan kode akses rantai kunci per permintaan
Saya menggunakan SSKeychain
perpustakaan untuk berinteraksi dengan gantungan kunci. Berikut cuplikannya.
#define SERVICE @"default"
@implementation SSKeychain (EXT)
+ (void)setValue:(NSString *)value forKey:(NSString *)key {
NSError *error = nil;
BOOL success = NO;
if (value) {
success = [self setPassword:value forService:SERVICE account:key error:&error];
} else {
success = [self deletePasswordForService:SERVICE account:key error:&error];
}
NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
if (!success) {
LogError(@"Unable to set value to keychain %@", error);
}
LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
if (value == nil)
LogWarn(@"Setting keychain %@ to nil!!!", key);
}
+ (NSString *)valueForKey:(NSString *)key {
NSError *error = nil;
NSString *value = [self passwordForService:SERVICE account:key error:&error];
if (error && error.code != errSecItemNotFound) {
NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
}
return value;
}
+ (BOOL)removeAllValues {
LogInfo(@"Completely Reseting Keychain");
return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
}];
}
@end
Sebagian besar waktu itu baik-baik saja. Kadang-kadang saya akan mengalami kegagalan pernyataan di mana saya tidak dapat menulis atau membaca dari rantai kunci, menyebabkan kegagalan pernyataan kritis.