Наразі я зберігаю ім’я користувача (електронну адресу) та солений хеш електронної пошти та пароля в iOS KeyChain. Я використовую ARC'ified версію, знайдену тут .
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];
Все це чудово працює, коли мені потрібно витягнути маркер для своїх мережевих дзвінків, коли програма активна. Це працює для входу з чистого запуску, а також для всіх мережевих дзвінків. Проблема починається, коли програма знаходиться у фоновому режимі.
Майте на увазі, це трапляється лише епізодично, і я ще не закріпив це за певною версією iOS або пристроєм.
Користувач відключає місцезнаходження (моніторинг регіону), і я хочу оновити сервер із їх статусом. Я намагаюся витягнути маркер із брелока, так само, як і для кожного іншого дзвінка в мережу, і оновлюю статус. Але для деяких користувачів значення дорівнює нулю. Без цього я не можу оновити мережеві дані. Чому це працює для більшості, але не для невеликого відсотка?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
Я повернувся до версії брелочного обгортки, яка не є ARC, але все одно отримую ті самі результати. Буду вдячний за будь-який відгук щодо цього. Це лише невелика частина моїх користувачів, але це питання, яке я хотів би виправити і не хвилюватися. Заздалегідь спасибі.
Крім того, вся моя фонова робота налаштована у backgroundTask, щоб запобігти тимчасовому завершенню речей. У мене не виникає жодних проблем з роботою навколо брелока, але я не дозволяю рухатися далі, поки мій маркер не буде заповнений.
EDIT Я розібрався у своїй проблемі з тим, що брелок не отримує значення з фону. Я розміщу відповідь нижче і прийму її, оскільки, на мою думку, це питання може стати цінним для інших пізніше.