Отмена запроса веб-сокета при переходе в фоновый режим в iOS Swift - PullRequest
0 голосов
/ 03 августа 2020

Итак, я использую iOS 13 функции URLSessionWebSocket.

У меня есть экран, который должен отправлять пинг на другой сокет каждые X секунд. Все работает нормально, пока пользователь не переместит приложение в фоновый режим.

Поскольку мне не нужно выполнять какие-либо запросы в фоновом режиме, я пытаюсь приостановить все задачи URLSessionWebSocketTasks, пока приложение не вернется в передний план.

В моем коде у меня есть несколько задач, хранящихся в словаре socketConnections. У меня также есть BehaviorSubject с именем «inForeground», который указывает состояние. Я слушаю уведомления фона / переднего плана 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: получено уведомление об ошибке

Есть идеи, что могло go ошибаться?

...