クリスマスにRubyを〜RubyMotionでTwitterクライアント

いよいよクリスマスです。何の因果か毎年、クリスマスって連休とかぶりますよね。国が仕向けているのか因果律の結果なのか、みなさんクリスマスの予定やらコミケのカタログチェックなどで大忙しでこんな記事読んでる暇なんてないでしょうけど、RubyMotionの話です。

この記事は RubyMotion Advent Calendar 2012 の22日目の記事です。

久々にiOSのアプリ書いたので、かなり忘却しており、リバビリがてらRubyMotionの勉強もかねて、Twitterクライアントでも作ってみるかと思い、作ってみました。機能的にはたいしたこともなく、起動時にPinでOAuth認証してから、テーブルビューに#rubymotionの検索結果を表示、フォトアルバムから選択して画像投稿もできるという簡単なものです。

https://github.com/kazhiramatsu/motion-oauth.git

 
app/constant.rbのCONSUMER_KEYとCONSUMER_SECRETを設定してからrakeで起動します。アクセストークンをキーチェインに保存します。テストもろく書いてないのでアレですが、雰囲気は伝わるかと思います。
 
さてRubyMotionで開発するにあたって困るのは、既存のgemが使えないことです。標準ライブラリですら使えない。酷いよ酷すぎるよこんなのってないよ。これじゃObj-Cで書いても大して変わらないよ、と投げ出しそうになりましたが、cocoapodsでObj-Cで作ったライブラリを何ら手を加えることなくRubyコードとして呼び出せるので、RubyMotion凄いです。
 
さて、Twitterクライアントで問題になるのがOAuth認証です。Twitter API 1.1からOAuth認証が必須になります。OAuth 1.0 は自力でやると複雑なのでなんらかのライブラリを使うというのが定番ですが、Obj-CでOAuthのみに特化して使いやすそうなライブラリがありません。せっかくなので自作しました。車輪の再発明です。仕事では絶対しせんが。詳しくはソースを見て下さい。。ただHMAC-SHA1の処理とキーチェインに保存する処理はObj-Cで記述しました。このあたりもcocoapods化しないといけないですね。
 
細かいところでRubyMotionの気になった箇所などを。
 
1.Obj-Cの型チェックがなくなったせいで、typoなどで簡単に落ちます。実行しないとエラーとわからないので、落ちる回数はObj-Cよりかなり増えました。これは地味にイライラします。Xcodeなどを使うとコンパイルが通ればその手のエラーは起きないので。なのでテストは必須でしょう。
 
2.Cライブラリ形式の関数が直接呼び出せない。Securityライブラリの関数などはよく使うので、これは自分でObj-Cでラッパークラス書いて取り込むという感じになります。
 
3.コンパイルするファイルの依存関係をある程度自力で管理しないといけない。includeで外部ファイルのクラスを取り込むときは、自力でロードする順番を管理したりしないといけない。
 
このあたりが改善されれば、より使いやすくなっていい感じになるかなと思います。