Đôi khi, khi tôi chạy một ứng dụng trên thiết bị từ Xcode, tôi sẽ cố truy cập vào móc khóa nhưng không thành công do lỗi -34018. Điều này không khớp với bất kỳ mã lỗi móc khóa tài liệu nào và không thể được sao chép một cách nhất quán. (xảy ra có thể 30% thời gian và tôi không rõ tại sao nó lại xảy ra). Điều làm cho việc gỡ lỗi vấn đề này trở nên rất khó khăn là thiếu tài liệu hoàn toàn. Bất kỳ ý tưởng những gì gây ra điều này và làm thế nào để khắc phục nó? Tôi đang sử dụng Xcode 5 và chạy iOS 7.0.4 trên thiết bị.
Có một vấn đề mở về vấn đề này tại đây: https://github.com/soffes/sskeychain/issues/52
EDIT: Thêm mã truy cập móc khóa cho mỗi yêu cầu
Tôi đang sử dụng SSKeychain
thư viện để giao tiếp với móc khóa. Đây là đoạn trích.
#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
Phần lớn thời gian là tốt. Đôi khi, tôi sẽ gặp phải các lỗi xác nhận khi tôi không thể viết hoặc đọc từ móc khóa, gây ra lỗi xác nhận nghiêm trọng.