我正在开发一个iOS应用程序,它可以作为商务服务器的瘦客户端。发送到服务器的请求很多,下载了大量数据。
我不使用任何花哨的请求框架,只使用委托的异步NSURLConnection
。
应用程序通常可以很好地兼容wifi和3G 但
一些用户在使用3G时会报告随机断开连接(在美国)。所有请求都是okey但偶尔请求失败并显示“无法连接到主机”(-1004)错误。
这会影响用户体验。
一些事实:
SCNetworkReachability
主机似乎可以访问(我知道此API的限制)。问题问题可能是什么原因?什么连接属性可以与3G和WiFi不同?我该如何调试呢?
目前,我看到的唯一解决方案是,如果先前的请求失败,则尝试再次发送请求。但是,我想首先找到问题的原因。
编辑问题可能是由我们的某个路由器引起的。 IT人员仍在检查这个问题。
答案 0 :(得分:4)
所有错误代码均可在Apple文档的
部分找到CFNetwork Error Codes Reference
代码 -1004 仅描述为
kCFURLErrorCannotConnectToHost
连接失败,因为a 无法与主机建立连接。适用于OS X v10.6和 后来。在CFNetworkErrors.h中声明。
它基本上意味着用户有一个连接(他不在飞行模式,数据流量已打开,他的手机在网络中注册,你有一个有效的URL等),但积极阻止连接到服务器。如果服务器没有响应,你会在更长的等待时间之后遇到更像是超时错误的事情,正如你所描述的那样。 这种错误可能是由阻止服务器流量的事件引起的,例如,如果用户位于防火墙或代理后面,就会发生这种错误。
问题实际上可能是由提供商造成的,特别是如果您对某些用户没有问题,以及其他用户的随机问题。
正如其他一些海报所说,您可以尝试向您的用户询问他们的服务提供商,以及有关他们的位置的详细信息,或他们在收到错误时所做的事情(例如坐在车内或接收不良农村)
如果找不到任何模式,并且错误实际上只是随机出现而且仅针对某些用户,有时候,我只会认为这是另一个不可避免的问题,可能是由于手机永远不能保证一直连接,并且有些手机供应商可能并不总是提供应该在那里交付的所有包装的100%......你需要做的就是处理错误。
通过简单地重试并且不向用户显示错误来构建错误,至少在经过足够的重试后才会显示错误。
最后要考虑的事情是:
如果您从应用程序发送大量请求以及大量数据,请确保通过向大量未完成的请求发送垃圾邮件来“过度消费”。这可能会导致服务器或某些代理服务器拒绝您的请求,因为它太忙于回答您的其他请求。被拒绝的请求可能会导致这样的错误。确保发送合理数量的请求,以便用户的设备有时间“呼吸”。
让你的重试方案成为一个聪明的方案,你可以在较短的时间内重试多次,如果它一直失败,增加下一次重试的时间跨度。
答案 1 :(得分:3)
我重新考虑它只影响你的应用程序的假设。用户可能只有很多方式查看应用程序的问题,即使问题与他们的Internet连接有关。例如,可能其他应用程序透明地重试 - 用户只会看到更慢的更新速度。或者,丢弃的连接对其他应用程序来说无关紧要。
您是否向受影响的用户询问了他们使用的提供商?如果它们都使用相同的移动网络,则表明它与网络有关而不是您的应用程序。
答案 2 :(得分:2)
在我看来,其原因仅仅归结于蜂窝数据和互联网接入的本质。您可能知道,当您使用蜂窝连接时,有时 - 特别是如果您正在移动,连接将在更改广播塔时切换网络。
你提到你正在下载大量数据并且间隔时间很短,我认为这会使你的应用程序更容易出现这个问题,我不会接受一秒钟,这对其他应用程序不会发生 - 这是关于时间的。