通过 ios 中的红蜘蛛进行 Websocket 连接

Posted

技术标签:

【中文标题】通过 ios 中的红蜘蛛进行 Websocket 连接【英文标题】:Websocket connection via starscream in ios 【发布时间】:2020-02-01 13:08:45 【问题描述】:

目前我正在使用Action Cable client 连接到 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")
        
    

现在我正在尝试迁移到红蜘蛛来解决这个问题。但我不太确定如何在下面设置它是我的启动代码。 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】:

试试这个

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)
        

    

【讨论】:

以上是关于通过 ios 中的红蜘蛛进行 Websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章

Swift Network.framework WebSocket 握手 nil 返回

iOS通过SocketRocket实现websocket的即时聊天

通过 Socket.IO 的 WebSocket 设计模式

使用 websocket 进行节点集群

如何通过 Websocket 协议处理 GraphQL 中的文件上传?

是否可以在本地网络/热点中设置 websocket 服务器(android/ios)并通过 PWA 连接?