RailsとiPhoneアプリの最速連携


RailsとiPhoneを連携するサービスを作りかたを紹介する本やブログはあるが、どれも認証だったり、色々煩雑な機能をつけた本格的な物を作っているので正直途中でバージョン違いだったり、ちょっとしたタイプミスで動かなくなることがよくあります。

そこで、セキュリティ上問題はあるかもしれませんが、最低限の通信する機能のみを実装する方法を紹介したいと思います。

実際に作るものはこんな感じです。名前を登録する機能とその一覧を取得する機能のみのシンプルなものです。

![作製するアプリの画像](http://f.cl.ly/items/1r1Z2K1S0a3a2j0I3b1v/2.png)

##Rails側の準備
最低限の機能のみ必要なので、ここでは便利なscaffoldを使います。
Railsで"NameList"という名前のプロジェクトを作って、データベースの作製まで行います。
そして、今回のアプリでは簡易的なアプリを作製するのでCSRFタグの認証機能を無効化します。

```Bash:Terminal
rails new NameList
cd NameList
bundle install
rails g scaffold top name:string
rake db:migrate
```

```ruby:…/NameList/app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  skip_before_filter :verify_authenticity_token # csrf対策の無効化
end
```

```Bash:Terminal
rails s
```

Rails側の準備はこれだけです。

rails sでサーバーを立ち上げ、ブラウザでlocalhost:3000/topsにアクセスするとこんな感じになっています。
いつものscaffoldの画面ですね。

![ブラウザにアクセスするとこんな感じ](http://f.cl.ly/items/3M042K3r233D462g353r/2013-11-28%2010.43.37.png)

##iPhone側の準備
Xcodeで新規プロジェクト"iPhone2Rails"の名前で作製します。



![作成画面](http://f.cl.ly/items/080T0K321M2y3y370G11/b.png)



その後storyboadで必要な物を配置して、コードとつなげます。


![storyboard](http://f.cl.ly/items/1j2y2U0e1Y292j3F321j/2013-11-27%2013.31.32.png)

###CocoaPodsによるAFNetworkingのフレームワークの追加
ここで、http通信を行うにあたって楽に通信をするためにAFNetworkingのフレームワークを用います。
導入にはCocoaPodsを使います！
CocoaPodsについて知らない人は[こちら](http://qiita.com/MERON/items/de7a0027a10068e472b3)をご参照下さい

iPhoneアプリのルートディレクトリで、pod initでPodfileを生成して、ライブラリを記述し、インストールします

```Bash:Terminal

$ cd iPhone2Rails
$ pod init

```

```ruby:Podfile
platform :ios, "7.0" #コメントを外して :ios, '7.0'にすることを忘れずに

target "iPhone2Rails" do
pod 'AFNetworking', '~>2.4.1' #追加
end

target "iPhone2RailsTests" do↲

end

```

```bash:Terminal

$ pod install

```

上手くインストールできたら、iPhone2Rails.xcworkspaceというファイルが生成されているので、一度プロジェクトを閉じて、そちらを開きます。

![openxcworkspace.png](https://qiita-image-store.s3.amazonaws.com/0/18783/d1337a8d-0480-778a-8ae0-fcb997b688d5.png "openxcworkspace.png")



###POST・GETメソッドの実装
まずは、Railsにデータを送るPOSTメソッドを実装します。
最初は、このままコピペするだけで、大丈夫です。
注意するところは、URL、パスの指定とパラメータの設定する部分です。


```objectivec:ViewController.m
//サーバーのあるURLの設定
#define NAMELISTURL @"http://localhost:3000/tops.json"

- (IBAction)postData:(id)sender {//テキストフィールドのデータの送信
    
    //送信パラメータの準備
    NSDictionary *params = [NSDictionary dictionaryWithObject:self.txfInputName.text forKey:@"top[name]"];
    
    //HTTP通信クライアントの作製
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager POST:NAMELISTURL parameters:params
         success:^(AFHTTPRequestOperation *operation, id responseObject){
             
             //通信が成功した時の処理
             NSLog(@"success: %@", responseObject);
         }
         failure:^(AFHTTPRequestOperation *operation, NSError *error){
             
             //通信が失敗した時の処理
             NSLog(@"error: %@", error);
         }];
}
```

iPhoneを起動して名前を入力し、登録ボタンを押した時にコンソールに下のような表示がでていると通信成功です！
![通信ログ内容.png](https://qiita-image-store.s3.amazonaws.com/0/18783/5e0f5086-9228-428f-fd8e-8caa319db7ea.png "通信ログ内容.png")



データの取得GETメソッドも同様に作製します。



```objectivec:ViewController.m

- (IBAction)getData:(id)sender {
    
    //HTTP通信クライアント生成・通信処理
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:NAMELISTURL parameters:nil
         success:^(AFHTTPRequestOperation *operation, id responseObject){
             
             //データの取得に成功した時の処理
             NSLog(@"success: %@", responseObject);
         }
         failure:^(AFHTTPRequestOperation *operation, NSError *error){
             
             //データの取得に失敗した時の処理
             NSLog(@"error: %@", error);
         }];
}
```



これでコンソール画面に登録した内容がJSONで表示されれば通信は完了です。あとは、名前が空の時は登録させなかったり、色々バリデーションをつけるといいでしょう。

##まとめ
とりあえず登録する機能とそのデータの取得できる機能を実装しました。
希望があればデータの更新と削除についてもアップしたいと思います。

作製したサンプルアプリは[こちら](https://github.com/wakusei-meron-/iPhone2Rails)