PhoenixFramework の WebSocket に iOS からつなぐ

PhoenixFramework の WebSocket に iOS から繋ぐのはとても簡単だった。

Awesome iOS with ? で、 Swift で書かれている中から Starscream を選んで使ってみた。README にでかでかと表示されたロボットがカッコよかったので。

PhoenixFramework は ES6 で書かれた WebSocket 通信のためのクラスが最初から用意されてて、その仕組みに乗るとすごく楽なので、Swift 側で同じ仕組みに乗るような通信をすればよい。PhoenixFramework で実装された WebSocket の Chat を使ってみる。

PhenixFramework では、特定の topic に join するというのがあるが、これは JSON に event: "phx_join" というのを付けて送ってる模様。また、まだ良く理解できていないが毎通信ごとに ref というカウンターをインクリメントしてるので倣ってみる。 topic には、Phoenix 側で使ってる topic をそのまま入れれば、あとは好きなように payload にデータを入れてやり取りすればOKなようだった。とても簡単。

下記のようなコードで、Phoenix 側と通信して、 JavaScript で繋がってるブラウザとやり取りが出来た。

import UIKit
import Starscream
class ViewController: UIViewController, WebSocketDelegate {
var socket = WebSocket(url: URL(string: "ws://10.0.1.2:4000/socket/websocket")!, protocols: [])
override func viewDidLoad() {
super.viewDidLoad()
socket.delegate = self
socket.connect()
}
var ref: Int = 0
// MARK: Websocket Delegate Methods.
func websocketDidConnect(socket: WebSocket) {
print("websocket is connected")
ref += 1
let dict = [
"ref" : String(ref),
"topic": "room:ebe99a2c-cccb-4409-8bdd-d1d3b7fa2eb0",
"event": "phx_join",
"payload": ["name": "chu"]
] as [String : Any]
let jsonData = try! JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
socket.write(data: jsonData)
}
func websocketDidDisconnect(socket: WebSocket, error: NSError?) {
if let e = error {
print("websocket is disconnected: \(e.localizedDescription)")
} else {
print("websocket disconnected")
}
}
func websocketDidReceiveMessage(socket: WebSocket, text: String) {
print("Received text: \(text)")
}
func websocketDidReceiveData(socket: WebSocket, data: Data) {
print("Received data: \(data.count)")
}
func sendText() {
ref += 1
let dict = [
"ref" : String(ref),
"topic": "room:ebe99a2c-cccb-4409-8bdd-d1d3b7fa2eb0",
"event": "new_msg",
"payload": ["body": "hello"]
] as [String : Any]
let jsonData = try! JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
socket.write(data: jsonData)
}
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です