9

漏洞:

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

重现步骤:

  1. 安装应用程序。
  2. 配置您的设备,使其仅支持 LTE。
  3. 使用 iMessage 验证您与 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()
4

2 回答 2

8

不:请参阅下面的更新#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 会使请求工作。在我的测试中,甚至在启用 over LTE 和在未启用但通过 WiFi 进行waitsForConnectivity的情况下发出相同请求之间似乎没有明显的时间差异,几乎就像在某些情况下启用的等待期是下一个回合一样runloop 那种情况。waitsForConnectivitywaitsForConnectivity

更新#1

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

更新#2

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

更新#3

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

我注意到的唯一奇怪的事情是,我收到了来自 AT&T 的三个背靠背相同的 SMS 消息,通知我我的 Apple Watch 现在与我的 iPhone 号码相关联。这很奇怪,因为这种联系据说发生在我拆箱手机的那天晚上,而不是两个月后。我不知道这是否与我的问题有关。我所知道的是,蜂窝请求现在正在工作。

于 2017-09-27T03:41:06.473 回答
3

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

config.allowsCellularAccess = true

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

于 2018-10-11T16:45:28.453 回答