【iOS】「Firebase」と「nifty cloud mobile backend」のPush通知サービスを比較してみる


## はじめに

Firebase及びnifty cloud mobile backend導入からプッシュ通知を受信するところまで説明してできればそれぞれのメリット、デメリットを書ければと思います！

## Firebase

https://console.firebase.google.com

上記リンクを開いてまずはプロジェクトを追加しましょう！

![スクリーンショット 2016-08-24 午後1.52.23.png](https://qiita-image-store.s3.amazonaws.com/0/97280/b9be3fb3-73a8-736c-021d-524afc7c41d4.png "スクリーンショット 2016-08-24 午後1.52.23.png")

__新規プロジェクト__を作成ボタンをポチィー!!

適当にほげほげする

![スクリーンショット 2016-08-24 午後1.52.45.png](https://qiita-image-store.s3.amazonaws.com/0/97280/d2667ca1-c10b-c8f4-5d23-71492950b05a.png "スクリーンショット 2016-08-24 午後1.52.45.png")

![スクリーンショット 2016-08-24 午後1.54.01.png](https://qiita-image-store.s3.amazonaws.com/0/97280/1928c0e5-87da-92ce-7c5d-3627bbacb35e.png "スクリーンショット 2016-08-24 午後1.54.01.png")

プロジェクトが作成されるので __iOSアプリにFirebaseを追加__ っていうところを選択！

![スクリーンショット 2016-08-24 午後1.54.25.png](https://qiita-image-store.s3.amazonaws.com/0/97280/dbc3bf19-6f30-5c69-7229-7db615cc3296.png "スクリーンショット 2016-08-24 午後1.54.25.png")

BundleIDを入力するように言われるので入力する
![スクリーンショット 2016-08-24 午後1.54.39.png](https://qiita-image-store.s3.amazonaws.com/0/97280/a3797bc4-0d18-32a3-a437-4b1c9136af82.png "スクリーンショット 2016-08-24 午後1.54.39.png")
Xcodeプロジェクト側と同じもの

あとは __GoogleService-Info.plist__ をプロジェクトに追加して画面の指示に従う。

Podfileに追加するものに関しては以下でも良い

```ruby:Podfile
pod 'Firebase/Core'
pod 'Firebase/Messaging'
```

`pod install` が終わったら次は `AppDelegate` の作業だ！

```swift:AppDelegate.swift
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        FIRApp.configure()
        
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
        
        return true
    }
    
    func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
        if notificationSettings.types != .None {
            application.registerForRemoteNotifications()
        }
    }
    
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
    }
}
```

大体こんな感じだ。これでいける

![スクリーンショット 2016-08-24 午後2.55.32.png](https://qiita-image-store.s3.amazonaws.com/0/97280/0eb3f678-7afa-5d2f-5ab0-623d058d4416.png "スクリーンショット 2016-08-24 午後2.55.32.png")
![スクリーンショット 2016-08-24 午後2.55.51.png](https://qiita-image-store.s3.amazonaws.com/0/97280/923ddd48-8bd4-d101-a212-b2a27bb5e1f2.png "スクリーンショット 2016-08-24 午後2.55.51.png")

画像のように `.p12` ファイルをアップロードしておく。

左のメニューから `Notifications` を選択してプッシュ通知を登録する

![スクリーンショット 2016-08-24 午後2.58.49.png](https://qiita-image-store.s3.amazonaws.com/0/97280/57362559-0f2b-b1aa-8050-e808eb6d680b.png "スクリーンショット 2016-08-24 午後2.58.49.png")

上記のような最小構成で十分！

では、やってみよう！！

![IMG_0069.PNG](https://qiita-image-store.s3.amazonaws.com/0/97280/6e8237e3-e4a1-cf02-0a3a-3315d5411d97.png "IMG_0069.PNG")

ｷﾀｺﾚ!!
若干ロック画面の __渡辺曜__ちゃんが見えますが気にしないでください
＼ヨーソロー！／

### メリット

- ドキュメントが豊富なのでググればとりあえずなんとかなる
- 実装が簡単
- チュートリアルやサンプルが存在している
- Pythonから操作ができる

### デメリット

- Web操作画面がちょっと難しい
- デバイストークンの登録数が確認できない(できるかもしれないけど私のブラウザ操作技術では確認できない)


## nifty cloud mobile backend

http://qiita.com/nnsnodnb/items/0ddde46920f06d3cda91

詳しくは、上記記事に書いてるので参考にしてもらえればと思います。

Podfileに以下を追加

```ruby:Podfile
platform :ios, '8.0'
use_frameworks!

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

追加し終わったら `pod install`

Xcodeから __File > New > File...__ を選択して `Bridging-Header.h` ファイルを作成する。

```objective-c:Bridging-Header.h
#ifndef Bridging_Header_h
#define Bridging_Header_h

// ここを追加
#import <NCMB/NCMB.h>

#endif /* Bridging_Header_h */
```

__プロジェクト > Build Settings__ に行き、検索窓から `objective-c bridging header` と検索する

![スクリーンショット 2016-08-24 午後4.03.54.png](https://qiita-image-store.s3.amazonaws.com/0/97280/a8738ca1-a608-36df-6fad-c1ff3d92f1a3.png "スクリーンショット 2016-08-24 午後4.03.54.png")

ここの窓に先ほど作った `Bridging-Header.h` をドラッグ&ドロップをする

`AppDelegate.swift` は以下のようにすると最小構成ではあるがプッシュ通知は受信できる

```swift:AppDelegate.swift
import UIKit
import NCMB

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    let applicationKey = "APPLICATION_KEY"
    let clientKey = "CLIENT_KEY"

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        NCMB.setApplicationKey(applicationKey, clientKey: clientKey)
        
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
        
        return true
    }
    
    func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
        if notificationSettings.types != .None {
            application.registerForRemoteNotifications()
        }
    }
    
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        let installation = NCMBInstallation.currentInstallation()
        installation.setDeviceTokenFromData(deviceToken)
        installation.saveInBackgroundWithBlock { (error: NSError!) -> Void in
            if (error != nil){
                print("Failure")
            } else {
                print("Success")
            }
        }
    }
}
```

いざ通知！！

![写真 2016-08-24 午後4 25 58.png](https://qiita-image-store.s3.amazonaws.com/0/97280/2f8c3611-d3fa-76bc-5507-4961112f1942.png "写真 2016-08-24 午後4 25 58.png")

さっきから1時間半経っていますが多分気のせいです。

### メリット

- 実装が簡単
- ユーザコミュニティが活発なのでとりあえず聞けばなんとかなる？
- チュートリアルやサンプルが存在している
- Web操作画面でデバイストークンなどを実際にみることができる
- リッチプッシュが無料で使える
- Web操作画面が直感的

### デメリット

- GitHubにあるサンプルがちょっと複雑なものがある？
- Web操作画面及びアプリ開発時に設定項目がちょっと多いかも


## 最後に

上げたメリット的な感じにはnifty cloud mobile backendのほうがいいのかな？っていう感じにはなってますが、全然そんなことないと思います。Firebaseは今からドンドン盛り上がりを見せてくれると思いますし🍣

プッシュ通知だけのサービスを追加するんだったらどっちでもいい。

ただAnalytics等他の機能を追加していくのであればFirebaseを私は推します。
ラブライブ！サンシャイン!!の推しメンは __渡辺曜__ちゃんです。