Тестирование брелка - ошибка 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.
Ответы
Ответ 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". Я решил это, обновив профиль подготовки.