ios - 在哪些错误之后应该重新启动网络任务?

标签 ios networking nsurlsession

现在我正在尝试为我的应用程序构建网络系统。我希望我的网络操作能够在网络故障后自行重试。这就是苹果对这种行为所说的(Designing for Real-World Networks):

For requests made at the user’s behest:

Always attempt to make a connection. Do not attempt to guess whether network service is available, and do not cache that determination. If a connection fails, use the SCNetworkReachability API to help diagnose the cause of the failure. Then:

  • If the connection failed because of a transient error, try making the connection again.
  • If the connection failed because the host is unreachable, wait for the SCNetworkReachability API to call your registered callback. When the host becomes reachable again, your app should retry the connection attempt automatically without user intervention (unless the user has taken some action to cancel the request, such as closing the browser window or clicking a cancel button).


我成功地实现了这个功能,但我很难确定“暂时性错误”到底是什么。

现在我收到 NSURLErrorNotConnectedToInternet 后正在重试任务, NSURLErrorNetworkConnectionLost , NSURLErrorInternationalRoamingOff , NSURLErrorCallIsActive , NSURLErrorDataNotAllowedNSURLErrorTimedOut和 HTTP 状态码在 500…599 范围内,但我不确定这些是否足够。

我很高兴听到更有经验的开发人员的建议,他们也使用重试行为。你如何决定什么时候重试任务,什么时候不重试?

提前致谢!

最佳答案

NSURLErrorNetworkConnectionLost : 短暂错误后返回。立即重试或稍作延迟后重试。
NSURLErrorNotConnectedToInternet : 没有连接时返回。等待可达性改变后再重试。
NSURLErrorInternationalRoamingOff :当您使用非家庭蜂窝连接且数据漫游关闭时返回。等待可达性改变后再重试。
NSURLErrorCallIsActive :当用户在不支持同时语音和数据的网络上打电话时返回。等待可达性改变后再重试。
NSURLErrorDataNotAllowed :仅当您明确表示您的请求不应通过蜂窝网络发生并且用户未使用 Wi-Fi 时才返回。等待可达性改变后再重试。
NSURLErrorTimedOut :当连接尝试超时等待来自服务器的初始响应时返回。可能是暂时的网络错误。立即重试,但将尝试次数限制在少量,然后再将网络视为已关闭并等待可达性更改后再重试。可能开始可达性检查并再次并行尝试请求。
服务器错误不太可能是由网络故障引起的,也不太可能在立即重试时发生变化。处理这些问题的方式取决于您的应用程序,但可能涉及存储数据并在一段时间后重试,告诉用户服务器已损坏(如果用户可能能够对其进行处理),自动发送给您的服务器团队的故障单等。

关于ios - 在哪些错误之后应该重新启动网络任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461477/

相关文章:

iOS TumblrSDK 发布照片问题

ios - 使用计时器更改注释上的图像 - Swift

ios - 没有互联网连接时调用 "didFailLoadWithError"?

linux - 测量两个精确站点之间的速度

ios - NSURLSession.sharedSession().dataTaskWithRequest(request) 最后执行

swift - 如何使用 URLSession 在异步 api 调用中查找哪个响应属于哪个请求

ios - 尝试从 iOS 中的 Singleton 类初始化 ManagedObjectContext

c++ - 安全服务器不工作

python-3.x - 在 Python 中使用 pymc 随机化网络

ios - UIImagePNGRepresentation 导致 HTTP 错误 403