iOS SFHFKeychainUtils не удается * иногда * с ошибкой -25308 errSecInteractionNotAllowed

У меня есть этот код, возвращающий пароль из цепочки для ключей для данного имени пользователя NSString:

NSError *error = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error];
if(error != nil)
    // log the error    

В большинстве случаев для большинства пользователей все это работает нормально, но для некоторых конкретных пользователей этот вызов кажется неудачным (и продолжает сбой), когда он возвращает следующую ошибку:

The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)

По-видимому, это errSecInteractionNotAllowed - из того, что я прочитал, я думаю, это означает, что для доступа к цепочке для ключей требуется какое-то взаимодействие с пользователем.

Кто-нибудь знает, почему этот вызов может быть неудачным только для некоторых конкретных пользователей? Эта запись цепочки для ключей специфична для моего приложения - так почему для доступа к ней требуется взаимодействие с пользователем?

Любые указатели высоко ценится...

2 ответа

Решение

Хорошо, так что я решил это наконец.

В конце концов я решил, что пользователи, у которых возникли проблемы, установили код блокировки на своем телефоне. Если телефон был заблокирован, система брелка возвращала эту ошибку -25308.

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

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

Исправление для этого состоит в том, чтобы изменить код SFHFKeychainUtils, чтобы установить определенный атрибут kSecAttrAccessible для элементов цепочки для ключей, которыми он управляет (чего исходный код не делал - предположительно, так как он предшествовал этим атрибутам).

Эта обновленная WordPress версия кода SFHFKeychainUtils содержит исправления - найдите kSecAttrAccessible, чтобы увидеть, куда они добавили доступный код атрибута.

Надеюсь, это поможет кому-нибудь еще столкнуться с этим...

У меня была эта проблема в iOS 14 с расширениями виджетов, которые обращаются к цепочке для ключей, чтобы получить токен JWT для вызова некоторых остатков.

По-видимому, виджеты по умолчанию пытались обновиться также, когда устройство заблокировано, а элемент связки ключей, который я пытался использовать, был недоступен.

После установки этого атрибута в элемент цепочки для ключей (код swift 5) вроде бы все работает:

      keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
Другие вопросы по тегам