Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS Swift中移动到后台时取消web套接字请求_Ios_Swift_Websocket_Ios13 - Fatal编程技术网

在iOS Swift中移动到后台时取消web套接字请求

在iOS Swift中移动到后台时取消web套接字请求,ios,swift,websocket,ios13,Ios,Swift,Websocket,Ios13,所以我使用的是iOS 13的URLSessionWebSocket功能 我有一个屏幕,应该发送一个ping到另一个插座每X秒。 在用户将应用程序移动到后台之前,一切正常 因为我不需要在后台执行任何请求,所以我尝试挂起所有URLSessionWebSockettask,直到应用程序返回前台 在我的代码中,有几个任务存储在socketConnections字典中。 我还有一个名为“inForeground”的BehaviorSubject,它指示状态。 我正在收听UIScene的后台/前台通知,并执

所以我使用的是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应用程序)

如果您选择请求更多时间,以便操作系统允许连接保持活动状态,您可以在中找到详细信息。 但由于后台执行时间有限,您应该构建应用程序,以便在需要时重新启动连接