我正在开发一个iOS应用程序,该应用程序用作商务服务器的瘦客户端。有很多请求发送到服务器,下载了很多数据。

我不使用任何花哨的请求框架,仅使用带有委托(delegate)的异步NSURLConnection

该应用程序通常在wifi和3G上都可以很好地工作

一些用户报告在使用3G时会随机断开连接(在美国)。所有请求都是正确的,但有时请求会失败,并显示“无法连接到主机”(-1004)错误。

这会极大地影响用户体验。

一些事实:

  • 在wifi上不会发生
  • 用户报告说,使用3G时,其他应用程序不会发生这种情况。
  • 这不是超时问题,开始连接后,错误出现0.3-1.0秒。
  • 我们无法使用traceroute重现该问题。
  • 使用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/

    10-13 03:34