我正在开发一个iOS应用程序,该应用程序用作商务服务器的瘦客户端。有很多请求发送到服务器,下载了很多数据。
我不使用任何花哨的请求框架,仅使用带有委托(delegate)的异步NSURLConnection
。
该应用程序通常在wifi和3G上都可以很好地工作但
一些用户报告在使用3G时会随机断开连接(在美国)。所有请求都是正确的,但有时请求会失败,并显示“无法连接到主机”(-1004)错误。
这会极大地影响用户体验。
一些事实:
SCNetworkReachability
,主机似乎可以访问(我知道此API的局限性)。 问题可能是什么原因引起的? 3G和wifi的哪些连接属性可能不同?我该如何调试?
目前,我看到的唯一解决方案是,如果先前的请求失败,则尝试再次发送该请求。但是,我想首先找到问题的原因。
编辑问题可能是由我们的路由器之一引起的。 IT人员仍在检查问题。
最佳答案
所有错误代码都可以在Apple文档中的“部分”中找到。
CFNetwork Error Codes Reference
代码 -1004 仅描述为
基本上,这意味着用户已建立连接(他不在飞行模式下,数据流量已打开,并且他的电话已在网络中注册,您具有有效的URL等),但是积极地阻止连接到服务器。如果服务器没有响应,则在经过更长的等待时间后,您可能会遇到更多类似超时错误的情况,如您所描述的。
此类错误可能是由于某种原因导致无法访问服务器的流量,例如,如果用户位于防火墙或代理之后,则可能会发生这种错误。
该问题实际上可能是由提供程序引起的,特别是如果您对某些用户没有问题,而对其他用户则是随机问题。
就像其他海报所说的那样,您可以尝试向您的用户询问有关他们的服务提供商的信息,以及有关他们的位置的更多详细信息,或者在遇到错误时他们正在做什么(例如坐在车上或在农村受到不良接待)
如果您找不到任何模式,并且错误实际上只是随机发生的并且仅针对某些用户,并且有时是错误的,那么我将认为这是另一个不可避免的问题,它可能是由于手机从未使用过保证始终保持连接状态,并且某些手机提供商可能并不总是将应交付的所有包裹中的100%始终交付给您...然后,您需要做的只是处理错误。
通过简单地重试而不向用户显示错误来消除错误,至少要等到足够的重试次数之后才能显示出来。
最后要考虑的一件事:
如果您从应用程序发送了很多请求和大量数据,请通过发送大量未完成的请求来确保您不会“过度消费”。这可能会导致服务器或某些代理服务器在路上拒绝您的请求,因为它太忙于回答您的其他请求。拒绝的请求可能会导致类似的错误。确保发送合理数量的请求,以便用户的设备有时间“呼吸”。
让您的重试方案成为一种聪明的方案,您可以在较短的时间内重试很多次,然后继续尝试,如果它仍然失败,请延长下一次重试的时间间隔。
关于iOS-3G随机 "Cannot connect to host",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11748382/