在iOS Swift中移动到后台时取消web套接字请求
所以我使用的是iOS 13的URLSessionWebSocket功能 我有一个屏幕,应该发送一个ping到另一个插座每X秒。 在用户将应用程序移动到后台之前,一切正常 因为我不需要在后台执行任何请求,所以我尝试挂起所有URLSessionWebSockettask,直到应用程序返回前台 在我的代码中,有几个任务存储在socketConnections字典中。 我还有一个名为“inForeground”的BehaviorSubject,它指示状态。 我正在收听UIScene的后台/前台通知,并执行以下操作:在iOS Swift中移动到后台时取消web套接字请求,ios,swift,websocket,ios13,Ios,Swift,Websocket,Ios13,所以我使用的是iOS 13的URLSessionWebSocket功能 我有一个屏幕,应该发送一个ping到另一个插座每X秒。 在用户将应用程序移动到后台之前,一切正常 因为我不需要在后台执行任何请求,所以我尝试挂起所有URLSessionWebSockettask,直到应用程序返回前台 在我的代码中,有几个任务存储在socketConnections字典中。 我还有一个名为“inForeground”的BehaviorSubject,它指示状态。 我正在收听UIScene的后台/前台通知,并执
@objc func appDidMoveToBackground(_ notification: Notification) {
inForeground.onNext(false)
for (taskId, task) in socketConnections {
task.suspend()
}
}
@objc func appDidBecomeActive(_ notification: Notification) {
inForeground.onNext(true)
for (id, task) in socketConnections {
task.resume()
setReceiveHandler(id)
}
}
private func setReceiveHandler(_ taskId: String) {
guard let foregroundState = try? self.inForeground.value(), foregroundState else {
print("not in foreground")
return
}
socketConnections[taskId]?.receive { [unowned self] result in
do {
let message = try result.get()
print("\(message)")
self.setReceiveHandler(taskId)
} catch let error {
print(error.localizedDescription)
}
}
}
当我移动到背景和前景时,仍然会出现错误:
nw_读取_请求_报告[C16]接收失败,错误为“软件导致连接中止”
及
[websocket]读取已完成,但软件导致连接中止
然后:
连接16:收到故障通知
有什么问题吗?简单的回答是,如果应用程序转到后台,则不能挂起和恢复连接。您可以使用使连接保持活动状态,也可以重新构造应用程序的逻辑,使其从头开始重新启动连接(或两者兼而有之) 解释如下: 当您打开套接字连接时,内核/操作系统代表您的应用程序分配和管理资源(内存、端口)。当应用程序进入后台以便其他应用程序可以使用时,即为*。因此,在应用程序进入后台后,您拥有的开放连接不是也不能重复使用,但有一些非常特殊的例外情况(VOIP应用程序) 如果您选择请求更多时间,以便操作系统允许连接保持活动状态,您可以在中找到详细信息。 但由于后台执行时间有限,您应该构建应用程序,以便在需要时重新启动连接