KeychainItemWrapper вызывает сбой сборки дистрибутива iOS

В моем приложении для iOS я использую KeychainItemWrapper, предоставленный Apple, для сохранения некоторых важных данных моего приложения.

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

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

Любая идея, почему это происходит? Кто-нибудь сталкивался с этой проблемой раньше?

iOS : 9.3.1
Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY


  CoreFoundation                    0x1817fee38 __exceptionPreprocess + 124
1   libobjc.A.dylib                 0x180e63f80 objc_exception_throw + 56
2   CoreFoundation                  0x1817fed08 +[NSException raise:format:arguments:] + 108
3   Foundation                      0x182184124 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 112
4   MyApp                           0x10017fe6c -[KeychainItemWrapper writeToKeychain] (KeychainItemWrapper.m:328)
5   MyApp                           0x10017f1c4 -[KeychainItemWrapper setObject:forKey:] (KeychainItemWrapper.m:177)
6   MyApp                           0x1000c61cc +[MyKeyChainWrappper fetchInfo:] (MyKeyChainWrappper.m:41)

РЕДАКТИРОВАТЬ:

Код инициализации KeychainItemWrapper

 KeychainItemWrapper* mykeyChain = [[KeychainItemWrapper alloc]    initWithIdentifier:@"My_Identifier" accessGroup:[[NSBundle mainBundle]    bundleIdentifier]];


  [mykeyChain setObject:(__bridge id)(kSecAttrAccessibleWhenUnlocked) forKey:(__bridge id)(kSecAttrAccessible)];

person Swapnil    schedule 12.05.2016    source источник
comment
Поскольку возникло исключение, должно появиться сообщение с подробностями исключения, но похоже, что запись в цепочку ключей не удалась. Установлен ли на устройстве пароль? Сбой является результатом сбоя NSAssert в строке 328. Возможно, удалить утверждение и записать ошибку где-нибудь?   -  person Paulw11    schedule 12.05.2016
comment
Утверждение предназначено для добавления элемента в цепочку для ключей, если я его прокомментирую, оно не сработает, но также не будет получено ожидаемое значение, что приведет к сбою приложения.   -  person Swapnil    schedule 13.05.2016
comment
Мне интересно, почему проблема зависит от профиля, поскольку она работает с профилем разработчика.   -  person Swapnil    schedule 13.05.2016
comment
Удаление утверждения устранит сбой, но не основную проблему, вызвавшую сбой. Вам нужно получить подробную информацию об ошибке, которая была возвращена из цепочки для ключей, и записать ее, чтобы вы могли диагностировать проблему.   -  person Paulw11    schedule 13.05.2016
comment
Как я могу зарегистрировать отказ функции SecItemAdd? Нет ли какого-либо блока ошибок или объекта, возвращаемого им? Выдает только статус OSStatus   -  person Swapnil    schedule 13.05.2016
comment
Возвращаемое значение secItemAdd представляет собой код результата- developer.apple.com/library/ios/documentation/Security/   -  person Paulw11    schedule 13.05.2016
comment
да... не дает описание отказа...   -  person Swapnil    schedule 13.05.2016


Ответы (1)


Ваша проблема в вашей группе доступа. Вы используете [[NSBundle mainBundle] bundleIdentifier]. Это недопустимая группа доступа. Ваша группа доступа должна начинаться с вашего AppID. Вы можете либо жестко закодировать это (как это делается в примере кода KeychainItemWrapper), либо вы можете запросить его во время выполнения.

person Rob Napier    schedule 14.05.2016