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

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

该应用程序通常与WiFi和3G BUT一起使用

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

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

一些事实:

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

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

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

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

解决方法

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

CFNetwork Error Codes Reference

代码-1004仅被描述为

kcfURLErrorCannotConnectToHost

The connection Failed because a
connection cannot be made to the host. Available in OS X v10.6 and
later. Declared in CFNetworkErrors.h.

它基本上意味着用户有一个连接(他不在飞行模式,数据流量打开,他的手机在网络中注册,你有一个有效的URL等),但积极阻止连接到服务器.如果服务器没有响应,你会在更长的等待时间之后遇到更像是超时错误的事情,正如你所描述的那样.
这种错误可能是由阻止服务器流量的事情引起的,例如,如果用户位于防火墙或代理后面,就会发生这种错误.

问题实际上可能是由提供商引起的,特别是如果您对某些用户没有问题,以及其他人的随机问题.

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

如果您找不到任何模式,并且错误实际上只是随机出现而且仅针对某些用户,有时候,我只会认为这是另一个不可避免的问题,可能是因为手机永远无法保证一直连接,并且有些手机提供商可能并不总是提供应该在那里交付的所有软件包的100%……那么你需要做的只是处理错误.

通过简单地重试并且不向用户显示错误来消除错误,至少在经过足够的重试之后才会出现错误.

最后要考虑的事情是:

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

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

iOS – 使用3G随机“无法连接到主机”的更多相关文章

  1. android – 如何在移动设备中检查WIFI和3G(数据计划)中的网络连接启用或禁用?

    我正在开发一个Android应用程序,在我的应用程序中,我想检查网络连接,就像我想检查wifi和3G中的网络连接,如何检查wifi和3G网络.naybody我知道,请对此有所了解.谢谢解决方法这是代码片段.如果网络启用则返回true,否则返回false

  2. android – 异常阅读Wifi / 3G状态

    嗨,我有以下代码,读取网络/Wifi状态:这引发了和这引发了在有人告诉我权限之前,那就是我的Manifest:解决方法你错误地使用了最新的2个权限:useR-permission而不是useS-permission

  3. android – 使用超过3g时找不到证书路径的信任锚,但在WiFi上工作正常

    我的android项目正在使用api15.我使用HttpsURLConnection类通过https连接到服务器.一切都可以正常通过WiFi,但如果我关闭WiFi并运行超过3克我得到以下内容:如果我做错了什么,为什么它会通过WiFi工作?

  4. 在Android上可以同时使用wifi和3G吗?

    我正在做一个项目,需要Android平板电脑通过Wifi与本地网络设备通信,同时通过3G将数据发送到服务器.Android平板电脑每1秒从本地网络设备接收数据.在整个运行时间内不得断开此连接.Android平板电脑将使用HTTP请求将数据发送到服务器一段时间.是否可以同时使WIFI和3G工作?如果没有,对我的问题有任何建议吗?解决方法是的它应该工作.当你下载mms时,你可以观察到这一点,通常即使你的wifi在线上,也只能在3G或数据网络上下载.

  5. 详解IOS判断当前网络状态的三种方法

    这篇文章主要介绍了详解IOS判断当前网络状态的三种方法,网络状态是非常重要的知识,感兴趣的同学,必须要看一下

  6. JMeter学习-009-JMeter 后置处理器实例之 - 正则表达式提取器二多参数获取

    前文简述了通过后置处理器-正则表达式提取器获取HTTP请求响应结果中的特定数据,未看过的亲,敬请参阅JMeter学习-008-JMeter后置处理器实例之-正则表达式提取器(一)。此文主要对正则表达式提取器的正则表达式、模板、匹配数字,三者的关系,做进一步的讲解。例如:模板11中的数字1代表取第一个正则提取式的内容,当为0时,为整个正则表达式完整匹配项。

  7. CentOS挂载NTFS移动硬盘

    yum-yinstallgccautomakeautoconflibtoolmake//安装gcc等编译环境//下载ntfs-3g并编译安装wgethttp://tuxera.com/opensource/ntfs-3g_ntfsprogs-2013.1.13.tgztar–xvzfntfs-3g_ntfsprogs-2013.1.13.tgzcdntfs-3g_ntfsprogs-2013.1.

  8. 验证邮箱是否正确正则表达式

    isNum.matches()){returnfalse;returntrue;判断反馈信息的逻辑处理:userInfoStr=userInfo.getText().toString().trim();contentStr=content.getText().toString().trim();if(!Utils.checkNetworkAvalible()){Toast.makeText(view.getContext(),"网络不可用,请检查网络设置!isMobileNO){alerDialog;re

  9. iOS – 使用3G随机“无法连接到主机”

    什么连接属性可以与3G和WiFi不同?我该怎么调试呢?

  10. c# – 如何与USB 3G调制解调器通讯?

    端口,并与USB调制解调器通话,但SerialPort类需要以“COM”开头的端口名称,否则是异常抛出.但没有一个普通的COM端口工作.而我仍然不知道要使用哪个波特率.我很困惑,被锁在这里–我该怎么做才能达到这个底线?我发现一个漂亮的.NetDLL,它将托管代码使用的本机WindowsRAS,似乎只是我需要的.再次感谢你的时间.

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部