[IOS - Swift] 웹소켓을 이용한 오픈채팅방 구현

서프로·2023년 4월 14일
0
post-thumbnail

웹소켓(WebSocket)이란

  • 서버와 클라이언트 간의 양방향 통신
  • 한 번의 연결로 여러번의 데이터 송수신 가능
  • HTTP 보다 훨씬 적은양의 헤더를 사용
  • ex) 채팅, 주식어플 의 실시간 주가

StartScream 라이브러리 이용

IOS 에서 제공하는 URLSessionWebSocketTask을 이용하여 웹소켓을 사용할 수 있지만, Starscream 사용하여 좀 더 손쉽게 웹소켓 통신을 구현할 수 있음.

  1. 설치
    Xcode에서 File > Swift Packages > Add Package Dependency...를 선택하고, Starscream의 GitHub URL을 입력하여 설치
  2. import
import Starscream 
  1. 연결 및 해제
	private var socket: WebSocket?
    private let socketUrl = 소켓URL
    
    func connect() {
        let request = URLRequest(url: socketUrl)
        self.socket = WebSocket(request: request)
        self.socket?.delegate = self
        self.socket?.connect()
    }
    
    func disconnect() {
        self.socket?.disconnect()
    }
  1. WebSocketDelegate 프로토콜 채택
extension 소켓클래스: WebSocketDelegate {
    func didReceive(event: Starscream.WebSocketEvent, client: Starscream.WebSocket) {
        switch event {
            
        case .connected(_):
            <#code#>
        case .disconnected(_, _):
            <#code#>
        case .text(_):
            <#code#>
        case .binary(_):
            <#code#>
        case .pong(_):
            <#code#>
        case .ping(_):
            <#code#>
        case .error(_):
            <#code#>
        case .viabilityChanged(_):
            <#code#>
        case .reconnectSuggested(_):
            <#code#>
        case .cancelled:
            <#code#>
        }
    }
}

event에 따라 분기처리를 할 수 있음.
소켓에 들어오는 데이터는 .text에 들어오는데 들어오는 데이터에 맞춰 구현 해주면 됨.
예를 들어

case .text(let string):
            do {
                let decoder = JSONDecoder()
                let result = try decoder.decode(ReceiveMessage.self, from: Data(string.utf8))
                
                if result.event == "message.new" {
                    guard let data = result.messageData else { return }
                    message.append(data)
                    scrollToEnd = true
                }
                
            }
            catch {
                print(error.localizedDescription)
            }

이런 식으로 원하는 코드를 구현 하면 됨.

0개의 댓글