Соединение через WebSocket через StarsCream в IOS - PullRequest
0 голосов
/ 03 октября 2019

В настоящее время я использую клиент Action Cable для подключения к URL и подписки на канал. Но у библиотеки, похоже, есть некоторые проблемы, так как она иногда не может подписаться на канал. Ниже приведен мой текущий код установки для клиента Action Cable

func setupActionCable(){

        guard let urlString = URL(string: "wss://mysocketurl.com/path") else {return}

        let headers = ["Origin":"https://mysocketurl.com"]
        self.client = ActionCableClient(url: urlString, headers:headers)

        self.client?.willConnect = {
            print("Will Connect")
        }

        self.client?.onConnected = {
            print("Connected to \(String(describing: self.client?.url))")
            print("Client = \(String(describing: self.client))")
            self.createChannel()
        }

        self.client?.onDisconnected = {(error: ConnectionError?) in
            print("Disconected with error: \(String(describing: error))")
        }

        self.client?.willReconnect = {
            print("Reconnecting to \(String(describing: self.client?.url))")
            return true
        }

        self.client?.onPing = {

            guard let channel = self.channel else {return}
            print("Ping received = \(String(describing: channel))")
        }
    }

    func createChannel(){

        let room_identifier = ["room_id" : roomID]
        self.channel = client?.create("MyChannel", identifier: room_identifier)

        self.channel?.onSubscribed = {
            print("Subscribed to \(self.ChannelIdentifier) with simulation Id = \(self.simulationID)")
        }

        self.channel?.onReceive = {(data: Any?, error: Error?) in

            print("****** channel response data = \(String(describing: data))")
            if let error = error {
                print(error.localizedDescription)
                return
            }
        }

        self.channel?.onUnsubscribed = {
            print("Unsubscribed")
        }

        self.channel?.onRejected = {
            print("Rejected")
        }
    }

Теперь я пытаюсь перейти на starscream для решения этой проблемы. Но я не совсем уверен, как настроить его ниже, это мой стартовый код. func setupStarScream () {

        var request = URLRequest(url: URL(string: "wss://mysocketurl.com/path")!)
        request.httpMethod = "POST"
        request.timeoutInterval = 5
        socket = WebSocket(request: request)
        socket.delegate = self
        socket.connect()
    }

Это всегда дает мне ошибку "Invalid HTTP upgrade". Возможно, потому что я не добавил детали происхождения и канала, как в кабеле действий. Но я не знаю, как пойти добавить это здесь. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 октября 2019

Попробуйте это

func setupStarScream(){
        var request = URLRequest(url: URL(string: "wss://mysocketurl.com/path")!)
        request.addValue("https://mysocketurl.com", forHTTPHeaderField: "Origin")
        socket = WebSocket(request: request)
        socket?.delegate = self
        socket.connect()
    }

После подключения создайте такой канал

func websocketDidConnect(socket: WebSocketClient) {
        print("websocket is connected")
        createChannel()
    }

func createChannel()
    {
        let strChannel = "{ \"channel\": \"MyChannel\",\"room_id\": \"\(roomID)\" }"
        let message = ["command" : "subscribe","identifier": strChannel]

        do {
            let data = try JSONSerialization.data(withJSONObject: message)
            if let dataString = String(data: data, encoding: .utf8){
                self.socket?.write(string: dataString)
            }

        } catch {
            print("JSON serialization failed: ", error)
        }

    }
...