【Objective-C】Parseを使ってみました


いつもアプリを作るときに「サーバ側もできたらもっとサービスっぽいものが作れそうなのになー」なんて思いながらもフロント側のプログラムばかり書いている私なのですが、先日参加したYAPC::Asiaで教えていただいてこんなサービスがあったのかと感動したので導入だけですがやってみました。

##Parseとは
Parseとは、MBaaS(Mobile Backend as a Service) サービスのひとつです。最近のってるらしいです。MBaaSというのは、モバイル・アプリケーションに必要な主要な機能をサーバーレスで実現することができるサービスです。つまり、主にサーバとの通信やサーバ側での処理を簡単に実装できる環境とライブラリを提供してくれています。すごい。

##登録してみる
[Parse](https://www.parse.com/)へ登録します。登録はメールアドレスとパスワードの入力だけなので特に困ることはないと思います。アプリをひとつ作成して管理画面に移りましょう。アプリの名前は後から変更もできるので、仮でも大丈夫かと思います。管理画面でリクエストやデータの管理できるようです。

![スクリーンショット 2014-09-06 22.38.57.png](https://qiita-image-store.s3.amazonaws.com/0/48393/e831ef36-3310-a318-0bbf-8ccd2574a580.png "スクリーンショット 2014-09-06 22.38.57.png")

##アプリに導入してみる
はじめに、SDKをダウンロードします。今回はiOSアプリ（Objective-C）で実装しますが、他にも様々なプラットフォームへ対応しています。詳しくは[公式ドキュメント](https://www.parse.com/docs/)に一覧があります。また、同ページからSDKをダウンロードできるので、最新版をダウンロードします。SDKがインストールされたプロジェクトも配布されていますが、プロジェクト名はやっぱ自分で決めたかったり後から修正を加えるのも大変そうなので、ちょっと手間ですが自分で新規プロジェクトを作るところからやります。

早速、Xcodeで新規プロジェクトを作成します。今回はHelloWorldくらいのもので終わろうと思うので「SingleViewApplication」で作成しました。

作成したら先ほどダウンロードしたSDKと、必要なライブラリ群をプロジェクト設定のBuild Phasesから追加します。詳細は[QuickStartのページ](https://www.parse.com/apps/quickstart#parse_data/mobile/ios/native/existing)にあります。こんな感じです。

![スクリーンショット 2014-09-06 22.50.28.png](https://qiita-image-store.s3.amazonaws.com/0/48393/f1bd0a55-4de4-2b04-403b-40cd4bc47d49.png "スクリーンショット 2014-09-06 22.50.28.png")

はじめに、AppDelegateのdidFinishLaunchingWithOptions:にアプリの識別と分析のためのコードを追加します。setApplicationIdは[インストール方法](https://www.parse.com/apps/quickstart#parse_data/mobile/ios/native/new)で右上のプルダウンメニューから対象のアプリを選択すると、確認することができます。

```Objective-C:AppDelegate.m
#import "AppDelegate.h"

#import <Parse/Parse.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [Parse setApplicationId:@"appID"
                  clientKey:@"clientKey"];
    
    [PFAnalytics trackAppOpenedWithLaunchOptions:launchOptions];
    
    return YES;
}
```

###データを送る
さっそくデータを送信してみます。コードは数行で、これだけです。すごい。
ここでClassはWebの管理画面で作成しておく必要はなく、送信時に存在しない場合は自動で生成されます。

```Objective-C:ViewController.m
	// send data
    PFObject *object = [PFObject objectWithClassName:@"Object"];
    object[@"name"] = @"test object";
    [object saveInBackground];
```

実行後に管理画面のData Browserで確認すると、新たにObjectクラスが作成されており、Rowがひとつ追加されていると思います。objectIdは重複しないように作成されるobjectを一意に決定する識別子です。
![スクリーンショット 2014-09-06 23.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/48393/1ccf5522-1954-64db-f8df-ba946fd9e983.png "スクリーンショット 2014-09-06 23.03.53.png")

###データを取得する
今度はParseに保存したデータを取得してみます。ひとまず表示するためのLabelを作って、

```Objective-C:ViewController.m
	// create label for debug
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30, 30, 320, 20)];
    [label setText:@"label"];
    [self.view addSubview:label];
```

作ったラベルに取得したデータを表示します。objectIdを指定して、次のように読み込みます。

```Objective-C:ViewController.m
	// get data and update label text to user name on parse
    PFQuery *query = [PFQuery queryWithClassName:@"Object"];
    [query getObjectInBackgroundWithId:@"yFzlwZ5ULO" block:^(PFObject *object, NSError *error) {
        [label setText:object[@"name"]];
    }];
```

こんな感じで取得できます。

![スクリーンショット 2014-09-06 23.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/48393/d46c8450-4c5c-7b36-217f-d25e10ed590d.png "スクリーンショット 2014-09-06 23.10.20.png")

というわけで、今回は本当に導入だけですが、Parseを使い始めてみました。TwitterやFacebookでのログインやサーバでのデータ管理等、小さいアプリでいちいちサーバを立てるのもなあ…という場合にもすごくよいかなという感じです。自分のようにサーバ側わからねええ！みたいなときもいいかもしれません（）。無料プランでもしばらくは使っていけそうなので、これから使いながら続きも書いて見たいと思います。