2015-04-21 13 views
15

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ề kSecAttrAccessiblekSecAttrSynchronizable: “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]]; 
    }); 
} 
+0

câu hỏi hay !! –

Trả lời

1

dự án Ví dụ này có thể giúp đỡ, tiêu đề là KeychainTouchID: Sử dụng Touch ID với Keychain và LocalAuthentication:

https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html

Điều này có thể được giới hạn ở địa phương, mặc dù không chia sẻ.

+0

Vâng, đó là dự án tôi đã đề cập để triển khai xác thực ID Touch. Nó không bao gồm chia sẻ keychain giữa các thiết bị mặc dù. – SuPotter

+0

Tôi có thể sai ở đây, nhưng từ sự hiểu biết của tôi, TouchID có bộ nhớ riêng trong thiết bị mà hệ điều hành không thể đọc được bằng bất kỳ cách nào để chia sẻ dữ liệu. Tôi chỉ biết điều này khi xem [WWDC nơi họ công bố TouchID] (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB4QtwIwAA&url=http%3A % 2F% 2Fwww.youtube.com% 2Fwatch% 3Fv% 3D0mKEV7iYa3M & ei = 5fpMVfrCKNLdoATtiYCAAw & usg = AFQjCNFSMwAzN0v9xaccowf8kQYNW3b5pQ & sig2 = RGd_w6XLPqFnmwBNo0MoqQ). – LunaCodeGirl

3

Tôi nghĩ rằng tôi có thể tìm thấy câu trả lời cho điều này

Trong WWDC 2014 phim 711, sau đây được đề cập tại 31:48

ACL mục được bảo vệ - Không đồng bộ, Không Sao lưu

Do đó không thể sử dụng xác thực ID Touch cho Keychain Chia sẻ giữa các thiết bị vì các mục đó chỉ là Thiết bị chỉ

Các vấn đề liên quan