mbassを使ってアプリから特定の端末へプッシュ通知を配信する方法 

この記事は[NIFTY Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nifty)の13日目の記事です。
12日目は[@machinanette](https://qiita.com/machinanette)さんの「[RSSリーダーはやめてGoogle Apps Scriptでchatworkにニュースを流してみた](https://qiita.com/machinanette/items/696a1d599d8f0cd863e9)」でした。


#はじめに

Qiitaさんはよく利用させて頂いていますが、書く方は初めてです:relaxed:
そのため拙い内容ですが、我が子の発表会を見るような温かい目でお読みいただけると嬉しいです。

書く内容を『Appleに６回連続リジェクトを食らってリリースを諦めた話』にするか迷いましたが
生産性がないと判断し本記事を採用しました:smirk:

この記事では『mbassを使ってアプリから特定の端末へプッシュ通知を配信する方法』をご紹介します。
mbaasには[ニフクラ mobile backend](http://mb.cloud.nifty.com/about.htm)を利用しています。

単にプッシュ通知を配信する記事はいくつか見当たりましたが、
特定の端末を指定して配信する方法を詳しく書いた記事がなかったので今回記載するにあたりました。

#事前準備

- mbaasのSDK導入　（[SwiftでmBaaSを始めよう！](https://qiita.com/natsumo/items/57d3a4d9be16b0490965)）
- mbaasの会員登録の設定　（[Swiftでログイン機能をつけてみよう！](https://qiita.com/natsumo/items/25c97182fab4db5629b1)）
- mbaasのプッシュ通知配信の設定　（[Swiftでプッシュ通知を送ろう！](https://qiita.com/natsumo/items/8ffafee05cb7eb69d815)）

まず上記の設定を行い、会員登録とプッシュ通知の両方が使用できる状態にしてください
それぞれ右に記載した記事が大変参考になります

#本題

プッシュ通知を特定の端末に送るには送りたい端末の条件を指定する必要があります
その条件に会員登録の情報を利用します
この会員登録とプッシュ通知を組み合わせることで特定の端末への配信が実現できます

実際の実装手順は以下の通りです。

- 会員登録をする
- 会員登録後ログイン時、プッシュ通知配信に利用する「installation」に会員情報の「useId」を加える
- 「installation」が持つ「useId」の一致を元にプッシュ通知を配信する

以下に詳細なコードを記載します

## ① 会員登録（ここではメールアドレス登録を例に記載）
```swift
let userDataObject = NCMBObject(className: "UserData")
    userDataObject?.setObject(self.userIdTextField.text,forKey:"userId")
    userDataObject?.setObject(self.mailAddressTextField.text,forKey:"mailAddress")
    userDataObject?.saveInBackground({(error) in
        if error != nil {print("Save error : ",error!)}
    })
    NCMBUser.requestAuthenticationMail(self.mailAddressTextField.text, error: nil)
```

## ②「installation」に会員情報の「useId」を加える
```swift
let installation = NCMBInstallation.current()
installation?.setObject(true, forKey: "loginFlag")
//PushのためにユーザIDを追加
installation?.setObject(self.appDelegate.userDefaults.string(forKey: "userId"), forKey: "userId")
installation?.setObject(self.appDelegate.userDefaults.string(forKey: "mailAddress"), forKey: "mailAddress")
// 端末情報をデータストアに登録
installation?.saveInBackground({ (error) in
    if error != nil {
        // 端末情報の登録に失敗した時の処理
        let err = error! as NSError
        if (err.code == 409001){
            // 失敗した原因がデバイストークンの重複だった場合
            // 端末情報を上書き保存する
            self.updateExistInstallation(currentInstallation: installation!)
        }else{
            // デバイストークンの重複以外のエラーが返ってきた場合
        }
    } else {
        // 端末情報の登録に成功した時の処理
    }
})
```

## ③「installation」の「useId」の一致を条件にプッシュ通知を配信
```swift
let push = NCMBPush()
let data_iOS = ["contentAvailable" : false, "badgeIncrementFlag" : true, "sound" : "default"] as [String : Any]
push.setData(data_iOS)
push.setPushToIOS(true)
push.setTitle("hogehoge")
push.setMessage("fugafuga")
push.setImmediateDeliveryFlag(true) // 即時配信
/* installation を指定して絞り込み */
let query = NCMBInstallation.query()
query?.whereKey("userId", equalTo: id)
query?.whereKey("loginFlag", equalTo: true)

push.setSearchCondition(query)
push.sendInBackground { (error) in
    if error != nil {
        // プッシュ通知登録に失敗した場合の処理
        print("NG:\(String(describing: error))")
    } else {
        // プッシュ通知登録に成功した場合の処理
        print("OK")
    }
}
```
アプリからの配信自体は主にこちらを参考にさせて頂きました。
 → [Swiftでアプリからアプリにプッシュ通知を送って見よう！
](https://qiita.com/natsumo/items/fb40d397ca7b39571485)


#まとめ

以上になります
mbaasの２つの機能を使うことで簡単に特定の端末にプッシュ通知を送ることができます
みなさんも是非アプリにプッシュ通知をいれてみてください！


明日の記事は[@harimmas](https://qiita.com/harimmas)さんです。よろしくお願いします！