Я пытаюсь реализовать клиент веб-сокета с новой поддержкой веб-сокетов 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
Итак, послеотменяя задачу, сокет пытается отключиться дважды. (Я предполагаю, что последняя строка вывода есть, потому что он пытается закрыть уже закрытый сокет, в противном случае возможно, что только метод делегата будет вызван дважды)
Это ошибка в платформе или в моемкод? Что я делаю не так?