iOSとRailsを連携させたアプリの簡単なつくり方

Pocket

以前「スマホ&Heroku連携!事例に学ぶ無駄のないチーム開発の極意」と題してiPhoneアプリとRailsアプリの連携について書かせて頂いたのですが、どうにも具体的な話ができなかったのが心残りでした。なので、具体的なサンプルを元に、もう少し具体的な話をしてみたいと思います。

ソースコードの置き場所

動作例

動作している様子を動画に録って見ました。

Rails側の見所

Rails側の見所は認証部分だと思います。

ApplicationController

パラメータにtoken=tokenが設定されている場合にBASIC認証を行う、と言う感じのコードになっています。BASIC認証で通信する場合はCSRFトークンの要求を回避するためにunless条件をつけています。このコードだけだと実際にアクセスされたときにBASIC認証の要求が有効にならないので、以下のようなコードを各コントローラにつけてあげて下さい。

その他のController

ApplicationControllerのbefore_filterにつけても、もちろん構いません。

設計についてですが、BASIC認証を行う必要があるのはiOSからのアクセスだけなので、UserAgentを見て判定しても良いかも知れません。とはいえこのあたりをあまり絞り込みすぎてもテストがしづらくなる一方なので、何かしらのパラメータがある場合にBASIC認証モードにする、というのがお手軽かなーと思います。

そもそもBASIC認証なんぞ使わない、という論点もあります。その場合はxAuthを使うのがお手軽でしょう。サーバ側にはOAuth Providerとしてのソースコードが増えることになりますが、Railsなら簡単に書けますね。

後はCookieを保持してセッションを張る方法もありますが、AFNetworkingで書く方法が分かりません……ご存知の方がいたら、教えていただけたらありがたいなーと思います。

iOS側の見所

iOS側ではAFNetworkingというライブラリを使って通信を組み立てます。AFHTTPClientクラスを継承したクラスを作って、お好みでサーバとのインターフェースを作っていくのが大体の方針です。

MLNoteClient.h

今回はNoteモデルに対するCRUDを作ります。サーバと通信するクライアントはシングルトンにしておくのが良いでしょう。

MLNoteClient.m

Railsの例と違って、やたらコードが長いのが玉にキズですね。

BASIC認証

BASIC認証は以下のコードで実現しています。

emailとpasswordを設定した時点で、Authorization Headerに値を設定しています。これで通信を行うときはいつでも認証を通すことになります。

エラーコードが返ってきた時のブロック

AFHTTPClientのメソッドのままだと、失敗時の引数がAFHTTPRequestOperationで何とも使いにくいので、上のコードではステータスコードとサーバ側のエラーメッセージを返すようにしています。

実際に使っているところ

MLMasterViewController.m

ブロックで書けるのが良いですねー。

まとめ

認証さえ何とかなれば、比較的簡単にサーバと連携できることが分かりました。あとはクライアントでデータをキャッシュしたりして、無駄な通信を減らしたりする事で、よりUXを高めることができると思います。

この記事が皆様のご参考になれば幸いです。