iOS 应用 -- 某些设备无法使用蜂窝数据访问我们的域名

7
使用React Native应用(仅测试使用create-react-app生成的应用),一些iPhone用户在使用蜂窝数据连接时几乎无法向我们的API发起网络请求。出现问题的域名指向Amazon弹性负载均衡器(第7层,SSL终止),该负载均衡器指向位于EKS Kubernetes集群内的Nginx反向代理。应用调用的其他API(例如Mapbox)在使用蜂窝数据连接时都能正常工作,包括我们托管在专用服务器上的一个API。唯一无法正常工作的是我们的ELB域上的请求。当用户切换到WiFi后,我们的应用程序可以对该域进行网络请求。这已经在运行iOS 12.3.1的iPhone 7、iPhone 8和iPhone X上观察到。其中一台设备为Verizon,另外5台报告的设备为AT&T。每个API调用都是HTTPS。删除并重新安装应用程序以及重启设备均无法解决该问题。在所有情况下,我们都确认应用在设置 > 蜂窝移动网络 > [应用名称]设置 > [应用名称] > 使用蜂窝数据中启用了蜂窝数据。
该应用使用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容器] -> [服务容器]的设置有时可以工作,但会停止。它几乎表明了一个保持活动状态的情况,就像这个问题。我们将ELB空闲超时设置为默认值(60秒),并将其增加到300秒,但没有明显效果。我们尝试使用Nginx的keep-alive,将其设置为360秒和0秒(完全禁用)。
对于这个域名,我们在Kubernetes集群中托管了各种服务,例如Java和Node.js。该问题对所有服务都有影响。
没有任何Android应用用户报告过这个问题。
遇到此问题的设备始终如一,而非间歇性发生。
由于错误类型,请求从未到达我们的Nginx日志中。

是哪种请求失败了?他们的ISP可能会阻止某些协议吗?内容拦截器扩展程序可能是一个可能的罪犯,但这也应该适用于WiFi。 - Oscar Apeland
请求是通过HTTPS发送到我们的服务器。我们在Android设备上运行相同的React Native JS代码时没有遇到任何问题。 - jowo
他们使用的移动运营商有共同点吗?另外,也许可以在React Native论坛上询问,这可能是JavaScript在执行其功能并产生奇怪的无法追踪的错误。 - Oscar Apeland
还有,请求失败时会出现什么错误? - Oscar Apeland
1
这个https://developer.apple.com/library/archive/qa/qa1941/_index.html或者这个https://github.com/AFNetworking/AFNetworking/issues/2801可能会有所帮助。看起来可能是与保持连接和您的服务器有关的问题。 - Sam Furlong
显示剩余2条评论
1个回答

5

很不幸,我们没有找到明确的解决问题的答案,但我们实现了一个解决方法。

某些使用iOS 12.3.1的手机在使用蜂窝网络时似乎存在问题,原因是Amazon的ELB Classic始终发送“ Connection:keep-alive”响应标头。您可以更改负载均衡器的空闲超时时间,但无法将其设置为0(最小值为1秒)。我们可以通过使用由create-react-app生成的新应用程序来复制iOS连接错误。请求一开始总是有效,然后开始持续失败。

我们通过从ELB切换到网络负载平衡器(AWS NLB)来解决问题。NLB直接与Nginx入口控制器通信。由于它在TCP层级别上,所以NLB层不会更改标头。默认的Nginx控制器根本不发送“ Connection ”响应标头。使用这种新的设置,iOS应用程序在所有设备上都能正常工作。


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