iOS 应用程序 - 在某些设备上无法通过蜂窝网络访问我们的域

Posted

技术标签:

【中文标题】iOS 应用程序 - 在某些设备上无法通过蜂窝网络访问我们的域【英文标题】:iOS app -- no cellular access to our domain on some devices 【发布时间】:2019-10-08 04:21:47 【问题描述】:

使用 React Native 应用程序(仅测试使用 create-react-app 生成的应用程序),一些 iPhone 用户遇到了一个问题,即当通过蜂窝数据连接时,应用程序几乎永远无法向我们的 API 发出 Web 请求。有问题的域指向一个 Amazon Elastic Load Balancer(第 7 层,SSL 终止),它指向一个 nginx 反向代理(在 EKS Kubernetes 集群内)。该应用程序调用的其他 API(例如 Mapbox)在蜂窝数据上运行良好,包括我们托管在专用服务器上的一个。唯一不起作用的请求是我们 ELB 域上的请求。当用户切换到 WiFi 时,我们的应用能够向该域发出网络请求。这已在运行 ios 12.3.1 的 iPhone 7、iPhone 8 和 iPhone X 上观察到。一个设备是 Verizon,另外 5 个报告是 AT&T。每个 API 调用都是 HTTPS。删除并重新安装应用程序并重新启动设备并不能解决问题。我们在所有情况下都确认在Settings > Cellular > [App name]Settings > [App name] > Use Cellular Data 中为该应用启用了蜂窝数据。

该应用是使用 React Native 构建的,并且 Web 请求是使用 cross-fetch 库执行的。

我们能够获得有问题的设备并通过 Xcode 运行它。这是 Xcode 中捕获的错误堆栈的子集:

nw_connection_copy_connected_local_endpoint [C12] Connection has no local endpoint
2019-06-27 11:26:16.841347-0400 myapp[23700:1527268] [BoringSSL] 
nw_protocol_boringssl_get_output_frames(1301) [C10.1:2][0x117d5a050] get output frames failed, state 8196
2019-06-27 11:26:22.465855-0400 myapp[23700:1527305] [BoringSSL] nw_protocol_boringssl_error(1584) [C20.1:2][0x119b0e420] Lower protocol stack error: 54
2019-06-27 11:26:22.466665-0400 myapp[23700:1527305] TIC TCP Conn Failed [20:0x280022400]: 1:54 Err(54)
2019-06-27 11:26:23.040101-0400 myapp[23700:1527399] Task <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7> HTTP load failed (error code: -1005 [1:54])
2019-06-27 11:26:23.040408-0400 myapp[23700:1527305] Task <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7> finished with error - code: -1005
load failed with error Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=_kCFStreamErrorCodeKey=54, NSUnderlyingError=0x283a521f0 Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo=NSErrorPeerAddressKey=<CFData 0x28161ab70 [0x1e9e5d420]>length = 16, capacity = 16, bytes = 0x100201bb3416ca8a0000000000000000, _kCFStreamErrorCodeKey=54, _kCFStreamErrorDomainKey=1, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7>"
), NSLocalizedDescription=The network connection was lost.

对此特定 [ELB] -> [Nginx 容器] -> [服务容器] 设置的查询偶尔会起作用,但随后会停止。它几乎表示像this issue 这样的保持活动状态。我们将 ELB 空闲超时设置为默认值(60 秒),然后将其增加到 300 秒,但没有明显影响。我们尝试将 Nginx 的 keep-alive 设置为 360s 和 0s(完全禁用)。

对于有问题的域,我们在 Kubernetes 集群中托管了多种服务,例如 Java 和 Node.js。这个问题对他们所有人的影响都是一样的。

android 应用用户均未报告此问题。

遇到此问题的设备都是一致的,不是间歇性的。

由于错误类型,请求永远不会到达我们的 Nginx 日志。

【问题讨论】:

失败的请求是什么样的?是否有可能某些协议可能被其 ISP 阻止?内容拦截器扩展可能是罪魁祸首,但这也应该适用于 WiFi.. 对我们服务器的请求是 HTTPS。我们在 Android 设备上完全没有任何问题(运行相同的 React Native JS 代码).. 他们使用的蜂窝提供商有什么共同点吗?另外,也许在 React Native 论坛上问,可能是 javascript 在做它的事情并制造了奇怪的无法追踪的错误。 而且,请求失败的错误是什么? 这个 developer.apple.com/library/archive/qa/qa1941/_index.html> 或这个 github.com/AFNetworking/AFNetworking/issues/2801> 可能会有所帮助。似乎它可能与保持活动和您的服务器有关。 【参考方案1】:

很遗憾,我们从未找到问题的明确答案,但我们确实实施了解决方法。

蜂窝网络上的某些 iOS 12.3.1 iPhone 似乎存在问题,即亚马逊的 ELB Classic 总是发送“连接:保持活动”响应标头。您可以更改负载均衡器的空闲超时,但不能将其设置为 0(最小值为 1 秒)。我们可以通过使用create-react-app 生成的新应用来重现iOS 连接错误。请求总是首先工作,然后开始持续失败。

我们通过从 ELB 切换到网络负载均衡器 (AWS NLB) 解决了这个问题。 NLB 直接与 Nginx 入口控制器对话。由于它在 TCP 级别,因此 NLB 层不会更改标头。默认的 Nginx 控制器根本不发送“连接”响应标头。使用这种新设置,iOS 应用程序可以在所有设备上正常运行。

【讨论】:

以上是关于iOS 应用程序 - 在某些设备上无法通过蜂窝网络访问我们的域的主要内容,如果未能解决你的问题,请参考以下文章

App Store 提交仅限于某些 iOS 目标设备

iOS 应用程序可以在通过 WiFi 进行“无线配件配置”时使用蜂窝互联网连接吗?

反应原生无法从蜂窝网络找到位置

我无法在某些 ios 设备(ipad 和 iphone)上播放 HTML5 视频

需要更新以在此iphone上使用蜂窝数据?

iOS 应用因无法下载而被拒绝