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 で繋がってるブラウザとやり取りが出来た。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} |