14 мая 2012 г., 14:05 отBill Burgess

iOS KeyChain не получает значения из фона

В настоящее время я храню имя пользователя (электронную почту) и соленый хэш электронной почты и пароль в iOS KeyChain. Я использую найденную версию ARCВот.

<code>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];
</code>

Это все работает нормально, когда мне нужно извлечь токен для сетевых вызовов, пока приложение активно. Он работает для входа в систему с чистого запуска, а также для всех сетевых вызовов во всем. Проблема начинается, когда приложение находится в фоновом режиме.

Имейте в виду, что это происходит только время от времени, и мне еще предстоит связать его с определенной версией iOS или устройством.

Пользователь отключает местоположение (мониторинг региона), и я хочу обновить сервер своим статусом. Я пытаюсь извлечь токен из цепочки для ключей, так же, как и для любого другого сетевого вызова, и обновить статус. Но для некоторых пользователей значение равно нулю. Без этого я не могу обновлять сетевые ресурсы. Почему это работает для большинства, но не для небольшого процента?

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

Я вернулся к не-ARC версии связки ключей, но все равно получаю те же результаты. Буду признателен за любые отзывы по этому поводу. Это лишь небольшая часть моих пользователей, но это проблема, которую я хотел бы исправить и не беспокоиться. Заранее спасибо.

Кроме того, вся моя фоновая работа настроена в backgroundTask, чтобы предотвратить время ожидания. У меня нет никаких проблем с работой, связанной с цепочкой для ключей, но я не позволяю вещам идти вперед, пока мой токен не будет заполнен.

EDIT Я выяснил мою проблему с тем, что они не получают значения из фона. Я опубликую ответ ниже и приму его, так как считаю, что этот вопрос может стать ценным для других позже.

Ответы на вопрос(3)

26 апр. 2016 г., 14:23 отMoshewoof

использованиеkSecAttrAccessibleAfterFirstUnlock вместоkSecAttrAccessibleAlways.


ОтДокументация Apple:

kSecAttrAccessibleAfterFirstUnlock
The data in the keychain item cannot be accessed after a restart until the device has been unlocked once by the user.

After the first unlock, the data remains accessible until the next restart. This is recommended for items that need to be accessed by background applications. Items with this attribute migrate to a new device when using encrypted backups.

14 мая 2012 г., 14:10 отBill Burgess

Мой вопрос был близок к цели по причине, но не совсем. Прочитав блог за блогом, учебник за учебником, я, наконец, нашел тот, который дал намек на то, что может происходить.

Заблокированные домашние экраны. В руководствах по цепочке для ключей всегда оставлялись настройки доступности для цепочки для ключей пустыми, поэтому по умолчанию для Apple был установлен самый низкий / самый безопасный уровень доступа Apple. Однако этот уровень не разрешает доступ к цепочке для ключей, если у пользователя есть пароль на экране блокировки. Бинго! Это объясняет случайное поведение и почему это происходит только с небольшим процентом пользователей.

Одна строка кода, решает весь беспорядок.

[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

Добавьте эту строку, где я устанавливаю значения имени пользователя и пароля. Работает как шарм. Надеюсь, это поможет кому-то там. Это смущало меня довольно долго, пока я не смог собрать все воедино.

01 февр. 2016 г., 09:46 отskingtree

В моем случае watchOS2 получает доступ к данным цепочки для ключей на стороне iOS.

В начале используется kSecAttrAccessibleWhenUnlockedThisDeviceOnly. Я могу читать данные независимо от того, заблокирован iPhone или нет. Меня очень смущает, что я получу сообщение об ошибке, когда часы пытаются получить доступ к цепочке для ключей: : SecTrustEvaluate [лист IssuerCommonName SubjectCommonName]

И в некоторых случаях это станет: : SecOSStatusWith error: [- 25308] Ошибка Домен = NSOSStatusErrorDomain Code = -25308 & lt; ks_crypt: e00002e2 не удалось & e; предмет (класс 6, сумка: 0) Доступ к предмету попытался, пока брелок заблокирован. & quot; UserInfo = {NSDescription = ks_crypt: e00002e2 не удалось & quot; oe & apos; предмет (класс 6, сумка: 0) Доступ к предмету попытался, пока брелок заблокирован.}

Я обновлю свой ответ, если получу больше информации.

ВАШ ОТВЕТ НА ВОПРОС