Parseからニフティクラウドmobile backendへの乗り換えてみた（iOS版　データストア）

# 主旨

アプリ開発者で[Parse](http://parse.com/)を知らない人はあまりいないかと思いますが、１月２９日、来年終了しますよというショックニュースが・・
うちのブログもこんな[記事](http://blog.mb.cloud.nifty.com/?p=7372)を出しています。

今回Parseユーザー向けに、検討材料として、乗り換え方法を調べて試したことを紹介します。今回対象はParseから[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/about.htm)に切り替える方法を紹介します。

開発者ではない方には、Nifty mBaaSでは「[乗り換え相談窓口](https://inquiry.nifty.com/webeq/pub/mbaas/replace)」を設けていますので、ぜひお気楽に！

プッシュ通知を見たい方はこちらの[プッシュ通知版の記事](http://qiita.com/thuydg@github/items/ce63423d25ff5ddacac5)があります。

# 乗り替える基本的なステップ

   - SDKをインポート
   - アプリ内、SDKを利用宣言
   - ニフティクラウドmobile backendでアプリ作成、キー(ApplicationKey, ClientKey)を取得
   - アプリ内で初期化
   - 実装コードを変更
   - その他：データー移行、設定変更

実際にやってみます！

# 前提

ParseのiOS v.1.12クイックスタートでデーターストア機能を動いているアプリは以下になります.(Xcode7.0)

![parse_ios1.png](https://qiita-image-store.s3.amazonaws.com/0/18698/79f1fdd5-420e-d7eb-466d-62f142d12ba8.png)

プロジェクト：

![parse_ios2.png](https://qiita-image-store.s3.amazonaws.com/0/18698/e23275c8-d98f-720c-adbb-cadb4bdf215f.png)

コード：

```objc
    // ****************************************************************************
    // Uncomment and fill in with your Parse credentials:
     [Parse setApplicationId:@"APP ID" clientKey:@"CLIENT KEY"];
    //
    // If you are using Facebook, uncomment and add your FacebookAppID to your bundle's plist as
    // described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/
    // [PFFacebookUtils initializeFacebook];
    // ****************************************************************************

    //Data Save
    
    PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
    gameScore[@"score"] = @1337;
    gameScore[@"playerName"] = @"Sean Plott";
    gameScore[@"cheatMode"] = @NO;
    [gameScore saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (succeeded) {
            // The object has been saved.
        } else {
            // There was a problem, check error.description
        }
    }];

```

# (1) ニフティクラウドmobile backendのSDKをインポート

こちらの[SDKダウンロードページ](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_ios.html)の通りに、Pod経由し、SDKをインストールしていきます。

まず、ターミナルで以下コマンドにてpodでインストール

```
pod init
```

Podfileを修正

```
platform :ios,'6.0'

target "YOUR_APP_TARGET" do
   pod 'NCMB', :git => 'https://github.com/NIFTYCloud-mbaas/ncmb_ios.git'
end
```

インストールコマンドを実行

```
pod install
```

インストール結果

```
pod install
/Library/Ruby/Gems/2.0.0/gems/cocoapods-0.39.0/lib/cocoapods/command.rb:129: warning: Insecure world writable dir /usr in PATH, mode 040777
Updating local specs repositories


CocoaPods 1.0.0.beta.2 is available.
To update use: `gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Analyzing dependencies
Pre-downloading: `NCMB` from `https://github.com/NIFTYCloud-mbaas/ncmb_ios.git`
Downloading dependencies
Installing NCMB (2.2.4)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `ParseStarterProject.xcworkspace` for this project from now on.
```

現在のプロジェクトを閉じて、ParseStarterProject.xcworkspaceのファイルを開きます。

![parse_ios3.png](https://qiita-image-store.s3.amazonaws.com/0/18698/710d2b99-899d-8c04-b61b-21eb6497893b.png)

# (2) アプリ内、SDKを利用宣言

AppDelegate.mに以下のように追加します

```objc
#import <NCMB/NCMB.h>
```

# (3)ニフティクラウドmobile backendでアプリ作成、キー(ApplicationKey, ClientKey)を取得

ニフティクラウドmBaaSの画面でアプリ作成、アプリ名を設定し、アプリ作成完了すると、二つキー（ApplicationKey, ClientKey）が作成されます。

![20151209_qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/18698/09d6702f-e5d3-f69b-2f98-f9b156b8542a.png)

![20151209_qiita3.png](https://qiita-image-store.s3.amazonaws.com/0/18698/f240fbf1-aea5-307d-50df-6aa959d1ca65.png)

# (4)アプリ内で初期化

以下のようにAppDelegateのdidFinishLaunchingWithOptionsメソッドを修正します。

修正前

```objc
[Parse setApplicationId:@"APP ID" clientKey:@"CLIENT KEY"];
```

修正後

```objc
[NCMB setApplicationKey:@"APP KEY" clientKey:@"CLIENT KEY"];
```

# (5)実装コードを変更

Niftyのmobile backendのSDKはParse SDKに互換性が高くて、実装コードには修正ところは少ないようですね！❤️

修正前

```objc
  PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
    gameScore[@"score"] = @1337;
    gameScore[@"playerName"] = @"Sean Plott";
    gameScore[@"cheatMode"] = @NO;
    [gameScore saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (succeeded) {
            // The object has been saved.
        } else {
            // There was a problem, check error.description
        }
    }];
```

修正後

```objc
    NCMBObject *obj = [NCMBObject objectWithClassName:@"GameScore"];
    [obj setObject:@1337 forKey:@"score"];
    [obj setObject:@"Sean Plott!" forKey:@"playerName"];
    [obj setObject:@NO forKey:@"cheatMode"];
    [obj saveInBackgroundWithBlock:^(NSError *error) {
        if (error) {
            // There was a problem, check error.description
        } else {
            // The object has been saved.
        }
    }];
```

# その他：データー移行、設定変更など

ここに関しては難しいところかなと思いますので、知っている範囲で書いてみます。

* ParseではExport機能あり, [Data migration](http://blog.parse.com/announcements/introducing-parse-server-and-the-database-migration-tool/)ツールもリリーされました。
* ニフティクラウドmobile backendではデーターストアの新規クラス作成する時、CSV、Json, txtどちらもインポートできますが、会員データーやinstallation(プッシュ通知配信端末)データーという既存のものであればできません。
* アプリ設定はそれぞれ違うので、検討した方が良さそうです！
* Nifty mBaaSでは「[乗り換え相談窓口](https://inquiry.nifty.com/webeq/pub/mbaas/replace)」を設けていますので、ぜひお気楽に！

# 参考

[Parse](http://parse.com/)
[Nifty mobile backend](http://mb.cloud.nifty.com/about.htm)