8

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

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

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

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

这对用户体验影响很大。

一些事实:

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

问题 问题的原因可能是什么?3G 和 wifi 的连接属性有哪些不同?我该如何调试它?

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

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

4

3 回答 3

4

所有错误代码都可以在 Apple 文档中找到

CFNetwork 错误代码参考

代码-1004仅描述为

kCFURLErrorCannotConnectToHost

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

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

该问题实际上可能是由提供商引起的,特别是如果您对某些用户没有问题,而对其他用户没有任何问题。

正如其他一些海报所说,您可以尝试向您的用户询问他们的服务提供商,以及有关他们位置的更多详细信息,或者当他们遇到错误时他们在做什么(比如坐在车里或在乡下受到不好的接待)

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

通过简单地重试而不向用户显示错误来消除错误,至少要等到足够的重试次数之后。

最后要考虑的一件事:

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

让你的重试方案成为一个聪明的方案,你可以在更短的时间内重试多次,如果它一直失败,则增加下一次重试的时间跨度。

于 2012-08-03T14:25:06.220 回答
3

I'd revisit the assumption that it's only affecting your application. There's lots of ways users might only see problems with your application even if the problem is with their Internet connection. For instance, perhaps the other applications retry transparently - users would simply see slower update speeds. Or perhaps dropped connections simply don't matter to the other applications.

Have you asked the affected users which provider they are using? If all of them use the same mobile network, that would indicate it's a problem with the network rather than your application.

于 2012-08-03T14:00:59.367 回答
2

在我看来,造成这种情况的原因仅仅是蜂窝数据和互联网访问的性质。您可能知道,当您使用蜂窝连接时,有时 - 特别是在您移动时,连接会在改变广播塔时切换网络。

您提到您正在下载大量数据并且间隔很短,我认为这会使您的应用程序更容易出现此问题,并且我不会接受其他应用程序不会发生这种情况的一秒钟 - 这是关于定时。

于 2012-08-03T14:06:25.027 回答