2015-04-21 23 views
15

Z powodzeniem udało mi się wdrożyć TouchID z pękiem kluczy, a także udostępnianie pęków kluczy (synchronizacja elementów keychain między wieloma urządzeniami) oddzielnie. Kiedy próbuję zrobić oba, pojawia się błąd "-50", który jest nieprawidłowym parametrem. Z poniższego kodu usunięcie kSecAttrAccessControl lub kSecAttrSynchronizowalne działa zgodnie z oczekiwaniami.Czy w aplikacji na iOS można korzystać z uwierzytelniania dotykowego i udostępniania pęku kluczy?

Na podstawie mojego doświadczenia (czytaj - kilka dni frustracji) do tej pory, oraz w oparciu o możliwości jakiegoś Brelok API uproszczenia tools jak UICKeychainStore, wydaje się, że jeśli mogę użyć dotykowego uwierzytelniania tożsamości, brelok Udostępnianie wouldn” t działają i na odwrót. Szukam dokumentacji Apple, która by to określiła, ale nie mogła jej znaleźć.

Poszedłem przez Apple'a SecItem.h stronie, a useful info znalazłem stany następujące informacje kSecAttrAccessible i kSecAttrSynchronizable: „Jeśli oba atrybuty są podane na każdym OS X i iOS wartość dla kSecAttrAccessible klucz może być tylko jeden, którego nazwa nie kończy się „ThisDeviceOnly”, jako tych, którzy nie mogą synchronizować się z innym urządzeniem.”Jednakże, nie używam«ThisDeviceOnly»(obecnie używam kSecAttrAccessibleAlways w celach testowych)

Czy możesz pomóc w wskazaniu, czy i gdzie Apple to udokumentował ograniczenie? To pomogłoby mi udokumentować to dla rekordów i przejść dalej. Dzięki.

- (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

dobre pytanie! –

Odpowiedz

1

Przykład ten projekt może pomóc, tytuł jest KeychainTouchID: Korzystanie Touch ID z pęku kluczy i LocalAuthentication:

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

To może być ograniczona do lokalnego choć nie dzielenie.

+0

Tak, to jest projekt, o którym mówiłem, że wdraża uwierzytelnianie Touch ID. Nie obejmuje jednak udostępniania keychain między urządzeniami. – SuPotter

+0

Mogę się mylić tutaj, ale z mojego rozumienia TouchID ma własne miejsce w urządzeniu, które nie może być odczytane przez OS w żaden sposób, aby udostępnić dane. Wiem o tym tylko dzięki oglądaniu [WWDC, w którym ogłosili 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

myślę, że może znaleźć odpowiedź na to

W WWDC 2014 filmowi 711, co następuje wspomniano na 31:48

ACL Chronionych Items - brak synchronizacji, brak Powrót do góry

W ten sposób uwierzytelnianie Touch ID nie może być używane do dzielenia pęku kluczy między urządzeniami, ponieważ te elementy są tylko Device-Only