2017-09-27 84 views
5

的Bug苹果手表制作URLSession请求时:“互联网连接似乎已离线”使用LTE

我一直收到错误代码-1009“的互联网连接显示为脱机状态。”在Apple Watch Series 3上Apple Watch扩展程序中的URLSession请求仅在通过LTE连接到Internet时发生错误。

重现步骤:

  1. 安装应用程序。
  2. 配置您的设备,使其仅在LTE上。
  3. 使用iMessages验证您与LTE的连接,例如,
  4. 启动应用程序。
  5. 使用.default或.ephemeral会话配置初始化URLSession。
  6. 为任何已知良好的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() 

回答

5

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和发出相同的请求而不是启用waitsForConnectivity但通过WiFi进行传输之间的时间似乎没有明显的差异,这几乎与在某些情况下由waitsForConnectivity启用的等待时间是下一回合这种运行环境的情况。

更新#1

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

更新#2

添加到谜,在同一样品的代码运行在蜂窝上的其他两个开发的硬件细。我知道,我的硬件是好的,因为苹果的应用程序的乐趣很好,通过LTE(电话呼叫在汽车里除了我的手表之外没有任何东西)。所以有一些真正可怕的事情发生。我已经请Apple DTS研究这个问题,他们也不能重现这个问题。我会尽快跟进他们。

更新#3

有时在中间星期后,我最后更新这个帖子,蜂窝请求开始在我的应用程序工作。我没有改变我的手表,没有软件更新,没有重置,什么都没有。我甚至没有重新编译代码;与之前相同的版本仍然在我的手表上。它只是像预期的那样开始工作,就像它在其他开发者的设备上一样。

我唯一注意到的是我从AT &得到了三个背靠背的相同的SMS消息,通知我我的Apple Watch现在已链接到我的iPhone号码。这很奇怪,因为这种联系可能发生在我拆箱的那个晚上,而不是两个月后。我不知道这是否与我的问题有关。我所知道的是,蜂窝式请求正在工作。

¯\ _(ツ)_ /¯