บางครั้งเมื่อฉันเรียกใช้แอปพลิเคชันบนอุปกรณ์จาก Xcode ฉันจะพยายามเข้าถึงพวงกุญแจ แต่ล้มเหลวเนื่องจากข้อผิดพลาด -34018 สิ่งนี้ไม่ตรงกับรหัสข้อผิดพลาดของพวงกุญแจที่มีเอกสารและไม่สามารถทำซ้ำได้อย่างสม่ำเสมอ (อาจเกิดขึ้น 30% ของเวลาและไม่ชัดเจนสำหรับฉันว่าทำไมมันถึงเกิดขึ้น) สิ่งที่ทำให้การดีบักปัญหานี้ยากมากคือการขาดเอกสารทั้งหมด มีความคิดอะไรที่ทำให้เกิดปัญหานี้และจะแก้ไขได้อย่างไร? ฉันใช้ Xcode 5 และใช้ iOS 7.0.4 บนอุปกรณ์
มีประเด็นเปิดเกี่ยวกับเรื่องนี้ที่นี่: https://github.com/soffes/sskeychain/issues/52
แก้ไข: การเพิ่มรหัสการเข้าถึงพวงกุญแจตามคำขอ
ฉันใช้SSKeychain
ไลบรารีเพื่อเชื่อมต่อกับพวงกุญแจ นี่คือตัวอย่างข้อมูล
#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
เวลาส่วนใหญ่ก็โอเค บางครั้งฉันจะประสบความล้มเหลวในการยืนยันโดยที่ฉันไม่สามารถเขียนหรืออ่านจากพวงกุญแจได้ทำให้การยืนยันล้มเหลวขั้นวิกฤต