使用LTE在Apple Watch上发出URLSession请求时,"Internet连接似乎处于脱机状态"

jar*_*air 8 cellular-network lte nsurlsession watchkit watchos-4

错误:

我一直收到错误代码-1009"Internet连接似乎处于脱机状态." 在通过LTE连接到Internet时,在Apple Watch Series 3上的Apple Watch扩展中发出URLSession请求时出错.

重现步骤:

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

预期行为:

请求设法到达目的地.

观察到的行为:

请求立即失败,错误代码为-1009"Internet连接似乎处于脱机状态".

代码示例:

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()
Run Code Online (Sandbox Code Playgroud)

jar*_*air 6

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()
Run Code Online (Sandbox Code Playgroud)

如果您未设置该标志,则请求会立即失败,因为LTE访问不会立即可用,而是仅在最短暂的延迟之后.将此标志设置为true会使请求起作用.在我的测试中,在启用waitsForConnectivityover LTE和发出相同请求而没有启用waitsForConnectivity但通过WiFi进行的时间之间似乎没有明显的时间差异,几乎就像waitsForConnectivity在某些情况下启用的等待时间是下一个转向的 - runloop有种情况.

更新#1

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

更新#2

更加神秘的是,相同的示例代码在其他两个开发人员的硬件上运行良好.我知道我的硬件很好,因为Apple的应用程序在LTE上很好玩(电话在高速公路上滚动,除了我在车上的手表外).所以有一些非常可疑的东西.我已经要求Apple DTS对此进行调查,他们也无法重现这个问题.我会尽快跟进他们.

更新#3

在我上次更新这篇文章后的几个星期的某个时间,蜂窝请求开始在我的应用程序中运行.我没有改变我的手表,没有软件更新,没有重置,没有任何改变.我甚至没有重新编译代码; 同样的构建仍然像以前一样在我的手表上.它刚刚开始按预期工作,就像在其他开发人员的设备上一样.

我注意到的唯一奇怪的是,我收到了来自AT&T的三条背靠背,相同的短信,通知我Apple Watch现已链接到我的iPhone号码.这很奇怪,因为这种联系可能发生在我打开手机的那个晚上,而不是两个月之后.我不知道这是否与我的问题有关.我所知道的是蜂窝请求现在正在运行.

¯\ _(ツ)_ /¯