Я связался с Apple, и они нашли решение для устройства, но не для симулятора.
Я сделал следующие шаги:
Установите в Xcode совершенно новый проект приложения Single View App и включите пользовательский интерфейстесты.Назовите это «EntitlementUITest».Это создаст в навигаторе проекта папку «EntitlementUITestUITests».
Выберите в этой папке «EntitlementUITestUITests.swift».
Есть функция testExample()
.Добавьте в эту функцию строку
let _ = CKContainer(identifier: "iCloud.com.yourid.EntitlementUITest")
yourid
, например, название вашей компании.
Это утверждение вызывает ошибку во время выполнения, если проект не был подготовлен, как изложено ниже.
Выберите в навигаторе проекта проект.
При этом отобразится дополнительная панель с проектом и целями.
Существует 2 цели: основная цель «EntitlementUITest» и цель тестирования пользовательского интерфейса „EntitlementUITestUITests «.
Выберите основную цель« EntitlementUITest ».
В верхней панели окна справа от панели выберите« Возможности ».Вы увидите, что вы можете выбрать использование iCloud.
Теперь выберите цель теста «EntitlementUITestUITests».Верхний бар теперь не имеет «Возможности».Это означает, что настройка, которая позволяет вашим тестам пользовательского интерфейса использовать iCloud, намного сложнее и должна выполняться вручную.
Во-первых, нужен файл разрешений, в котором указаны возможности, которые приложение хочет использовать.Я вручную создал следующий файл (фактически, я скопировал файл полномочий основной цели и отредактировал его):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.yourid.EntitlementUITest</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
<string>CloudKit</string>
</array>
</dict>
</plist>
Я добавил этот файл в проект.
Чтобы разрешить объекту тестирования пользовательского интерфейса использовать iCloud, необходимо выполнить несколько действий в центре разработки.
В вашем веб-браузере откройте центр разработки и откройте там «Сертификаты, идентификаторы и профили».
Тестовая цель рассматривается как новое приложение.Таким образом, ему нужен отдельный идентификатор приложения.
Откройте идентификаторы приложения и добавьте новый идентификатор «EntitlementUITestUITests».
Это должен быть «Явный идентификатор приложения», который использует идентификатор пакета вашей цели тестирования, здесь
com.yourid.EntitlementUITest.
Включить iCloud и Push-уведомления.
Я не уверен, требуются ли Push-уведомления, но Apple сказала мне сделать это.Возможно, вы можете опустить его в файле прав и здесь.Если он присутствует, убедитесь, что для службы push-уведомлений указан действительный сертификат.
При включении iCloud убедитесь, что iCloud.com.yourid.EntitlementUITest
является единственным выбранным из назначенных контейнеров iCloud.
Создайте следующий новый профиль обеспечения разработки (тот, который использует ваш сертификат разработчика iOS) и свяжитесь с com.yourid.EntitlementUITestUITests
.
Загрузите профиль.
Вернувшись в XCode, снова выберите цель «EntitlementUITestUITests» с вкладкой «Общие».
В разделе «Подписание» снимите флажок «Автоматически управлять подписанием», так как это не работает.
В «Подписание (отладка)» выберите враскрывающееся меню Предоставление профиля для импорта только что загруженного профиля.Это также будет выбрано в разделе Подписывание (выпуск).
Теперь проект должен быть собран для тестирования без ошибок.
Запустите testExample.Теперь он должен работать без ошибок времени выполнения.
Вывод:
Возможно получить доступ к CKContainer в тесте пользовательского интерфейса, но это невероятно сложно.
Почему этот процесс не так прост, как с основными целями?
Возможно, слишкомменьше пользовательского интерфейса разработчиков тестируют свои приложения iCloud, иначе было бы написано больше запросов на улучшение Xcode…
Еще одна вещь: если все было сделано правильно, тест выполняется только на устройстве, а не на симуляторе.Apple сказала, что запуск этого теста на симуляторе дает непредсказуемые результаты.Для меня это было предсказуемо - всегда терпит неудачу.