Obecnie przechowuję nazwę użytkownika (adres e-mail) i zasolony skrót adresu e-mail i hasła w łańcuchu kluczy iOS. Używam wersji zweryfikowanej przez ARC, 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 przy logowaniu się z czystego startu, a także przy wszystkich połączeniach sieciowych. Problem zaczyna się, gdy aplikacja działa w tle.
Pamiętaj, że zdarza się to tylko sporadycznie i jeszcze nie przypisałem tego do konkretnej wersji lub urządzenia iOS.
Użytkownik podróżuje do lokalizacji (monitorowanie regionu) i chcę zaktualizować serwer o ich status. Próbuję wyciągnąć token z pęku kluczy, tak samo jak przy każdym innym połączeniu sieciowym, i aktualizuję status. Ale dla niektórych użytkowników wartość wynosi zero. Bez tego nie mogę aktualizować 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 keychainwrapper innej niż ARC, ale nadal otrzymuję te same wyniki. Byłbym wdzięczny za wszelkie uwagi na ten temat. To tylko niewielka część moich użytkowników, ale jest to problem, który chciałbym naprawić i którym się nie martwię. Z góry dziękuję.
Ponadto cała moja praca w tle jest skonfigurowana w tle, aby zapobiec przekroczeniu limitu czasu. Nie mam żadnych problemów z pracą związaną z pękiem kluczy, ale nie pozwalam na to, dopóki mój token nie zostanie zapełniony.
EDYCJA Zrozumiałem mój problem z tym, że pęku kluczy nie pobierają wartości z tła. Poniżej zamieszczę odpowiedź i zaakceptuję ją, ponieważ uważam, że to pytanie może później stać się wartościowe dla innych.