Итак, я использую 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 ошибаться?