从电话呼叫切换到应用程序时,网络连接丢失



iOS应用程序需要IVR电话才能完成验证。用户接听电话并返回应用程序继续。这在早些时候运行得很好,但最近用户从电话切换到应用程序时出现网络连接丢失错误。我使用标准的NSURLSession功能进行服务调用。应用程序使用Soap服务启动IVR调用并返回成功/失败响应。错误日志:

[connection]nw_read_request_report[C2]接收失败,出现错误";软件导致连接中止";

任务<91526D5A-BF8-416A-B035-9441BA6CC550>lt;1>HTTP加载失败,1807/0字节(错误代码:-1005[4:-4](任务<91526D5A-BF8-416A-B035-9441BA6CC550>lt;1>已完成,但出现错误[-1005]错误域=NSURLError域代码=-1005";网络连接为丢失"UserInfo={_kCFStreamErrorCodeKey=-4,NSUnderlyingError=0x28086bd80{错误域=kCFErrorDomainCFNetwork代码=-1005";(null(";UserInfo={NSErrorPerAddressKey=<CFData0x282592670[0x1ddd28660]>{长度=16,容量=16,字节=0x100201bbc7676c18000000000000},_kCFStreamErrorCodeKey=-4,_kCFStreamErrorDomainKey=4}},_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask<91526D5A-BF8-416A-B035-9441BA6CC550>lt;1>,_NSURLError相关URLSession任务ErrorKey=("LocalDataTask<91526D5A-BF8-416A-B035-9441BA6CC550>lt;1>"(,NSLocalizedDescription=网络连接丢失。,NSErrorFailingURLStringKey=https://www.url?wsdl,NSErrorFailingURLKey=https://www.url?wsdl,_kCFStreamErrorDomainKey=4}网络连接丢失。

在iOS 13及更高版本上进行了测试。操作系统似乎断开了网络连接一段时间,应用程序无法接收到web服务的响应。

这在我的案例中起到了作用:在AppDelegate中。

var backgroundUpdateTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0)
func endBackgroundUpdateTask() {
UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
self.backgroundUpdateTask = UIBackgroundTaskIdentifier.invalid
}
func applicationWillResignActive(_ application: UIApplication) {
self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
self.endBackgroundUpdateTask()
})
}
func applicationDidBecomeActive(_ application: UIApplication) {
self.endBackgroundUpdateTask()
}

这里没有神秘之处。一旦你切换到另一个应用程序,该应用程序就会退出活动状态(并挂起,即没有CPU时间(。此外,一旦应用程序在后台并保持其状态(如果实现(,操作系统就没有义务将其保存在内存中,并且可以随时杀死它。

连接(其操作系统部分、套接字等(在挂起时超时,或在应用程序终止时断开连接。有一种方法是通过后台任务来完成一些在应用程序变为非活动状态之前绝对需要完成的事情。唯一的一点是,严格建议不要使用超过30-60秒的后台任务,否则任务会被杀死。后台任务会超时,但可能会因版本而异。显然,你的案例不太适合后台任务,下载数据可能需要更长的时间,而且你无法控制需要多长时间,你需要一个类似于"服务";或";守护进程";。不确定它们是否存在于ios中。

尝试阅读:iOS:保持应用程序像服务一样运行

需要检查的另一件事是后台应用程序刷新。它允许应用程序不时醒来并做一些有用的事情:https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparaing_your_ui_to_run_in_the_background/updateing_your_app_with_background_app_refresh?language=objc