socket.ioをSwiftでつかってみた。
どうも。あきらかにネタ無くて今やってること書いてます。
まぁとりあえず記事書きます。
Q.socket.ioってなーに?
A.リアルタイム通信を簡単に可能にするwebソケットです。
Q.なにいってかわかんないー簡単に使いたいよー!
A.SIOSocketっていうMITライセンスのOSSラッパーがあるんで使おう。
はい。というわけでSIOSocketをつかったsocket.io今回は紹介しようと思います。
SIOSocketのGithub:MegaBits/SIOSocket · GitHubここをとりあえず見てみましょう。まず使うために
How to use SIOSocket can be added as a CocodaPod, submodule, or standalone dependency to any iOS 7.0 (or greater) project. pod 'SIOSocket', '~> 0.2.0' then... #import <SIOSocket/SIOSocket.h> // ... [SIOSocket socketWithHost: @"http://localhost:3000" response: ^(SIOSocket *socket) { self.socket = socket; }]; or, in Swift... // ... SIOSocket.socketWithHost("http://localhost:3000") { (socket: SIOSocket) in self.socket = socket } A full demo can be found over at MegaBits/WorldPin
をみましょう。podってありますね?そうです。Cocoapods先生を使えということです。(ライブラリを簡単に取り扱うサービスのこと)まずはCocoapodsを入れましょう。入ってるひとは飛ばしてね。
まぁ入れ方はおそらくこの記事的にiOSデベロッパさん向けなのでOSXであると仮定してRubyが入ってるとしておきます。
まずはterminalを立ち上げ
$ sudo gem install cocoapods
とかきます。
そのあとにセットアップで
$ pod setup
これでcocoapodsの準備は完了です。
さて次は適当なiosのプロジェクトを作りましょう。
そしたらそのiosのプロジェクトの中で(もちろんterminalでアクセスしてね)
$ pod init
とうちこんだあと自分ののファイルにはPodfileというなぞファイルが入ってます。
それを開いたらおそらく
# Uncomment this line to define a global platform for your project # platform :ios, '6.0' target 'ach_1' do end target 'ach_1Tests' do end
みたいな感じになってると思います。そこに
# Uncomment this line to define a global platform for your project # platform :ios, '6.0' target 'ach_1' do pod 'SIOSocket', '~> 0.2.0' end target 'ach_1Tests' do pod 'SIOSocket', '~> 0.2.0' end
と記述してください。なにをやってるかも知りたいならググってしらべてね?(まぁimportするターゲット決めてるだけなんですが。)
その後
$ pod install
とそのpodfileのあるとこで打ち込んでください。
そうするとこんな感じに白が多いソリューションファイル的なのができます。そこからxcodeを立ち上げてください。
そしたらswiftで使うためにバインドし無くてはなりません。ので。いわゆるBridging-Headerというやつ。qiita.comこれをみたほうが早いんで割愛します。これで準備は整いました。
さて使うぞと。
onは受信。
emitは送信
これだけ。くらいあんと。はこれだけぇ。。。*1
まぁこんなに時間かけたくないぜという人向けに
class ViewController: UIViewController ,UITableViewDelegate{ var socket:SIOSocket! = nil override func viewDidLoad() { super.viewDidLoad() SIOSocket.socketWithHost("http://なんか入れて/", response: { (_socket: SIOSocket!) in self.socket=_socket //接続時に呼ばれる self.socket.onConnect = {()in print("connrct") } //再接続の時に呼ばれる self.socket.onReconnect = {(attements:Int) in print("reconnrct") } //切断時に呼ばれる self.socket.onDisconnect = {() in print("disconnrcted") } //受信 self.socket.on("イベント名", callback: {(data:[AnyObject]!) in }) // 送信する。 socket.emit("イベント名", args:[]as [AnyObject] ) }) } }
というテンプレートを作っておきました。クソ便利です。これを貼り付けるだけで君もソケットマスターという黒魔術です。知識いりません笑
//受信したい時 self.socket.on("イベント名", callback: {(data:[AnyObject]!) in //なんか書く(JSONのパースとか⇩) let dic = data[0] as? NSDictionary var getdata = dic["キーの名前"] }) // 送信するとき socket.emit("イベント名", args:[]as [AnyObject] )
受送信はこれを使い回す感じで。
もしクロージャ内でレイアウトの変更やtabelviewの更新の時は
//スレッドの設定((UIKitのための let _q_global: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); let q_main: dispatch_queue_t = dispatch_get_main_queue(); //を外側に書いておいて(いわゆるフォアグランドのとき) //そしてクロージャの中でレイアウト変更したいときは dispatch_async(q_main, { //処理みたいな感じ。 })
こんな感じです。
えっ?わからない?いやこれでデータ投げるだけです。はい。調べてね☆
サーバー側はちょっと紹介できないですガ。。。。いつかNode.jsで書いたやつ出したいと思います。
かなり多くの情報がありますがかなり入門向けとしてはわかりやすいかと思います。
*1:サーバーはルームの概念とかnamespaceとかあって設計大変デスケド。。。