Pęk kluczy iOS nie pobiera wartości z tła

Obecnie przechowuję nazwę użytkownika (e-mail) i solony hash adresu e-mail i hasła w Pęku Kluczy iOS. Używam wersji ARC ' a znalezionej TUTAJ .

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];

To wszystko działa dobrze, gdy muszę wyciągnąć token dla moich połączeń sieciowych, gdy aplikacja jest aktywna. Działa do logowania się z czystego startu, a także wszystkich połączeń sieciowych w całym. Problem zaczyna się, gdy aplikacja jest w tle.

Należy pamiętać, że zdarza się to tylko sporadycznie i musisz jeszcze przypiąć go do określonej wersji lub urządzenia z systemem iOS.

Użytkownik wybiera lokalizację (monitorowanie regionu) I chcę zaktualizować serwer o ich status. Próbuję wyciągnąć token z pęku kluczy, tak samo jak robię dla każdego innego połączenia sieciowego i aktualizuję status. Ale dla niektórych użytkowników wartość jest zerowa. Bez tego nie mogę zaktualizować sieci. Dlaczego miałoby to działać dla większości, ale nie dla małego odsetka?

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];

Wróciłem do wersji non-ARC keychainwrapper, ale nadal mam takie same wyniki. Będę wdzięczny za wszelkie opinie na ten temat. Jest to tylko niewielka część moich użytkowników, ale jest to problem, który chciałbym naprawić i nie martwić się. Z góry dzięki.

Ponadto, cała moja praca w tle jest skonfigurowana w zadaniu tła, aby zapobiec temu, co się dzieje. Nie mam żadnych problemów z pracą wokół breloka, ale nie pozwalam, aby rzeczy szły do przodu, dopóki mój token nie zostanie wypełniony.

EDIT Rozgryzłem mój problem z One keychain nie pobierając wartości z tła. Zamieszczę odpowiedź poniżej i akceptuję ją, ponieważ czuję, że to pytanie może stać się cenne dla innych później.

Author: Bill Burgess, 2012-05-10

3 answers

Moje pytanie było zbliżone do celu, ale nie do końca. Po przeczytaniu bloga po blogu, samouczka po samouczku, w końcu znalazłem taki, który dał podpowiedź, co może się dziać.

Zablokowane ekrany główne. Samouczki pęku kluczy zawsze pozostawiały ustawienia dostępności dla pęku kluczy puste, więc domyślnie był to najniższy / najbezpieczniejszy poziom dostępu Apple. Ten poziom nie pozwala jednak na dostęp do pęku kluczy, jeśli użytkownik ma hasło na ekranie blokady. Bingo! To wyjaśnia sporadyczne zachowanie i dlaczego zdarza się to tylko niewielkiemu odsetkowi użytkowników.

Jedna linijka kodu rozwiązuje cały bałagan.
[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

Dodaj tę linię, w której ustawiam wartości nazwy użytkownika i hasła. Działa jak urok. Mam nadzieję, że to komuś pomoże. Przez jakiś czas mnie to krępowało, dopóki nie udało mi się poskładać tych kawałków do kupy.

 96
Author: Bill Burgess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-14 12:10:31

Użyj kSecAttrAccessibleAfterFirstUnlock zamiast kSecAttrAccessibleAlways.


Z dokumentacji Apple:

kSecAttrAccessibleAfterFirstUnlock
Dane w elemencie pęku kluczy nie mogą być dostępne po ponownym uruchomieniu, aż urządzenie zostanie odblokowane raz przez użytkownika.

Po pierwszym odblokowaniu dane pozostają dostępne do następnego uruchom ponownie. jest to zalecane dla przedmiotów, które muszą być dostępne przez aplikacje w tle. elementy z tym atrybutem migrują do nowego urządzenie podczas korzystania z zaszyfrowanych kopii zapasowych.

 49
Author: woof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 12:23:16

W moim przypadku watchOS2 uzyskuje dostęp do danych pęku kluczy po stronie iOS.

Na początku, ksecattraccessiblewen unlockedthisdeviceonly jest używany. Mogę odczytać dane bez względu na to, czy iPhone jest zablokowany, czy nie. Jest to dla mnie bardzo mylące, że otrzymam błąd, gdy zegarek próbuje uzyskać dostęp do pęku kluczy: : SecTrustEvaluate [Leaf IssuerCommonName SubjectCommonName]

I w pewnym przypadku stanie się: : SecOSStatusWith error: [-25308] Error Domain=Nsosstatuserrordomain Code = -25308 "ks_crypt: e00002e2 nie udało się uzyskać dostępu do elementu oe (Klasa 6, torba: 0), gdy pęk kluczy jest zablokowany."UserInfo={NSDescription=ks_crypt: e00002e2 nie powiodło się' oe ' elementu (class 6, bag: 0) próba dostępu do elementu, gdy pęk kluczy jest zablokowany.}

Zaktualizuję odpowiedź, jeśli otrzymam więcej informacji.

 0
Author: skingtree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-01 08:46:31