Tôi đã có thể triển khai thành công TouchID bằng keychain cũng như Chia sẻ Keychain (đồng bộ hóa các mục keychain giữa nhiều thiết bị) một cách riêng biệt. Khi tôi cố gắng thực hiện cả hai, tôi gặp lỗi “-50” là thông số không hợp lệ. Từ mã dưới đây, loại bỏ một trong hai kSecAttrAccessControl hoặc kSecAttrSynchronizable công trình như mong đợi.Có thể sử dụng Xác thực ID Touch và chia sẻ Keychain trong ứng dụng iOS không?
Dựa trên kinh nghiệm của tôi (đọc - một vài ngày của sự thất vọng) cho đến nay, và dựa vào khả năng của một số keychain API đơn giản hóa tools như UICKeychainStore, nó có vẻ như nếu tôi sử dụng Touch ID xác thực, Keychain Sharing wouldn' t làm việc và ngược lại. Tôi đang tìm một tài liệu của Apple có thể nêu rõ điều đó, nhưng không thể tìm thấy nó.
Tôi đã trải qua trang SecItem.h của Apple, và một thông tin hữu ích tôi thấy các quốc gia sau đây về kSecAttrAccessible và kSecAttrSynchronizable: “Nếu cả hai thuộc tính được xác định trên hoặc OS X hoặc iOS, giá trị cho các kSecAttrAccessible chỉ có thể có tên không kết thúc bằng “ThisDeviceOnly”, vì chúng không thể đồng bộ hóa với một thiết bị khác. ”Tuy nhiên, tôi không sử dụng" ThisDeviceOnly "(Tôi hiện đang sử dụng kSecAttrAccessibleAlways cho mục đích thử nghiệm)
Bạn có thể giúp chỉ ra nếu và ở đâu Apple đã ghi lại điều này giới hạn? Điều đó sẽ giúp tôi ghi lại nó cho các hồ sơ, và tiếp tục. Cảm ơn.
- (void)addKeychainItemWithIdentifier:(NSString *)identifier andData:(NSData *)data {
CFErrorRef error = NULL;
SecAccessControlRef sacObject;
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleAlways,
kSecAccessControlUserPresence, &error);
if(sacObject == NULL || error != NULL)
{
NSString *msg0 = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_CAN_CREATE_OBJECT", nil), error];
[self printResultWithMessage:msg0];
return;
}
NSDictionary *attributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecValueData: data,
(__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlways,
(__bridge id)kSecAttrService: identifier,
(__bridge id)kSecAttrSynchronizable:(__bridge id)kCFBooleanTrue,
(__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject
};
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
NSError *statuserror = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
[self printResultWithMessage:[self keychainErrorToString:status]];
});
}
câu hỏi hay !! –