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

标签 ios iphone react-native mobile-data

使用 React Native 应用程序(仅测试了使用 create-react-app 生成的应用程序),一些 iPhone 用户遇到了一个问题,即当通过蜂窝数据。有问题的域指向 Amazon Elastic Load Balancer(第 7 层,SSL 终止),它指向 Nginx 反向代理(在 EKS Kubernetes 集群内)。应用程序调用的其他 API(例如 Mapbox)在蜂窝数据上运行良好,包括我们托管在专用服务器上的 API。唯一不起作用的请求是我们 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 构建的,网络请求是使用 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 日志。

最佳答案

不幸的是,我们从未找到问题的明确答案,但我们确实实现了解决方法。

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

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

关于iOS 应用程序——在某些设备上无法通过蜂窝网络访问我们的域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56243941/

相关文章:

ios - 只有在将方向更改为横向并返回纵向后才能正确显示纵向布局

iphone - 如何访问tableview中的单元格?

javascript - 处理长文本的聪明方法

reactjs - 是否可以将 Material UI 库与 React Native 一起使用?

ios - Objective-C - InputStream 到 NSString

ios - 向导航栏添加阴影的问题

iphone - 从相机和相机胶卷加载和保存图像时出现问题。我究竟做错了什么?

ios - 单例改变整数

ios - 垂直对齐添加为文本字段右 View 的 UIImageView 与 skyfloatinglabeltextfield 的文本

react-native - 如何在 native react 中将选定的自定义复选框数据发送到下一页?