2015-01-20 11 views
5

Mam aplikację na iOS, która przechowuje token dostępu w pęku kluczy. W ciągu ostatnich kilku miesięcy zauważyłem, że około 2% użytkowników otrzymuje errSecItemNotFound podczas próby odzyskania tokena.Niewielki procent użytkowników uzyskujących errSecItemNotFound podczas pobierania danych z pęku kluczy

Wszystkie odpowiednie wątki StackOverflow wskazują na zadania w tle będące winowajcą (iOS KeyChain not retrieving values from background) lub włączając niepoprawne parametry w ciągu zapytania (Keychain: Item reported as errSecItemNotFound, but receive errSecDuplicateItem on addition).

Używam kSecAttrAccessibleAfterFirstUnlock, więc zadania w tle powinny być w stanie uzyskać dostęp do pęku kluczy.

Ponadto wyszukiwane wygląda następująco:

NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 
[query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 
[query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
[query setObject:service forKey:(__bridge id)kSecAttrService]; 
[query setObject:key forKey:(__bridge id)kSecAttrGeneric]; 
[query setObject:key forKey:(__bridge id)kSecAttrAccount]; 

(Ustawianie kSecAttrGeneric jest chyba zbędne, ale to nie wpływa na wynik zapytania w każdym razie)

Dla przypomnienia, ja wystąpił ten błąd zarówno z SSKeyChain i UICKeychainStore.

Wszelkie wskazówki byłyby bardzo mile widziane:]

+0

cześć !! Mam dokładnie ten sam problem ... Czy UICKeyChainStore lib rozwiązało to? Dzięki!! – Jovem

Odpowiedz

4

używałem KDJKeychainItemWrapper i miał podobne problemy. W końcu zastąpiłem jego użycie kSecAttrGeneric, aby użyć kSecAttrService. Naprawiono wszystkie moje problemy z nieodnalezieniem wpisów i duplikatów z powodu braku zdefiniowania usługi.

Uważam, że klucze podstawowe dla kSecClassGenericPassword to tylko kSecAttrAccount i kSecAttrService.

Jeśli przejdziesz do nie używania kSecAttrGeneric, powinien się on sam posortować, być może użytkownik musi ponownie wprowadzić swoje hasło.

Wybierz także nazwę usługi, która nie koliduje z niczym innym.

+0

Należy zauważyć, że już używam również kSecAttrService (kSecAttrService + kSecAttrAccount + kSecAttrGeneric). Czy nie powinien być ignorowany dodatkowy (i nadmiarowy) atrybut kSecAttrGeneric? – mgv

+0

Klucz wydaje się być taki, że konto i usługa muszą być unikatowe jako para. Jeśli nie, to istnieje niebezpieczeństwo, że zostaną nadpisane lub usunięte w innym miejscu. Wyszukałem, gdzie to pierwotnie widziałem: http://useyourloaf.com/blog/2010/04/28/keychain-duplicate-item-when-adding-password.html –

+0

Masz jednak rację, biorąc pod uwagę, że używasz wszystkich 3 i ustawiasz AttrGeneric na tę samą wartość, co AttrAccount, ale powinno działać, nawet jeśli AttrGeneric jest ignorowany. Biorąc pod uwagę, że Twój błąd nie został znaleziony, może to oznaczać, że wpis został zmieniony gdzieś indziej. Czy twoja wartość dla klucza AttrService to fajna wyjątkowa wartość? W jaki sposób można go ustawić na @ "" powiedzieć lub uszkodzony, gdy zaktualizowany, który następnie spowoduje niepowodzenie następnym razem jego zapytał? –

Powiązane problemy