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

时间:2017-09-27 03:41:06

标签: watchkit nsurlsession cellular-network lte watch-os-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网址发出数据任务请求。
  7. 预期行为:

    请求设法到达目的地。

    观察到的行为:

    请求立即失败,错误代码为-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()
    

2 个答案:

答案 0 :(得分: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()

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

更新#1

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

更新#2

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

更新#3

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

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

¯\ _(ツ)_ /¯

答案 1 :(得分:1)

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

config.allowsCellularAccess = true

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