在使用LTE连接的Apple Watch上进行URLSession请求时,“Internet connection appears to be offline”

11

Bug:

在仅通过LTE连接互联网的Apple Watch Series 3上使用Apple Watch扩展程序进行URLSession请求时,我持续遇到错误代码-1009“网络连接似乎已断开”的问题。

复现步骤:

  1. 安装该应用程序。
  2. 将设备配置为仅使用LTE连接互联网。
  3. 使用iMessages验证您对LTE的连接,例如。
  4. 启动应用程序。
  5. 使用.default或.ephemeral会话配置初始化URLSession。
  6. 为任何已知良好的https URL创建数据任务请求。

期望行为:

请求成功到达目的地。

实际行为:

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

我目前在我们的应用程序中遇到了同样的问题。这似乎只发生在某些运营商的特定用户身上。如果尝试建立LTE连接或在WIFI和LTE之间切换网络类型时,请求似乎会立即失败。最糟糕的是,无论我如何尝试,在我的设备上都无法再现此问题。 - SleepNot
3个回答

9
注意:请查看下面的更新 #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与通过WiFi进行相同请求但未启用waitsForConnectivity之间的时间几乎没有明显差异,就好像waitsForConnectivity在某些情况下启用了一种下一个运行循环的等待期。

更新#1

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

更新#2

增加神秘性的是,相同的示例代码在另外两个开发者的硬件上通过蜂窝网络正常运行。我知道我的硬件很好,因为苹果的应用程序在它上面的LTE上运行良好(在汽车里只有我的手表)。所以有些非常奇怪的事情正在发生。我已经要求苹果DTS调查此问题,他们也无法复制此问题。我会尽快跟进。

更新#3

在我上次更新此帖子之后的几周时间里,我的应用程序中的蜂窝网络请求开始工作了。我没有更改任何关于我的手表的东西,没有软件更新,没有重置,什么都没有。我甚至没有重新编译代码;与先前相同的构建仍然在我的手表上。它就像在其他开发人员的设备上一样按预期工作。

我唯一注意到的奇怪的事情是,我收到了三条连续的来自AT&T的相同短信,通知我我的Apple Watch现在与我的iPhone号码相关联。这很奇怪,因为这种联系据说是在我拆箱晚上发生的,而不是两个月后。我不知道这是否与我的问题有关。我只知道蜂窝网络请求现在可以正常工作。


我有一个非常类似的问题。 我以为 我的应用程序 在移动数据网络上无法工作,但事实证明没有第三方应用程序可以在移动数据网络上工作。 我认为我的运营商设置有些奇怪(就像您提到的那样),但我检查了一下,他们保证它是正常的。 然后我问苹果。他们想让我取消配对并重新配对,所以我正在尝试这样做... - lewis

3

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

config.allowsCellularAccess = true

这很令人困惑,因为苹果文档指出此属性默认情况下应为true...但在我的案例中并非如此。此外,即使我正在使用"后台任务",它们总是需要等待连接,我也设置了waitsForConnectivity = true,以防万一。


我曾经遇到过同样的问题,但后来发现是因为我在手机的移动网络设置中关闭了我的开发应用程序...所以必须将其切换回打开模式。因此,我不需要任何代码来实现,只需要从设置应用程序中调整应用设置即可。我想分享我的经验作为参考。谢谢。 - Ryohei

0

万一有人遇到这个错误,但已经正确设置了所有内容。我正在从xCode运行我的项目到真实设备上,但无法解决互联网连接问题。

在代码中,检查了__DEV__以确定要使用哪个API URL。

我正在为运行而构建,而不是测试,所以我假设它会使__DEV__为false。但它没有,所以我必须更改该检查的代码并将其设置为非本地化的api url。

即使您注入了URL,根据它是否认为它是DEV构建,它也可能无法获取正确的URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接