ハマりどころが一箇所あったのでラフに記事を書きます。
問題
Socket.IOのクライアントコードを書いたものの、ずっとconnectingで繋がらない。
結論
SocketManagerオブジェクトは、SocketIOClientの生存期間と同じ期間、強参照される必要がある。
問題の書き方
wrong.swift
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
manager = SocketManager(socketURL: URL(string: "http://localhost:8000")!, config: [.log(true), .forceWebsockets(true), .forcePolling(true)])
socket = manager.defaultSocket
socket.on(clientEvent: .connect) { [weak self] data, ack in
print("connect")
self?.socket.emit("join", ["hoge"])
}
socket.on("message") { data, ack in
print("Message received")
print(data)
}
socket.on(clientEvent: .statusChange) { data, ack in
print(data)
print(arc)
}
socket.connect()
}
}
正しい書き方
correct.swift
import UIKit
import SocketIO
class ViewController: UIViewController {
var manager: SocketManager!
var socket: SocketIOClient!
override func viewDidLoad() {
super.viewDidLoad()
manager = SocketManager(socketURL: URL(string: "http://localhost:8000")!, config: [.log(true), .forceWebsockets(true), .forcePolling(true)])
socket = manager.defaultSocket
socket.on(clientEvent: .connect) { [weak self] data, ack in
print("connect")
self?.socket.emit("join", ["hoge"])
}
socket.on("message") { data, ark in
print("Message received")
print(data)
}
socket.on(clientEvent: .statusChange) { data, ack in
print(data)
print(arc)
}
socket.connect()
}
}