ニフクラ mobile backendを使ってSwiftでプッシュ通知を送ってみる

* __Swift3__ での書き方や __CocoapodsでSDKを利用する場合__ などは下記をご覧ください
 * [Swiftでプッシュ通知を送ろう！ \- Qiita](https://qiita.com/natsumo/items/8ffafee05cb7eb69d815)
 * [Swiftでアプリからアプリにプッシュ通知を送って見よう！ \- Qiita](https://qiita.com/natsumo/items/fb40d397ca7b39571485)
 * [＜CocoaPods＞SwiftでmBaaSを始めよう！\(use\_framewoks\!を有効にした方法\) \- Qiita](https://qiita.com/natsumo/items/57d3a4d9be16b0490965)

---

[ニフクラ mobile backend](https://mbaas.nifcloud.com/)はスマートフォン、タブレットアプリにおけるバックグラウンド（サーバサイド）の仕組みをまるっと提供するサービスになります。主な機能として、

- データストア（データベースのような機能）
- ファイルストア（写真、動画、音楽などのバイナリファイルの保存）
- 会員管理（会員登録、認証など）
- プッシュ通知

があります。今回はこの一つ、プッシュ通知機能を試してみます。iOS用のSDKはObjecive-C製なのですが、今回はSwiftから試してみたいと思います。

----

## 必要なもの

- [ニフクラ mobile backend](https://mbaas.nifcloud.com/)のアカウント（無料）
- iOS開発者のアカウント（有料）
- アプリのプロビジョニングなど

iOS Dev Centerのプロビジョニングはあえて省きますが、予め用意してください。


## SDKの組み込み

今回はCocoaPodsを使います。Podfileの内容は次のようになります。

```swift

platform :ios, '10.0' #10.0以上指定してください

target 'SwiftPush' do
  use_frameworks!

  pod 'NCMB', :git => 'https://github.com/NIFCLOUD-mbaas/ncmb_swift.git'
end
```

これを書いたら `pod install` します。

## SDKの読み込み


AppDelegate.swiftの冒頭に次のコードを追記して、インストールしたSDKを読み込みます

* 追記するコードは、SDKのインストール方法によって異なります
* SDKをダウンロードして利用する方法では、こちらは不要です

```swift

// CocoaPodsを利用する方法
import NCMB
```

これでニフクラ mobile backendを使う準備は整いました。

## ニフクラ mobile backendでアプリ作成

[ニフクラ mobile backend](https://mbaas.nifcloud.com/)にてアプリを作成します。


この時、アプリケーションキーとクライアントキーが生成されるので覚えておきます。

### AppDelegate.swiftへの組み込み

まず didFinishLaunchingWithOptionsに記述します。

```swift
import UserNotifications
///////////////////////////途中省略///////////////////////////////

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    //********** SDKの初期化 **********
    NCMB.initialize(applicationKey: "APPLICATION_KEY", clientKey:"CLIENT_KEY")

    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .badge, .sound]) {granted, error in
        if error != nil {
            // エラー時の処理
            return
        }
        if granted {
            // デバイストークンの要求
            UIApplication.shared.registerForRemoteNotifications()
        }
    }

    return true
}
```

APPLICATION_KEY および CLIENT_KEY は先ほど登録したニフクラ mobile backendのキーに置き換えてください。

次にデバイストークン取得時に処理を記述します。

```swift

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // 端末情報を扱うNCMBInstallationのインスタンスを作成
    let installation : NCMBInstallation = NCMBInstallation.currentInstallation
    // デバイストークンの設定
    installation.setDeviceTokenFromData(data: deviceToken)
    // 端末情報をデータストアに登録
    installation.saveInBackground {result in
        switch result {
            case .success:
                // 端末情報の登録に成功した時の処理
                break
            case let .failure(error):
                // 端末情報の登録に失敗した時の処理
                print(error)
                break
        }
    }

}
```
## Xcodeでの対応

TARGETS -> CapabilitiesからPush NotificationsをONに設定してください。
正常に設定された場合、.entitlementsファイルにaps-environmentが追加されます。
![PushNotificationsSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887750/025f8660-bcc1-84a9-2a0b-20e7e996a3ca.png)

Xcode 11の場合、Capability画面が変更されました。設定の「Signing & Capabilities」を選択し、
「+ Capability」をクリックします。Capability 画面から Push Notification を検索し、ダブルクリックして追加します。正常に追加されましたら、Signing情報の下に Push Notification が記載されています。
![xcode_push_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887750/125d6f9f-2789-522f-1937-3127f33cf5b9.png)



## 管理画面からプッシュ作成

アプリを実機に転送して（プッシュ通知はシミュレータでは確認できないので）、起動すると初回はプッシュ通知の許可に関するダイアログが表示されます。


プロビジョニングやiOS Dev Centerでの設定、およびニフクラ mobile backendのアプリケーションキー、クライアントキーが正しく設定されていれば、データストアの installation クラスにデバイストークンが保存されます。


後はプッシュ通知作成画面でプッシュ通知を作成します。


----

実際に運用の中で使う場合は、[アプリの再インストールを考慮した端末情報の登録](https://mbaas.nifcloud.com/doc/current/push/basic_usage_swift.html)も必要になるかと思いますが、ここまでの流れは慣れてしまえばすぐにできるようになります。せっかく作ったアプリなので、ぜひプッシュ通知も使ってみてください。

[サーバー開発不要！アプリ開発をよりスマートに、スピーディに。 | ニフクラ mobile backend](https://mbaas.nifclod.com/)