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

Тестирование брелка - ошибка OSStatus -34018

Я пытаюсь проверить код, который читает и изменяет цепочку ключей, используя базовую структуру SenTest на Xcode. Код работает нормально на устройстве, но когда я запускаю тест, я получаю эти ошибки каждый раз, когда хочу коснуться брелка с помощью SecItemDelete/SecItemAdd/etc.

The operation couldn’t be completed. (OSStatus error -34018 - client has neither application-identifier nor keychain-access-groups entitlements)

У меня есть соответствующие профили подготовки подстановки (iOS Team Provisioning Profile: *) как для цели сборки, так и для тестовой цели.

Эти (неподтвержденные) ответы:

Чтение из результатов связки ключей в errSecItemNotFound 25300

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

Копая глубже, ответы (неподтвержденные) здесь:

SecItemAdd и SecItemCopyMatching возвращают код ошибки -34018 (errSecMissingEntitlement)

подразумевает, что может быть ошибка в цепочке ключей и в целом Security.framework, что откровенно страшно.

Мой вопрос: кто-нибудь ударил ошибку OSStatus -34018 только, когда они были на тестовой цели? Это похоже на то поведение, которое я вижу.

EDIT: добавив этот ответ, который JorgeDeCorte использовался в его ответе ниже.

Этот поток, кажется, содержит решение, если проблема выходит из вашей единичный тест.

https://devforums.apple.com/message/917498#917498

В основном вы должны координировать свою папку .xcttest, добавляя следуя за прогоном script в тестовой цели.

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

У меня появилось много ошибок -34018 при тестировании моего брелка на устройстве и это удалось исправить.

Если проблема не существует в вашей тестовой цели, это, вероятно, не решение.

Итак, я думаю, что решение: force sign your test target.

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос: Да, у меня такая же проблема. Кажется, что работает нормально при запуске моего приложения. Но когда я запускаю свои XCTests на своем устройстве, кажется, что keychain возвращает ошибку -34018. Странно то, что этого не происходит, когда я запускаю тесты на симуляторе.

EDIT: я нашел решение, которое я объяснил в этом ответе

Ответ 2

Я получил эту ошибку при попытке запуска операций с цепочками ключей через Grand Central Dispatch. Найдите способ создания экземпляра связки ключей (или связки ключей) в основном потоке.

//results in code -34018
   static dispatch_once_t token;
    dispatch_once(&token, ^{
        keychain = [[KeychainWrapper alloc] init];

    });

//works fine
keychain = [[KeychainWrapper alloc] init];

Ответ 3

Кодирование .xctest-пакета не так просто, как кажется в некоторых случаях. В принципе JorgeDeCorte прав с ответом , что данной короткой строки как Run Script достаточно для большинства разработчиков.

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

Но когда у вас есть несколько сертификатов в вашей цепочке ключей, это приведет к сбою со следующей строкой

iPhone Developer: ambiguous (matches "iPhone Developer: Your Name (ABC123DEF45)" and "iPhone Developer: Your Name (123ABC456DE)"

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

echo "codesign --verify --force --sign \"$CODE_SIGN_IDENTITY\" \"$CODESIGNING_FOLDER_PATH\""
IDENTITIES=`security find-identity -v -s "Code Signing" | grep "iPhone Developer" | awk '{ print $2 }'`

for SHA in $IDENTITIES; do
    codesign --verify --force --sign $SHA "$CODESIGNING_FOLDER_PATH"
    if [ $? -eq 0 ]; then
        echo "Matching identity found: $SHA"
        exit 0
    fi
done;

exit 1

Ответ 4

Я также получил сообщение "Ошибка OSStatus -34018". Я решил это, обновив профиль подготовки.