Подтвердить что ты не робот

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 - что из того, что я читал, я думаю, что это означает, что для доступа к цепочке ключей требуется какое-то взаимодействие с пользователем.

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

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

4b9b3361

Ответ 1

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

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

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

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

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

В этом wordpress обновленная версия кода SFHFKeychainUtils есть исправления в нем - найдите kSecAttrAccessible, чтобы увидеть, где они добавили доступный код атрибута.

Надеюсь, что это поможет кому-то еще запутаться в этом...