iOS ニフティクラウドmobile backendを使ってサイレントプッシュをする

##サイレントプッシュとは##
PUSH通知が来た際にアラートを表示しないやり方です。
アプリ内のコンテンツを任意のタイミングで更新したい時などに使えます。
アラートを表示しないため通知の許可画面が必要ありません。

##リモート通知の仕組み##
iOSではApple Push Notification service(APNs)を経由しなければなりません。
送信元サーバー→APNs→各デバイスという流れで通知されます。

##証明書の取得##
Appleの開発者サイトから証明書を取得する必要があります。
詳細は[こちら](http://mb.cloud.nifty.com/doc/current/tutorial/push_setup_ios.html)をご確認ください。

##ニフティクラウドで設定##
**新しいアプリの作成**
ニフティクラウドダッシュボード上部にある新しいアプリよりアプリを作成します。
<img width="1168" alt="スクリーンショット 2016-05-08 14.29.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/1d586d4c-4e34-2059-fa1d-98ea80ad7ef2.png">

**通知の許可、証明書のアップロード**
プッシュ通知の許可と、さきほど取得した証明書のアップロードをします。
詳細は[こちら](http://mb.cloud.nifty.com/doc/current/dashboard/push.html)をご確認ください。

##Xcodeに実装##

**SDKのインストール**
下記のようなPodfileでインストールできます。

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

**APIキーの設定**
アプリ設定→アプリ基本→APIキーにあるアプリケーションキーとクライアントキーを設定します。

```lang:AppDelegate
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        NCMB.setApplicationKey("アプリケーションキー", clientKey: "クライアントキー")
        UIApplication.sharedApplication().registerForRemoteNotifications()
        
        return true
    }
```

**デバイストークン(通知するデバイスの情報)の登録**

```lang:AppDelegate
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        let installation = NCMBInstallation.currentInstallation()
        installation.setDeviceTokenFromData(deviceToken)
        installation.saveInBackgroundWithBlock { (error) in
            if error == nil {
                print("デバイストークン登録成功")
            }else {
                print("デバイストークン登録失敗")
            }
        }
    }
```

**リモートプッシュを通知**
コンテンツの更新処理などをここに書きます。

```lang:AppDelegate
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
        //コンテンツ更新などの何かしらの処理
        if let controller = window?.rootViewController as? ViewController {
            controller.lblDisplay.text = "Silent Push成功"
        }
    }
```

**バックグラウンド中も通知**
CapabilitiesのBackground modesをONにして
Remote Notificationを有効化します。

##プッシュ通知##
ニフティクラウドダッシュボードのプッシュ通知→新しいプッシュ通知を選択します。

- iOS端末に配信するをチェック
- 音声ファイル名を空白
- content-availableを有効にする
- プッシュ通知を作成するを選択

<img width="818" alt="スクリーンショット 2016-05-08 15.35.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/80d257e1-c5e4-3b4a-ed97-3f711e76faec.png">
<img width="786" alt="スクリーンショット 2016-05-08 15.39.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/26292189-bc57-75d4-3a6a-69f0d226063d.png">

iOSデバイスで通知できたら成功です。少し時間がかかります。

プッシュ通知に成功するとニフティクラウドダッシュボードは下記のようになります。
<img width="631" alt="スクリーンショット 2016-05-08 16.31.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/f778a070-93a7-8b95-b2d3-cc325280261d.png">

##最後に##
許可画面不要で任意のタイミングでコンテンツの更新ができるのは結構使えるかと思います。
実装もそこまで難しくありません。
ネックなのは1か月でプッシュできる回数が決まっていることです。
無料では100万回までとなっています。
例えば1回のプッシュで10万デバイスに通知すると、残り100万-10万=90万デバイスとなります。

コードを[GitHub](https://github.com/hideyukitone/RemotePushTestForNiftyCloud)で公開しておりますのでよろしければ参考にしてください。