2014-09-24 2 views
8

Я копался на форумах 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.

+1

вам придется сбрасывать 2 словаря, переданных 'SecItemUpdate' в' writeToKeychain', чтобы вы могли увидеть проблему –

+0

@John любое обновление по этому вопросу? –

+0

Прошло некоторое время, но спасибо @singhSan за то, что вернул меня к этому. Я предположил, что это ошибка Apple, как описано ниже. – John

ответ

2

У меня также была проблема. Дал мне:

OSStatus ошибка -50 - конфликтующие kSecAccess и kSecAccessControl атрибуты

Разбился всем своим пользователям в магазине приложения только после того, как они обновляются.

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

Я думаю, это ошибка Apple.

Я открыл TSI, но они еще не обратились ко мне.

Из того, что я понимаю, происходит с пользователями, обновленными с iOS7 до iOS 8, где их первое приложение было скомпилировано с XCode для iOS7 (до выхода iOS 8), а затем в iOS8 обновлено до нового приложения, которое было скомпилировано с XCode до iOS8.

2

Выстрел в темноте здесь:

Возможно устройство IOS позволило ICloud и синхронизация добавив элемент, который не является специфичным для устройства, а затем делает его ThisDeviceOnly приводит к ошибке. iOS8 также может изменить поведение.

Можно попытаться изменить порядок атрибутов, которые установлены на брелок

KeychainItemWrapper *wrapper = [[KeyChainItemWrapper alloc] initWithIdentifier:kMyIdentifier accessGroup:nil]; 
[wrapper setObject:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge NSString*)kSecAttrAccessible]; 
[wrapper setObject:kMyServiceName forKey:(__bridge NSString*)kSecAttrService]; 
[wrapper setObject:kMyAccountToken forKey:(__bridge NSString*)kSecAttrAccount]; 

Если это не поможет, вы должны изменить KeychainItemWrapper выглядеть как этот

- (void)resetKeychainItem 
{ 
    if (!keychainItemData) 
    { 
     keychainItemData = [[NSMutableDictionary alloc] init]; 
     [keychainItemData setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; 
    } 
+0

Да, все значения, за исключением значений pdmn и ссылок accc, одинаковы. – John

+0

Я обновил ответ. Вы попробовали то, что упоминается здесь? –

+0

Я сделал ... без кости. Я проработал через эту упаковку в течение нескольких часов и до сих пор не могу понять это. – John

4

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

+0

Спасибо, Питер. Мне нужно много боли, чтобы выяснить причину краха. Похоже, что сбой от яблок. Надеюсь, они скоро это исправит. Я сделал то же, что и ты, и это сработало для меня. + Upvoted. – Allamaprabhu

+1

@peter Я столкнулся с теми же проблемами, пытался сбросить брелок, но все еще получаю ошибку. Можете ли вы опубликовать фрагмент того, как вы смогли это сделать? – rmp

Смежные вопросы