웹소켓은 서버와 클라이언트가 지속적으로 양방향 통신을 수행할 수 있는 프로토콜로 Swift에서는 URLSessionWebSocketTask를 사용하여 기본적인 웹소켓 연결을 구현할 수 있다. 유명한 라이브러리로는 StarStream이라는 웹소켓 라이브러리가 있다.
import Foundation
class WebSocketManager {
private var webSocketTask: URLSessionWebSocketTask?
func connect() {
let url = URL(string: "wss://your-websocket-url")!
webSocketTask = URLSession.shared.webSocketTask(with: url)
webSocketTask?.resume()
receiveMessage()
}
func sendMessage(_ message: String) {
let message = URLSessionWebSocketTask.Message.string(message)
webSocketTask?.send(message) { error in
if let error = error {
print("웹소켓 메시지 전송 오류: \(error)")
}
}
}
func receiveMessage() {
webSocketTask?.receive { [weak self] result in
switch result {
case .failure(let error):
print("웹소켓 메시지 수신 오류: \(error)")
case .success(let message):
switch message {
case .string(let text):
print("받은 메시지: \(text)")
case .data(let data):
print("받은 데이터: \(data)")
@unknown default:
break
}
}
self?.receiveMessage() // 계속 수신을 대기하도록 재귀 호출
}
}
func disconnect() {
webSocketTask?.cancel(with: .goingAway, reason: nil)
webSocketTask = nil
}
}
기능 | Swift 기본 웹소켓 (URLSessionWebSocketTask) | StarScream |
---|---|---|
자동 재연결 | 수동 재연결 필요 | 자동 재연결 |
RxSwift/Combine 지원 | 직접 Rx 변환해야 함 | Observable / Publisher 내장 |
백그라운드 지원 | 수동으로 관리 필요 | 자동 처리 |
Heartbeat (Keep-Alive) 기능 | 직접 구현해야 함 | 내장 |
JSON 인코딩/디코딩 지원 | 직접 구현 필요 | 자동 변환 가능 |
메시지 필터링 | 직접 구현해야 함 | API 내장 |
구조체(Struct), 열거형(Enum) 지원 | 지원 안됨 (클래스만 가능) | 가능 |
프로토콜 채택 가능 | 가능 | 가능 |
StarStcream은 iOS용 웹소켓 관리 라이브러리로 크게 자동 재연결 지원과 백그라운드 상태에서의 안정적인 유지가 특징이다.