iOS 13 URLSessionWebSocketTask пытается отключиться дважды - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь реализовать клиент веб-сокета с новой поддержкой веб-сокетов URLSession. Вот моя простая реализация:

import Foundation

class WebSocketTest: NSObject {
    var session: URLSession?
    var task: URLSessionWebSocketTask?

    init(urlRequest: URLRequest) {
        super.init()
        self.session = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue())
        self.task = self.session?.webSocketTask(with: urlRequest)
    }

    public func connect() {
        self.task?.resume()
    }

    public func disconnect() {
        self.task?.cancel(with: .goingAway, reason: nil)
    }
}

extension WebSocketTest: URLSessionWebSocketDelegate {
    func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) {
        print("Connected!")
    }

    func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) {
        print("Disconnected!")
    }
}

Это мой вызывающий код:

let url = URL(string: "wss://echo.websocket.org")!
var request = URLRequest(url: url)
request.addValue("https://example.com", forHTTPHeaderField: "Origin")
self.webSocketTest = WebSocketTest(urlRequest: request)
self.webSocketTest?.connect()

DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
    self.webSocketTest?.disconnect()
}

И это результат выполнения:

Connected!
Disconnected!
Disconnected!
Connection 1: received failure notification

Итак, послеотменяя задачу, сокет пытается отключиться дважды. (Я предполагаю, что последняя строка вывода есть, потому что он пытается закрыть уже закрытый сокет, в противном случае возможно, что только метод делегата будет вызван дважды)

Это ошибка в платформе или в моемкод? Что я делаю не так?

...