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

Код ошибки OSStatus -34018

Я использую SecItemCopyMatching для доступа к keychain iOS. Примерно в 1 сто раз я получаю код результата -34018 сразу после перезапуска приложения из фона. В документации указано:

Назначенное пространство ошибок для услуг Keychain Services является прерывистым: От -25240 до -25279 и от -25290 до -25329. Брелок для ключей Сервисы также могут возвращать noErr (0) или paramErr (-50) или результат CSSM Коды

Итак, кажется, что -34018 является "кодом результата CSSM". Я выполнил предложенную ссылку , но не смог найти коды результатов.

Что это за код результата -34018? Как я могу получить более надежный доступ к keychain?

- (NSData *)getKeychainData:(NSString *)key
{
    NSDictionary *query = @{
        (__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,
        (__bridge id)kSecAttrService:SEC_ATTR_SERVICE,
        (__bridge id)kSecAttrAccount:key,
        (__bridge id)kSecReturnData:@YES
    };

    CFDataRef result = nil;

    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);

    if(status == errSecItemNotFound) {
        return nil;
    }

    if(status == noErr) {
        return CFBridgingRelease(result);
    } else {
        [self logError:[NSString stringWithFormat:@"SecItemCopyMatching status %d", (int)status] :nil];
        return nil;
    }
}
4b9b3361

Ответ 1

Я только что исследовал ту же ошибку.

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

Это происходит не только при использовании Xcode, как некоторые могут утверждать.

Это самые последние данные о проблеме взятые с форумов разработчиков Apple одним из сотрудников Apple:

UPDATE: наконец, мы смогли воспроизвести ошибку -34018 на iOS 8.3. Это первый шаг в определении основной причины, а затем придумывание исправления.

Как обычно, мы не можем зафиксировать таймфрейм выпуска, но это затронуло многих разработчиков, и мы действительно хотим, чтобы это разрешилось.

Ранее я предложил добавить небольшую задержку в application: didFinishLaunchingWithOptions и applicationDidBecomeActive: перед доступом к цепочке ключей как обходной путь. Однако это фактически не помогает. Это значит что в это время нет известного обходного пути, кроме возобновления приложение.

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

От другого сотрудника Apple:

  • Технология Keychain хорошо знает, насколько важна эта проблема.
  • Основная проблема заключается в воспроизведении сбоя здесь в Apple.
  • Теперь мы можем это сделать (в значительной степени благодаря работе, которую вы, ребята, подали на подачу и отслеживаете отчеты об ошибках).

От другого сотрудника Apple от 22 марта 2016 года:

Хорошо, последнее. Это сложная проблема с несколькими возможные причины: некоторые случаи проблемы вызваны неправильными подписка на приложение. Вы можете легко отличить этот случай, потому что проблема на 100% воспроизводимо. Некоторые примеры проблемы вызваны ошибка в том, как iOS поддерживает разработку приложений (23,991,853). отладка это осложнялось тем, что другая ошибка в ОС (т. 23,770,418) замаскировал его эффект, что означает, что проблема только возникла когда устройство находилось под давлением памяти. Мы считаем, что эти проблемы были решены в IOS 9.3. Мы подозреваем, что может быть еще больше причин этой проблемы. Итак, если вы видите эту проблему на пользовательском устройстве (один с которым Xcode не разговаривал), который работает под управлением iOS 9.3 или новее, пожалуйста, сообщите об этом об ошибке. Попробуйте включить устройство система регистрирует ваш отчет об ошибках (я понимаю, что может быть сложно, когда работа с клиентскими устройствами; один из вариантов - попросить клиента установите Apple Configurator, который позволяет просматривать системный журнал). А также если вы делаете ошибку, отправьте свой номер ошибки, только для запись. От имени Apple Id нравится благодарить всех за их усилия по поиску этой довольно ужасной проблемы. Доля и Наслаждайтесь

К сожалению, нет известных способов обхода проблемы, и проблема все еще не исправлена ​​в 9.3.2 Beta 1 (13F51a)

Ответ 2

После некоторых исследований я нашел это: http://opensource.apple.com/source/Security/Security-55471/sec/Security/SecBasePriv.h

Итак -34018 есть errSecMissingEntitlement, и в комментарии говорится

Internal error when a required entitlement isn't present.

Возникла ли эта ошибка при выполнении модульных тестов? Если это так, это может помочь: fooobar.com/questions/50977/...

Эта проблема в github говорит, что это происходит только во время отладки с Xcode: https://github.com/soffes/sskeychain/issues/97 (также см. <а3 > )

Надеюсь, некоторые из них помогут!

Ответ 3

Этот код работает для меня:

static const UInt8 kKeychainItemIdentifier[] = "com.apple.dts.KeychainUI\0";

- (NSData *)getKeychainData:(NSString *)key
{
    NSData *keychainItemID = [NSData dataWithBytes:kKeychainItemIdentifier length:strlen((const char *)kKeychainItemIdentifier)];

    NSDictionary *query = @{
        (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
        (__bridge id)kSecAttrService: SEC_ATTR_SERVICE,
        (__bridge id)kSecAttrAccount: key,
        (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue,
        (__bridge id)kSecAttrGeneric: keychainItemID
    };

    CFDataRef result = NULL;

    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);

    if(status == errSecItemNotFound) {
        return nil;
    }

    if(status == noErr) {
        return CFBridgingRelease(result);
    } else {
        [self logError:[NSString stringWithFormat:@"SecItemCopyMatching status %d", (int)status] :nil];
        return nil;
    }
}

Основное отличие от кода OP - это добавление общего запроса к запросу. Идентификатор объекта Keychain по умолчанию - это яблоко. Причина этого заключается в том, чтобы различать различные элементы связки ключей друг от друга. Это один из способов сделать более доступным доступ к файлам ключей. В принципе, другими словами, это гарантирует, что вы получите доступ к ключу Apple по умолчанию.

Ответ 4

После выполнения многих исправлений в переполнении стека все по-прежнему не работает для меня.

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

введите описание изображения здесь