iOS - 在使用3G时出现随机的“无法连接到主机”的问题

8
我正在开发一个iOS应用程序,作为业务服务器的轻客户端使用。发送到服务器的请求很多,下载的数据也很多。
我没有使用任何花哨的请求框架,只是使用带有代理的异步NSURLConnection。
该应用程序通常在wifi和3G网络下都能很好地工作,但是一些用户报告称在使用3G时(在美国),会出现随机断开连接的情况。所有请求都可以正常进行,但偶尔会出现"无法连接到主机"(-1004)错误。
这严重影响了用户体验。
以下是一些事实:
1.在wifi下不会出现这种问题。
2.用户报告说在使用3G时其他应用程序没有出现这种情况。
3.这不是超时问题,错误出现在开始连接后的0.3-1.0秒内。
4.我们无法使用traceroute重现此问题。
5.使用SCNetworkReachability,主机似乎是可达的(我知道此API的限制)。
问题:可能是什么原因导致了这个问题?3G和wifi之间的哪些连接属性可能不同?我如何调试它?
目前我唯一能想到的解决办法是,如果上一个请求失败,则尝试重新发送请求。但是,我首先想找到问题的原因。
编辑:问题可能是由我们的路由器之一引起的。IT人员仍在检查问题。

让我们看看你的代码。我知道你的单元测试都通过了,但以防万一 ;) - deleted_user
3个回答

5
所有错误代码都可以在苹果文档的部分中找到,链接如下: CFNetwork Error Codes Reference 代码-1004仅被描述为:
kCFURLErrorCannotConnectToHost
连接失败,因为无法连接到主机。可在OS X v10.6及更高版本中使用。在CFNetworkErrors.h中声明。
它基本上意味着用户有连接(他没有飞行模式,数据流量已打开,并且他的手机已注册在网络中,您有一个有效的URL等),但是被积极地阻止连接到服务器。如果服务器未响应,则在较长的等待时间后,您将遇到类似于超时错误的东西,就像您所描述的那样。这种错误可能是由于某些内容阻止了与服务器的通信,例如用户位于防火墙或代理后。
实际上,该问题可能是由提供商引起的,特别是如果您与一些用户没有问题,而与其他用户有随机问题。
正如其他帖子所说,您可以尝试询问用户的服务提供商,以及有关其位置的更多详细信息,或者在出现错误时他们正在做什么(例如坐在车里或在乡下信号不好)。
如果找不到任何模式,并且错误确实只是随机发生,并且仅针对某些用户,有时候我会认为这只是另一个不可避免的问题,可能是因为移动电话并不能保证始终连接,而一些手机提供商可能并不总是能够传递应该传递的所有数据包...那么您需要做的就是处理错误。
通过简单地重试并且不向用户显示错误,至少在足够的重试次数之后,来解决错误。
最后要考虑的一件事:
如果你的应用程序发送了大量请求和数据,请确保不要通过垃圾邮件式发送大量未完成的请求来“过度消耗”。这可能会导致服务器或途中的某个代理服务器拒绝您的请求,因为它正忙于回答您的其他请求。被拒绝的请求可能会导致出现错误。请确保发送合理数量的请求,以便用户设备有时间“喘息”。
让您的重试方案变得更加智能化,首先在较短的时间内重试多次,如果仍然失败,则增加到下一次重试的时间跨度。

尽管这个答案没有告诉我任何新的东西,但它可能是最好的答案。我会添加重试。 - Sulthan
检查挂起的网络请求的返回代码是无济于事的,因为它已经挂起了。 - deleted_user
不仅如此,为了实现你所说的功能,你还需要为应用程序中的每个网络请求构建一个线程、运行循环、超时和重试计数...这不是正确的解决方案。 - deleted_user
它并没有挂起,因为它已经因错误而失败了。当请求失败时,意味着它已经放弃了。如果你想要数据,你必须发送一个新的请求。如果仍然可以到达,没有理由不再次尝试。如果你正在处理许多请求,你不必使用数百个线程和每个请求的处理程序,你可以编写代码将它们集中处理在一个地方,并确保它们表现良好。只是检查可达性,然后轰炸请求,因为你假设它会工作,这不是一个非常稳定的解决方案。 - jake_hetfield

3
我建议重新考虑一个假设,即它只会影响你的应用程序。即使问题出在他们的互联网连接上,用户也可能只看到你的应用程序存在问题的多种方式。例如,其他应用程序可能会自动重试——用户将只是看到更新速度变慢。或者,对于其他应用程序而言,断开连接根本无关紧要。
你有没有询问受影响的用户使用的是哪个供应商?如果他们全部使用同一移动网络,那么这就表明这是网络问题,而不是你的应用程序问题。

2

我认为这个问题的原因很简单,就是移动数据和互联网接入的本质。你可能知道,当你使用蜂窝连接时,有时候 - 特别是当你在移动时,连接会随着广播塔的变化而切换网络。

你提到你正在下载大量数据,并且间隔很短,我想这会让你的应用更容易出现这个问题。我不相信其他应用不会出现这个问题 - 这只是关于时间的问题。


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