"Интернет-соединение кажется отключенным" при выполнении запросов URLSession в Apple Watch с использованием LTE

ошибка:

Я постоянно получаю код ошибки -1009 "Подключение к Интернету отключено". ошибки при выполнении запросов URLSession в расширении Apple Watch на Apple Watch Series 3 при подключении к Интернету только через LTE.

Действия по воспроизведению:

  1. Установите приложение.
  2. Настройте свое устройство так, чтобы оно было только на LTE.
  3. Проверьте подключение к LTE с помощью iMessages, например
  4. Запустите приложение.
  5. Инициализируйте URLSession, используя конфигурацию сеанса.default или.ephemeral.
  6. Сделайте запрос задачи данных для любого заведомо исправного URL https.

Ожидаемое поведение:

Запрос удается достичь пункта назначения.

Наблюдаемое поведение:

Запрос немедленно завершается с ошибкой с кодом -1009 "Интернет-соединение отключено".

Пример кода:

let config = URLSessionConfiguration.ephemeral
let sesh = URLSession(configuration: config)
let url = URL(string: "https://google.com")!
sesh.dataTask(with: request) { (_, _, error) in
    print(error)
}.resume()

3 ответа

Решение

NOPE: СМОТРИТЕ ОБНОВЛЕНИЕ № 3 НИЖЕ: Важнейший недостающий элемент: вы должны установить waitsForConnectivity пометить в вашей конфигурации сеанса true,

let config = URLSessionConfiguration.ephemeral
config.waitsForConnectivity = true
let sesh = URLSession(configuration: config)
let url = URL(string: "https://google.com")!
sesh.dataTask(with: request) { (_, _, error) in
    print(error)
}.resume()

Если вы не установите этот флаг, запросы сразу же завершатся сбоем, поскольку доступ к LTE не будет мгновенным, а только после кратчайших задержек. Установка этого флага в true заставляет запросы работать. В моем тестировании даже, кажется, нет заметной разницы во времени между включением waitsForConnectivity через LTE и делает тот же запрос без включения waitsForConnectivity но проводится через WiFi, почти как период ожидания, включенный waitsForConnectivity в некоторых сценариях ситуация типа очередного хода

Обновление № 1

Я не могу делать какие-либо запросы по LTE. когда waitsForConnectivity установлен в true, запросы просто тайм-аут в соответствии со свойствами тайм-аута конфигурации сеанса. когда waitsForConnectivity является false, запросы терпят неудачу немедленно. Я обновлю свой вопрос и отвечу, когда у меня будет больше информации. Я жду ответа от запроса Apple TSI, который обычно занимает несколько дней.

Обновление № 2

В дополнение к загадке, тот же пример кода отлично работает по сотовой связи на оборудовании двух других разработчиков. Я знаю, что у меня хорошее оборудование, потому что приложения Apple отлично работают над LTE (телефонные звонки катятся по шоссе, и в машине только мои часы). Так что происходит что-то действительно подозрительное. Я попросил Apple DTS разобраться с этим, и они тоже не могут воспроизвести проблему. Я буду следить за ними, как только смогу.

Обновление № 3

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

Единственное, что странно, я заметил, что я получил три одинаковых SMS-сообщения от AT&T, уведомляющих меня о том, что мои Apple Watch теперь связаны с моим номером iPhone. Что странно, потому что эта связь предположительно произошла ночью, когда я распаковал свой телефон, а не два месяца спустя. Я понятия не имею, связано ли это с моей проблемой. Все, что я знаю, это то, что сотовые запросы сейчас работают.

¯ \ _ (ツ) _ / ¯

У меня была та же проблема, но я разрабатывал приложение для iPhone. Это то, что окончательно решило проблему. Я устанавливаю свойство объектов конфигурации:

config.allowsCellularAccess = true

Это очень запутанно, потому что в документации Apple говорится, что для этого свойства по умолчанию установлено значение true... но в моем случае это не так. Кроме того, хотя я использую "фоновые задачи", и они всегда предназначены для ожидания подключения, я также установил waitsForConnectivity = trueтоже на всякий случай.

На всякий случай, если кто-то столкнется с этой ошибкой, но все настроено правильно. Я запускал свой проект из xCode на реальном устройстве, но не мог решить проблему с подключением к Интернету.

В коде была проверка, чтобы определить, какой URL-адрес API использовать.

Я строил это дляrunningнетtestingпоэтому я предполагал, что это сделает__DEV__ЛОЖЬ. но этого не произошло, поэтому мне пришлось изменить код для этой проверки и установить для него нелокализованный URL-адрес API.

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

Другие вопросы по тегам