"The Internet connection appears to be offline" 使用 LTE 在 Apple Watch 上发出 URLSession 请求时

"The Internet connection appears to be offline" when making URLSession requests on Apple Watch using LTE

错误:

在仅通过 LTE 连接到 Internet 的 Apple Watch Series 3 上的 Apple Watch 扩展中发出 URL 会话请求时,我一直收到错误代码 -1009 "The Internet connection appears to be offline." 错误。

重现步骤:

  1. 安装应用程序。
  2. 配置您的设备,使其仅支持 LTE。
  3. 使用 iMessages 验证您与 LTE 的连接,例如
  4. 启动应用程序。
  5. 使用.default 或.ephemeral 会话配置初始化URL会话。
  6. 为任何已知良好的 https 发出数据任务请求URL。

预期行为:

请求成功到达目的地。

观察到的行为:

请求立即失败,错误代码为 -1009 "The Internet connection appears to be offline."

代码示例:

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()

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 可使请求工作。在我的测试中,在通过 LTE 启用 waitsForConnectivity 和在不启用 的情况下通过 WiFi 发出相同请求 之间似乎没有明显的时间差异,几乎就像 waitsForConnectivity 在某些情况下启用的等待期是下一个运行循环的情况。

更新#1

我无法通过 LTE 发出任何请求。当 waitsForConnectivity 设置为 true 时,请求只是根据会话配置的超时属性超时。当 waitsForConnectivityfalse 时,请求立即失败。当我有更多信息时,我会更新我的问题和答案。我正在等待 Apple TSI 请求的回复,这通常需要几天时间。

更新#2

更神秘的是,相同的示例代码在其他两个开发人员的硬件上通过蜂窝网络运行良好。我知道 我的 硬件很好,因为 Apple 的应用程序在 LTE 上非常有趣(phone 电话在高速公路上滚动,除了我的手表在车里什么都没有)。因此,确实发生了一些可疑的事情。我已要求 Apple DTS 调查此问题,他们也无法重现该问题。我会尽快跟进他们。

更新#3

在我上次更新此 post 后的几周内,手机请求开始在我的应用程序中工作。我没有对手表进行任何更改,没有软件更新,没有重置,什么都没有。我什至没有重新编译代码;与以前一样,我的手表上仍然是相同的版本。它刚刚开始按预期工作,就像在其他开发人员的设备上一样。

我注意到的唯一奇怪的事情是,我从 AT&T 收到了三个连续的相同短信,通知我我的 Apple Watch 现在已链接到我的 iPhone 号码。这很奇怪,因为这种联系据说是在我打开 phone 的那天晚上发生的,而不是两个月后。我不知道这是否与我的问题有关。我所知道的是手机请求现在可以正常工作了。

我遇到了同样的问题,但正在为 iPhone 开发应用程序。这就是最终解决问题的方法。我设置配置对象 属性:

config.allowsCellularAccess = true

这非常令人困惑,因为 Apple 文档指出此 属性 默认设置为 true...但在我的情况下并非如此。另外,即使我使用 "background tasks," 并且它们总是要等待连接,我也设置了 waitsForConnectivity = true,以防万一。