はじめに
Ruby on Railsサーバーアプリと連権するiPhoneアプリを超簡単に書けるObjectiveResourceに付いて書かせて頂きます吉田裕美です、宜しくお願いいたします。
この記事は、iPhoneアプリを開発には詳しくないWebアプリを主に開発しているプログラマーと、Webアプリの開発には詳しくないiPhoneアプリのプログラマー両方の方に読んでいただけるよな構成になっています。
- iPhone開発経験者の方は
- iPhone編(本稿)は「ObjectiveResourceとは」を読んだら「iPhone開発入門は」さっと目を通し、
- Ruby on Rails編はじっくりと読んでください。
- Ruby on Rails開発経験者の方は
- iPhone編(本稿)はじっくりと読んでください。
- Ruby on Rails編はRuby on Railsとは」と「Ruby on Rails開発入門」さっと目を通し「ObjectiveResourceを使う」を読んでください。
ObjectiveResourceとは
ObjectiveResourceはホームページに、
ObjectiveResource is a framework for the iPhone that makes
interacting with Ruby on Rails applications dead simple.
と書かれているように、iPhoneアプリとRuby on Railsで作られたサーバーアプリを超簡単に連携するフレームワークです。iPhone SDKにあるAPIだけ使ってサーバーと連携する場合、サーバー側にはXMLやJSONでやり取りができるサービスを構築し、iPhone側からはHTTPプロトコルを使い情報を送ったり、受け取ったりします。
例えばiPhone側でHTTPプロトコルを使った通信を行うには、以下のようなコードを書く必要がります。
- NSURLRequestでリクエストを作成
- NSURLConnectionで通信
- 通信エラーの処理
- 受信XMLデータをパース。XMLのパースにはNSXMLParserを使ったSAX風パーサーを書く必要があります。また、JSONを使う場合は、iPhone SDKにはJSONライブラリが無いので、オープンソースのライブラリを探してくる必要があります。
ObjectiveResourceは、こういった面倒なサーバーとの通信処理を、データをやり取りするためのシンプルなクラスを用意するだけ実現できます。
以下は、TODO、いつ(due)、何を(task)行うかの情報をObjectiveResourceを使って通信する際に用意するTodoクラスのインターフェース定義です(コードの詳細は後述します)。データを格納するだけのシンプルなクラスを定義し、そこにObjectiveResourceのヘッダーファイルをimportし、オブジェクトのIDを格納するインスタンス変数、ここではtodoIdを追加しただけです。
#import <Foundation/Foundation.h> #import "ObjectiveResource.h" @interface Todo : NSObject { NSString *todoId; NSDate *due; NSString *task; } @property (nonatomic , retain) NSString *todoId; @property (nonatomic , retain) NSDate *due; @property (nonatomic , retain) NSString *task; @end @implementation Todo @synthesize todoId, due, task; - (void) dealloc { [todoId release]; [due release]; [task release]; [super dealloc]; } @end
なお、以下のようなサーバーの情報を与える初期設定を書くだけで、アプリがアクセスするサーバーを指定できます。
[ObjectiveResourceConfig setSite:@"http://localhost:3000/"];
また、サーバーから全Todoデータを取得するには以下のように記述し、
NSArray *todos = [Todo findAllRemote];
新規データをサーバーに登録するには以下のように記述するだけで簡単に行えます。
Todo *todo = [[Todo alloc] init]; todo.due = [NSDate date]; todo.task = @"コンサートの予約"; [todo saveRemote];