Я копался на форумах Apple и так для этой проблемы безрезультатно. Используя Apple KeychainItemWrapper (ARCified), попытка установить атрибут kSecAttrAccessible
на все, кроме значения по умолчанию (kSecAttrAccessibleWhenUnlocked
), приводит к ошибке утверждения из SecItemUpdate, возвращающей ошибку.iOS8 + Apple KeychainItemWrapper приводит к сбою
KeychainItemWrapper *wrapper = [[KeyChainItemWrapper alloc] initWithIdentifier:kMyIdentifier accessGroup:nil];
[wrapper setObject:kMyServiceName forKey:(__bridge NSString*)kSecAttrService];
[wrapper setObject:kMyAccountToken forKey:(__bridge NSString*)kSecAttrAccount];
[wrapper setObject:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge NSString*)kSecAttrAccessible];
Остальные наши брелка обновления, кажется, идет через хорошо, но результаты последней строки:
*** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/john.hammerlund/.../KeychainItemWrapper.m:299
Провал утверждение связано с SecItemUpdate() возвращает статус -50, который, как представляется, является общей ошибкой «недопустимые параметры».
Сразу же установка ключа kSecAttrAccessible
не влияет, но установка его по умолчанию kSecAttrAccessibleWhenUnlocked
смягчает проблему (но исключает точку). This other question - единственная дополнительная информация, которую я нашел в отношении iOS 8, приводящей к сбою KeychainItemWrapper. Создание устройства с iOS 7 или симулятора на iOS 7/8 устраняет проблему; это только разгорается на реальном устройстве с использованием IOS 8.
Update
Вот широкий обзор словаря запросов:
{ accc = "<SecAccessControlRef: 0x1687cc70>"; acct = ...; agrp = ...; cdat = "2014-10-13 22:22:47 +0000"; desc = ""; gena = ...; labl = ""; mdat = "2014-10-13 22:34:16 +0000"; pdmn = cku; <-- kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }
и параметр attributesToUpdate:
{ accc = "<SecAccessControlRef: 0x1687cc70>"; acct = ...; agrp = ...; cdat = "2014-10-13 22:22:47 +0000"; desc = ""; gena = ...; labl = ""; mdat = "2014-10-13 22:34:16 +0000"; pdmn = ak; <-- kSecAttrAccessibleWhenUnlocked svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }
У меня есть c подтвердил, что изменение других полей (т. kSecAttrService, kSecAttrAccount) имеют тот же эффект на соответствующих полях в словарях, но с ожидаемым статусом 0.
вам придется сбрасывать 2 словаря, переданных 'SecItemUpdate' в' writeToKeychain', чтобы вы могли увидеть проблему –
@John любое обновление по этому вопросу? –
Прошло некоторое время, но спасибо @singhSan за то, что вернул меня к этому. Я предположил, что это ошибка Apple, как описано ниже. – John