В тестовом интерфейсе iOS UI отсутствуют права доступа к icloud-сервисам - PullRequest
1 голос
/ 11 апреля 2019

У меня есть приложение, которое использует iCloud.Это отлично работает.

Теперь я попытался написать тест пользовательского интерфейса, который сначала проверяет, доступна ли учетная запись iCloud, т. Е. Что пользователь вошел в iCloud и iCloud включен для приложения.

Для этого я попытался позвонить (CloudKit импортирован)

let container = CKContainer(identifier: kICloudContainerID)
container.accountStatus() { (status, error) in
  // …
}  

Однако, как только я пытаюсь получить доступ к CKContainer (1-я строка), я получаю ошибку

The application is missing required entitlement com.apple.developer.icloud-services
(null)

Конечно, в моем приложении установлены права доступа iCloud, но такие права не могут быть установлены для цели тестирования.

Я прочитал этот пост .Предлагаемые решения (отключение точек останова, переключение возможностей iCloud, очистка прав на подпись кода) не сработали.

Есть идеи, как решить эту проблему?

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

Для тестирования я создал новое приложение Single View с включенными тестами пользовательского интерфейса.
В цели приложения я включил только CloudKit:
enter image description here

В делегате приложения я импортировал CloudKit и получил доступ CKContainer:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let container = CKContainer(identifier: "iCloud.com.zeh4soft.EntitlementUITest")
    return true
}  

Это работает.

В тестах пользовательского интерфейса я также импортировал CloudKit и добавил ту же строку:

func testExample() {
  let container = CKContainer(identifier: "iCloud.com.zeh4soft.EntitlementUITest")
}  

Это не работает , но выдает ту же ошибку:
enter image description here

1 Ответ

0 голосов
/ 22 мая 2019

Я связался с 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 сказала, что запуск этого теста на симуляторе дает непредсказуемые результаты.Для меня это было предсказуемо - всегда терпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...