お腹.ヘッタ。

関数型とかセキュリティとか勉強したい。進捗つらぽよ

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のあるとこで打ち込んでください。
そうするとf:id:taketarou2:20150707225330p:plainこんな感じに白が多いソリューションファイル的なのができます。そこから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とかあって設計大変デスケド。。。