TypetalkのWebSocket APIが先日公開されましたので、TypetalkKitとSwiftのWebSocketライブラリStarscreamを使ってiOSシミュレータ上で試してみました。
サンプルアプリはこんな感じ。ブラウザ上から入力したメッセージが、iOSのサンプルアプリ上にすぐに反映されているのがわかります。
来月、東京でTypetalk Hack Tokyoがあるらしいので、導入の手順からまじめに書いてみました。
アプリケーション登録
TypetalkのAPIを利用するためには、オフィシャルの開発ページよりアプリケーションを登録する必要があります。
開発ページに行き、「Register new Application」をクリック。
一番上のアプリケーション名はお好きに決めて下さい。次の「Grant Type」は「Authorization Code」にしてください。 「Homepage URL」は自分のサイトのURLなどを指定しましょう。「Redirect URI」はスキームの部分をユニークにする必要がありますが、試すだけなら「typetalkkit://auth/success」で構いません。 「Authorization Code」の部分以外は後で変更できるので、とりあえず埋めて「Register」をクリックします。
そうすると次のような表示に変わります。「Client ID」、「Client Secret」、「Redirect URL」は後で使うことになります。
コードの取得とフレームワークのビルド
フレームワークビルドツールのCarthageが必要です。あらかじめ、CarthageのReleasesページからパッケージをインストールしておいてください。
WebSocketサンプルコードを取得するためには、ターミナル上で次のように入力します。
1 2 3 4 | $ git clone https: //github .com /safx/Typetalk-WebSocket-Sample .git $ cd Typetalk-WebSocket-Sample $ carthage update $ open TypetalkKit+WebSocketSample.xcodeproj # Xcodeが起動する |
アプリケーションの設定の変更
Xcodeを起動したら、AppDelegate.swiftを開いて、先ほどのアプリケーション登録で設定や取得した値を埋めておきます。
1 2 3 4 5 | Client.sharedClient.setDeveloperSettings( clientId: "Your ClientID" , clientSecret: "Your SecretID" , redirectURI: "Your custome scheme" , scopes: [Scope.my, Scope.topic_read]) |
カスタムURLスキームの設定 (必要なら)
「Redirect URI」のスキーム部分を「typetalkkit」以外にした場合には変更する必要があります。
アプリケーションのInfoタブに飛び、カスタムURLスキームの設定を変更します。URLスキームをRedirectURIのスキーム部分に変更します。
ビルド
あとはXcodeでビルドするだけです。
コード解説
viewDidLoad
のタイミングでconnectWebSocket()
を呼んでStarscreamでのWebSocket接続を確立しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | func connectWebSocket() { if Client.sharedClient.isSignedIn { let url = NSURL(scheme: "https" , host: "typetalk.in" , path: "/api/v1/streaming" )! var socket = WebSocket(url: url) let token = Client.sharedClient.accessToken! socket.headers[ "Authorization" ] = "Bearer \(token)" socket.delegate = self socket.connect() self .socket = socket } else { Client.sharedClient.authorize { (error) -> Void in if (error == nil) { self .connectWebSocket() } } } } |
StarscreamはdelegateベースのAPIを持っており、テキストデータが来たときはwebsocketDidReceiveMessage
が呼ばれます。
1 2 3 4 5 6 7 8 9 10 11 12 | func websocketDidReceiveMessage(text: String ) { let data = text.dataUsingEncoding(NSUnicodeStringEncoding)! let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as [ String :AnyObject] let t = json[ "type" ] as ? String let d = json[ "data" ] as ? [ String :AnyObject] if t != nil && d != nil { if t == "postMessage" { let res = PostMessageResponse(data: d!) self .insertNewObject(res) } } } |
ストリーミングAPIから得られるJSONは、トップレベルに
type
とdata
があり、前者が実行されたAPI名、後者がそのときのデータみたいなので、type
がpostMessage
ならオブジェクトを配列に追加してようにしています。
TypetalkKitはOAuth認証とJSONオブジェクトのデシリアライズに利用しています。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。