【问题标题】:Canceling web socket request when moving to background in iOS Swift在 iOS Swift 中移动到后台时取消 Web 套接字请求
【发布时间】:2021-06-27 15:08:32
【问题描述】:

所以我使用的是 iOS 13 的 URLSessionWebSocket 功能。

我有一个屏幕应该每隔 X 秒发送一个 ping 到另一个套接字。 在用户将应用移至后台之前,一切正常。

由于我不需要在后台执行任何请求,我正在尝试暂停所有 URLSessionWebSocketTasks,直到应用程序回到前台。

在我的代码中,我有几个任务存储在 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_read_request_report [C16] 接收失败,出现错误“软件导致连接中止”

[websocket] 读取完成但出现错误软件导致连接中止

然后:

连接 16:收到失败通知

有什么想法会出错吗?

【问题讨论】:

    标签: ios swift websocket ios13


    【解决方案1】:

    简短的回答是,如果应用程序进入后台,您将无法暂停和恢复连接。您可以使用backgroundTasks 保持连接处于活动状态,也可以重新构建应用程序的逻辑,以便从头开始重新启动连接(或两者兼而有之)。

    解释: 当您打开套接字连接时,内核/操作系统会代表您的应用程序分配和管理资源(内存、端口)。这是应用程序进入后台时的freed*,以便其他应用程序可以使用它。因此,在应用程序进入后台后,您拥有的打开连接不是long valid,并且无法重复使用,有一些非常具体的例外情况(VOIP 应用程序)。

    如果您选择要求更多时间,操作系统将允许连接保持活动状态,您可以在proper-use-of-beginbackgroundtaskwithexpirationhandler 中找到详细信息。 但是由于后台执行时间是有限的,你应该构建你的应用程序是一种在需要时重新启动连接的方式。

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      相关资源
      最近更新 更多