SwiftとAlamofireでNulabのチャットサービスTypetalkのSwift用APIを書いてみました。
Typetalkの全APIを使えるようにはなっているので、とりあえずGitHubで公開します。
SwiftとAlamofireで何か書きたかったので、試しに作ってみました。
Nulabの創立10周年カンファレンスに間に合わせたかったので、コードはDRYじゃない感じになっています。
コード書き替え中なので、現段階ではソースコードを見てわかる人以外の利用はおすすめしません。
ライブラリ利用上の注意
- とりあえずサーバの全APIをラップしてひととおり動きます
 - コールバックベースのAPI
 - 今のところドキュメントはありません
 - OAuth2はSafari経由でAuthorization Codeを取得する方法のみサポートしています (Client Credentialはサポートしていません)
 - ライブラリはまだstableでないので、APIは変更する可能性があります
 - JSONシリアライズあたりの処理がゴミなので落ちても泣かないこと
 
サンプルコード
サンプルコードを動かすには次のようにしてください。
- 自身のClientID、SecretID、リダイレクトURLを取得する。リダイレクトURLは
typetalkkit://oauth2/のようなカスタムURLスキームを利用する。 - Info.plistにカスタムURLスキームを登録する (サンプルでは
typetalkkitを登録済み) - AppDelegate.swiftに自身のClientID、SecretID、リダイレクトURLを指定する
 
作ってみた感想
Alamofireが便利
ドキュメントがちゃんとした実用例みたいなコードが挙がっているので、参考になりました。
今回は、API Parameter Abstractionあたりのコードを参考にしました。
例えば、投稿メッセージリストの取得を、Alamofireでは例えば次のように書くことができます。
Alamofire.request(Router.GetMessage(1234))
         .responseJSON { ... }
上記のように書くためには、次のような感じでRouterを書いておけば、サーバへのリクエスト関連をまとめることできます。Swiftのenumが便利なかんじです。
public enum Router : URLRequestConvertible {
    case GetTopics
    case GetMessages(TopicID)
    private var methodAndPath: (Alamofire.Method, Scope, String) {
        switch self {
        case .GetTopics               : return (.GET, "topics")
        case .GetMessages(let topicId): return (.GET, "topics/\(topicId)")
        }
    }
    private var method: Alamofire.Method { return methodAndPath.0 }
    private var path: String             { return methodAndPath.1 }
    public var URLRequest: NSURLRequest {
        var request = NSMutableURLRequest(URL: (NSURL(string: "https://typetalk.in/api/v1/" + path)))
        request.HTTPMethod = method.toRaw()
        return request
    }
}
モデルへのシリアライズもResponse Serialization あたりのコードを参考にしたらすっきり書けそう、ということで現在ここらを書き替え中です。
モデルのシリアライズやデシリアライズ処理を書くのがつらい
コードの8割はモデルとそのテストな感じです (100% Pure SwiftにしたかったのでMantleは利用しないことにしました)。
今ならAlamofire-SwiftyJSONとかArgoを使えば楽に書けた気がします。
モデルが割と多い上に、ドキュメントのレスポンスの例だけでは何が返されるのか今いちわからないので苦労しました (TeamInviteとTopicInviteがあるのが最後のほうで気づいたり)。
モデルあたりのコードを楽に書く方法をご存じの方は教えてください。

0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。