提问者:小点点

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


iOS 应用需要拨打 IVR 电话才能完成验证。用户接听电话并返回到应用以继续。这在早期工作正常,但是,最近当用户从电话切换到应用程序时开始出现网络连接丢失错误。我正在使用标准的 NSURL 功能进行服务调用。应用使用 Soap 服务启动 IVR 呼叫并返回成功/失败响应。错误日志:

[连接]nw_read_request_report[C2]接收失败,错误软件导致连接中止

工作

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


共2个答案

匿名用户

这在我的案例中奏效:在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/preparing_your_ui_to_run_in_the_background/updating_your_app_with_background_app_refresh?language=objc