В настоящее время я храню имя пользователя (адрес электронной почты) и соленый хеш адреса электронной почты и пароля в iOS KeyChain. Я использую версию ARC, найденную здесь .
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];
Я вернулся к версии keychainwrapper без ARC, но все равно получаю те же результаты. Буду признателен за любые отзывы по этому поводу. Это лишь небольшая часть моих пользователей, но это проблема, которую я хотел бы исправить и о которой не беспокоиться. Заранее спасибо.
Кроме того, вся моя фоновая работа настроена в backgroundTask, чтобы предотвратить истечение времени ожидания. У меня нет проблем с работой, связанной с связкой ключей, но я не позволяю этому идти вперед, пока мой токен не будет заполнен.
ИЗМЕНИТЬ Я выяснил свою проблему с цепочкой ключей, не извлекающей значения из фона. Я отправлю ответ ниже и приму его, так как считаю, что этот вопрос может стать ценным для других позже.