ニフティクラウドmobile backendの事始めと導入手順まとめ

## 概要：Parse.comに代わる選択肢としてニフティクラウドmobile backendを使用してみる

2016年の1月29日にParse.comが1年後に終了するという発表がされ衝撃が走りました。私も今まで書いてきたParseで作成したサンプルアプリケーションやそれに関連する記事はどうしようか？という部分に関してはかなり迷いました。当面はParseに関する記事自体は残しておきますが、ニフティクラウドmobile backendを使用したサンプルアプリケーションの作成に関しても今後は追いかけて行ければと思います。

+ [ニフティクラウド](http://mb.cloud.nifty.com/about.htm)

まだ個人的に使いこなしているわけではないのですが、今回はアカウントの作成や使用する上での下準備の段階の部分から疎通試験までをざっくりとまとめてみましたので参考になれば幸いです。

## 準備：ニフティクラウドmobile backendのアカウントを作成

ニフティクラウドmobile backendのアカウントの作成の際には、@niftyに登録する必要がありますがこちらは基本的には上記のニフティクラウドのページから手順に従って進めば問題なく作成できるかと思います。

__①まずはニフティクラウドmobile backendのトップページへ進む：__
トップページの左下にある「今すぐ無料登録」のページから進んで下さい。

![mb_toppage.png](https://qiita-image-store.s3.amazonaws.com/0/17400/a6e8262b-6d26-50ec-1929-675a9d605b8e.png)

__②＠niftyへの会員登録を行う：__
画面のところから@niftyのアカウントを作成を行って下さい。その後は作成したアカウントでニフティクラウドmobile backendの管理画面へログインを行って下さい。

![mb_registration.png](https://qiita-image-store.s3.amazonaws.com/0/17400/de4f8d31-3eee-b913-385e-23fff477c444.png)

__③管理画面の確認と新規アプリの作成：__
ログインに成功すると、下記のような画面が出てくるかと思います。この部分でデータやストレージの管理やアプリに関する管理を行います。

![mb_control_panel.png](https://qiita-image-store.s3.amazonaws.com/0/17400/d4434520-104c-4692-628d-79e4d25a300b.png)

また新しいアプリを作成する場合はナビゲーション上部にある「+新しいアプリ」のところをクリックしてアプリを作成します。この時にアプリケーションキーとクライアントキーが作成されます。※こちらは後からでも確認ができます。

![mb_create_new_app.png](https://qiita-image-store.s3.amazonaws.com/0/17400/10eff9a8-4da2-b74f-7e00-03bc41db9219.png)

以上でニフティクラウドmobile backendの準備は完了しましたので次はmobile backendのSDKを導入する手順に関して紹介していきます。

## 設定：mobile backend SDKをCocoapodsで導入する

私の方の使用環境は下記になります：
・OS X 10.10.5 Yosemite
・XCode 7.2
・Swift2.1.1

次にXCodeで新しいプロジェクトを作成します。

ニフティクラウドmobile backendの導入に関しては公開されているリポジトリからzipファイルをダウンロードして手動で導入する方法とCocoapodsを利用して導入する方法がありますが、今回はCocoapodsを経由してインストールする手順を解説します。任意のプロジェクトの中にPodfileを作成し、Podfileに記載を行います。

※参考：[ニフティクラウドmobile backendをCocoapodsなしで導入する場合のSDKはこちら](https://github.com/NIFTYCloud-mbaas/ncmb_ios/)

__①Podfileを作成：__

```
$ sudo vim Podfile
```

__②Podfile内に下記の記述を行う：__

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

__③NCMBのインストールを実行：__

```
$ pod install
```

__④Briging-Headerファイルを追加する：__

ニフティクラウドmobile backendはObjective-Cで書かれていますのでSwift内で利用する場合は`[プロジェクト名]-Briging-Header.h`ファイルを追加する必要があります。このファイルを追加する場合には、objective-Cのファイルを追加して、拡張子の`xxxxx.m`ファイルを削除して、ヘッダファイルへ下記の記述をしてあげればOKです。

```objective-c:XXX-Bridging-Header.h
#import <NCMB/NCMB.h>
```

Swiftで作成されたファイルにObjective-Cのファイルを追加した際には、下記のようなダイアログが表示されるかと思いますので、「Create Bridging Header」のボタンを押して下さい。

![briding-header.png](https://qiita-image-store.s3.amazonaws.com/0/17400/d5f90254-2a7f-97a1-063f-08adc965afdd.png)

その後はプロジェクトの「Build Settings」で「Objective-C Briding Header」という項目が追加されていますので、その中に `$(SRCROOT)/$(PROJECT)/XXX-Bridging-Header.h`という記述を追加して下さい。

![bridging-header-setting.png](https://qiita-image-store.s3.amazonaws.com/0/17400/3d7f205e-97ed-90a4-874b-c80de9bb4e2a.png)

（参考）Bridging-Headerの導入に関する参考

+ [Swiftプロジェクトにブリッジングヘッダを追加する方法](http://qiita.com/titoi2/items/abe7b58a9e644b29e8c3)
+ [[Swift] プロジェクトに Bridging-Header.h ファイルを追加する](http://s-prism3.seesaa.net/article/416187615.html)
+ [Bridging Headerのファイル作成と設定を簡単に行う手順](http://easyramble.com/setup-bridging-header-easily.html)

ここまででニフティクラウドmobile backendのプロジェクトファイルへの導入は完了しました。あとは実際にコードを書いて疎通試験をしていく感じになります。

## コード：仮のデータを用いての疎通試験を行う

それでは実際にニフティクラウドmobile backendとの接続ができているかのテストをしていきます。今回はあくまで疎通試験ができればOKですのでAppDelegate.swiftに直接記述していきたいと思います。

今回のサンプルに関して参考にしたのは下記の記事になります。このサンプルをSwift2.x系にさらに書き直したものが下記のソースになります。

+ [NiftyCloud（MBaaS）のiOSクイックスタートをObjective-CからSwiftに書き換えてみた](http://qiita.com/VirgomanBros/items/294c456de28ccd311644)

```AppDelegete.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    
    //"xxx"：アプリケーションキー, "yyy"：クライアントキー
    NCMB.setApplicationKey("xxx", clientKey: "yyy")
    
    let query: NCMBQuery = NCMBQuery(className: "TestClass")
    query.whereKey("message", equalTo: "Hello, NCMB!")
    query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in
        
        if error == nil {
            
            if objects.count > 0 {
                let msg: AnyObject? = objects[0].objectForKey("message")
                let msgStr: String = msg as! String
                print("success find data. \(msgStr)")
            } else {
                var saveError : NSError? = nil
                let obj : NCMBObject = NCMBObject(className: "TestClass")
                obj.setObject("Hello, NCMB!", forKey: "message")
                obj.save(&saveError)
                
                if saveError == nil {
                    print("success save data.")
                } else {
                    print("failure save data. \(saveError)")
                }             
            }
            
        } else {
            print(error.localizedDescription)
        }
    })
    
    return true
}
```

この状態でシミュレーターを起動すると、画面が呼び出された"TestClass"テーブルにデータが何もない場合は新規データが1件追加され、すでにデータがある際は"TestClass"テーブルからデータを1件抽出してくる処理を行っています。

![mb_save_message_complete.png](https://qiita-image-store.s3.amazonaws.com/0/17400/12de4c3e-cb1d-987b-976d-25b2373c8753.png)

以上ざっくりとニフティクラウドmobile backendに触れてきてみましたが、Parse.comと比べてみてもメソッド名等に違いはあれど、行う処理の流れやイメージに関してはそれほどギャップがあるわけではなさそうだと感じました。今後Parse.comが終了して新たにmBaaSをネイティブアプリのバックエンドは何にしようかと考える際には、選択肢の1つとして良いではないかと思います。

## おわりに：この次のステップとして

今回はレコードが存在しない場合にはメッセージが新規に1件登録され、存在する場合には登録されたレコードを表示するだけのサンプルですが、今後は実際にデータを追加・変更・削除する機能や画像やファイル等の扱いに関しても深掘りできればと思っています。

## 補足：Swift3.0での導入に関して

XCode8系 + Swift3.0.xでの導入の手順は基本的に上記の手順で問題なく導入できますが、AppDelegate.swiftの記述とPodfileを下記のように記載すれば動作しました。
参考までに検証した環境は下記の通りになります。

・OS X 10.10.6 El Capitan
・XCode 8.1
・Swift3.0.1
・CocoaPods1.1.0.rc.2

下記が疎通試験用のコードになります。

```AppDelegete.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    
    //"xxx"：アプリケーションキー, "yyy"：クライアントキー
    NCMB.setApplicationKey("xxx", clientKey: "yyy")
    
    let query: NCMBQuery = NCMBQuery(className: "TestClass")
    query.whereKey("message", equalTo: "Hello, NCMB!")
    
    //findObjectsInBackgroundでデータがある場合はNSArray型のデータを返す(エラーの場合はNSError型)
    query.findObjectsInBackground({(objects, error) in
        
        guard error == nil else {
            print((error?.localizedDescription)! as String)
            return
        }
        
        let count = (objects?.count)!
            
        //データが少なくとも1件存在する場合は一番最初の"message"を取得して表示する
        if count > 0 {

            let callBackData = objects![0] as AnyObject
            let msg = callBackData.object(forKey: "message")! as! String
            print("success find data. \(msg)")
        
        //データが1件も存在しない場合は新規に1件レコードを追加する
        } else {

            var saveError : NSError? = nil
            let obj: NCMBObject = NCMBObject(className: "TestClass")
            obj.setObject("Hello, NCMB!", forKey: "message")
            obj.save(&saveError)
                
            guard saveError == nil else {
                print("failure save data. \(saveError)")
                return
            }
            print("success save data.")
        }
    })
    
    return true
}
```

また、CocoaPodsに関してですが、XCode8系での導入の際にはCocoaPodsのバージョンアップを行って置いて下さい。

バージョンアップを行った後のPodfileの中は下記のようになります。

```
platform :ios, '9.0'
target '自分のプロジェクト名' do
  use_frameworks!

  # Pods for mypremiumcafencmb
  pod 'NCMB', :git => 'https://github.com/NIFTYCloud-mbaas/ncmb_ios.git', :branch => 'master'
  pod 'RealmSwift'

  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['SWIFT_VERSION'] = '3.0'
      end
    end
  end

end
```

※もしエラーや動かない等のご報告があれば宜しくお願い致しますm(_ _)m