iOS - 使用3G随机"无法连接到主机"

Sul*_*han 8 nsurlconnection 3g ios

我正在开发一个iOS应用程序,它可以作为商务服务器的瘦客户端.有很多请求发送到服务器,下载了大量数据.

我不使用任何花哨的请求框架,只是NSURLConnection与委托异步.

该应用程序通常适用于WiFi和3G BUT

一些用户在使用3G时会报告随机断开连接(在美国).所有请求都是okey,但偶尔请求失败并显示"无法连接到主机"(-1004)错误.

这会对用户体验产生很大影响.

一些事实:

  1. 它不会发生在wifi上
  2. 用户报告说使用3G时其他应用程序不会发生这种情况.
  3. 这不是超时问题,启动连接后错误出现0.3-1.0秒.
  4. 我们无法使用traceroute重现问题.
  5. 使用SCNetworkReachability主机似乎是可以访问的(我知道此API的限制).

问题问题可能是什么原因?什么连接属性可以与3G和WiFi不同?我该怎么调试呢?

目前我看到的唯一解决方案是,如果先前的请求失败,则尝试再次发送请求.但是,我想首先找到问题的原因.

编辑问题可能是由我们的一个路由器引起的.IT人员仍在检查问题.

jak*_*eld 5

所有错误代码都可以在 Apple 文档的 部分找到

CFNetwork 错误代码参考

代码-1004仅描述为

kCFURLError无法连接到主机

由于无法与主机建立连接,因此连接失败。适用于 OS X v10.6 及更高版本。在 CFNetworkErrors.h 中声明。

这基本上意味着用户有连接(他没有处于飞行模式,数据流量已打开,并且他的手机已在网络中注册,您有一个有效的 URL 等),但被主动阻止连接到服务器。如果服务器没有响应,正如您所描述的,在较长的等待时间后,您会遇到更像超时错误的情况。此类错误可能是由阻止服务器流量的原因引起的,例如,如果用户位于防火墙或代理后面,则可能会发生这种错误。

该问题实际上可能是由提供商引起的,特别是如果您与某些用户没有问题,而与其他用户之间存在随机问题的话。

正如其他发帖者所说,您可以尝试向用户询问他们的服务提供商,以及有关他们位置的更多详细信息,或者他们在收到错误时正在做什么(例如坐在车里或在乡村接收不良)

如果您找不到任何模式,并且如果错误确实只是随机发生并且仅针对某些用户,并且只是有时,我会认为这是另一个不可避免的问题,可能是由于手机永远无法得到保证而引起的始终保持连接,并且某些手机提供商可能并不总是 100% 交付应交付的所有包裹...那么您需要做的就是处理错误。

通过简单地重试来消除错误,并且不向用户显示错误,至少在经过足够次数的重试之后。

最后要考虑的一件事:

如果您从应用程序发送大量请求和大量数据,请确保您不会通过垃圾邮件发送大量未完成的请求来“过度消耗”。这可能会导致服务器或某些代理服务器拒绝您的请求,因为它太忙于回答您的其他请求。拒绝的请求可能会导致类似的错误。确保发送合理数量的请求,以便您的用户的设备有时间“呼吸”。

让您的重试方案成为一个明智的方案,您首先在较短的时间内重试多次,如果仍然失败,请增加下一次重试的时间跨度。