0

I took this piece of code from an example of creating a WebSocket connection with the Starscream library based on UIKit. How can I make it work in my SwiftUI project?

class ViewController: UIViewController, WebSocketDelegate {
    var socket: WebSocket!
    var isConnected: Bool = false
    let server = WebSocketServer()
    var token: String = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        var request = URLRequest(url: URL(string: "wss://-----")!)
        request.timeoutInterval = 5
        request.setValue("https://-----", forHTTPHeaderField: "Origin")
        socket = WebSocket(request: request)
        socket.delegate = self
        socket.connect()
    }   
    func didReceive(event: WebSocketEvent, client: WebSocket) {
        switch event {
        case .connected(let headers):
            isConnected = true
            print("websocket is connected: (headers)")
        case .disconnected(let reason, let code):
            isConnected = false
            print("websocket is disconnected: (reason) with code: (code)")
        case .text(let string):
            if string.contains("token expiring") { print("expiring"); socket.disconnect() }
            print("Received text: (string)")
        case .binary(let data):
            print("Received data: (data.count)")
        case .ping(_):
            break
        case .pong(_):
            break
        case .viabilityChanged(_):
            break
        case .reconnectSuggested(_):
            break
        case .cancelled:
            isConnected = false
        case .error(let error):
            isConnected = false
            handleError(error)
        }     }
TopScrech
  • 5
  • 1

1 Answers1

0

I would recommend wrapping the delegate in an ObservableObject class:

// Change Class Name to Websocket or WebsocketManager instead of WebSocket.
class Websocket: NSObject, WebSocketDelegate, ObservableObject {
    var socket: WebSocket!
    @Published var event: WebSocketEvent?
    var isConnected: Bool = false
    let server = WebSocketServer()
    var token: String = ""
    func didReceive(event: WebSocketEvent, client: WebSocket) {
        self.event = event
    }
    func connect(request: URLRequest) {
        socket = WebSocket(request: request)
        socket.delegate = self
        socket.connect()
    }
}

And then in your View:

struct YourView: View {
    @StateObject var socketDelegate = Websocket()
    var body: some View {
        //your view
            .onAppear {
                var request = URLRequest(url: URL(string: "wss://-----")!)
                request.timeoutInterval = 5
                request.setValue("https://-----", forHTTPHeaderField: "Origin")
                socketDelegate.connect(request: request)
            }.onChange(of: socketDelegate.event) { event in
                switch event {
                case .connected(let headers):
                    isConnected = true
                    print("websocket is connected: (headers)")
                case .disconnected(let reason, let code):
                    isConnected = false
                    print("websocket is disconnected: (reason) with code: (code)")
                case .text(let string):
                    if string.contains("token expiring") { print("expiring"); socket.disconnect() }
                    print("Received text: (string)")
                case .binary(let data):
                    print("Received data: (data.count)")
                case .ping(_):
                    break
                case .pong(_):
                    break
                case .viabilityChanged(_):
                    break
                case .reconnectSuggested(_):
                    break
                case .cancelled:
                    isConnected = false
                case .error(let error):
                    isConnected = false
                    handleError(error)
                }
            }
    }
}

EDIT: Change the class name to Websocket or WebsocketManager as WebSocket is already used by the Starscream library. Check if this solves your error.

Timmy
  • 4,098
  • 2
  • 14
  • 34