【Kotlin】Push通知のパラメータの効果的な活用方法【サンプルコード付き】

## はじめに
Push通知は表示されるテキストや画像だけではなく、それ以外に任意のパラメータを付与することができることはご存知でしょうか？
このパラメータを利用することで、サーバから任意のタイミングでアプリ側に処理をさせたり、Push通知からの起動の際に特別な処理を行うことが可能です。
今回はこのパラメータの効果的な活用方法をコードと一緒にご紹介できればと思います。

Push通知の実装方法自体はこちらの記事をご参考ください。

https://qiita.com/bsj-y-tomaru/items/77f51c06e9b03ca84452

## カスタムパラメータの受け取り方

```MyFirebaseMessagingService.kt
class MyFirebaseMessagingService : FirebaseMessagingService() {

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)

        //ペイロード自体はdataとしてMap<String, String>で取得
        val data = remoteMessage.data

        // 通知を表示
        showNotification(title, body, data)
    }

    private fun showNotification(title: String?, body: String?, data: Map<String, String>) {
        val intent = Intent(this, MainActivity::class.java).apply {
            data.forEach { (key, value) ->
                //ここのキーとして具体的に"PARAM_A"や"PARAM_B"というものがサーバから渡されているとする
                putExtra(key, value)
            }
        }

        val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)
        val builder = NotificationCompat.Builder(this, "default")
            .setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(title)
            .setContentText(body)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)

        with(NotificationManagerCompat.from(this)) {
            notify(0, builder.build())
        }
    }
}
```


```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // インテントからペイロードを取得
        val appIntent = intent
        appIntent.getStringExtra("PARAM_A")
        appIntent.getStringExtra("PARAM_B")
    }
}
```

これだけで一旦カスタムパラメータを取得することができます。
より詳細かつ、Appvisorのサービスを利用した方法は1つ前の記事のオプション部分をご覧ください。

## パラメータの活用方法

### 【その1】 特典を付与する
ポイント機能を持っているサービスで __Push通知からの起動時のみ追加のポイントを付与する__ といったことで活用可能です。

「例」
__タイトル__：🉐情報のお知らせ
__メッセージ__：この通知からアプリを開いた方限定でアプリ内ポイントを100ポイントプレゼント🎁
__PARAM_A__：100

こういった形で送った通知であれば、PARAM_Aというキーで「100」という値を受け取ることが可能です。
あとはアプリ側の処理としてポイント付与のAPIを呼ぶなどで、Push通知からアプリを起動してくれたユーザにのみ追加の特典を付与してあげることが可能になります。

```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // インテントからペイロードを取得
        val appIntent = intent
        //これが通知として送った100という値となる
        val addPoint = appIntent.getStringExtra("PARAM_A")

        //ここからはアプリ内のそれぞれの独自処理
        val existsPoint = getPoint()
        val point = existsPoint + addPoint
        syncServer(point)
    }
}
```

### 【その2】アプリ内の特定のページに遷移させる
Push通知には多くの場合URLを設定することが可能なため、アプリ内の画面遷移URLスキームを利用する方法がよくあるかと思います。
ただ、URLスキームはManifestの設定やアプリ側の実装などのハードルが高いため、単純にPush通知から受け取ったパラメータを元に特定の画面に遷移させる実装で利用可能です。

「例」
__タイトル__：有効期限が迫っています
__メッセージ__：まだご覧になっていないお得なお知らせがあるため、通知をタップしてお知らせを確認してください。
__PARAM_A__："notice"

```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // インテントからペイロードを取得
        val appIntent = intent
        //これが通知として送った"notice"という値となる
        val notice = appIntent.getStringExtra("PARAM_A")

        //ここからはアプリ内のそれぞれの独自処理
        //PARAM_Aに"notice"があったらNoticeActivityへ、何もなければOthorActivityへといった処理を行う
        if (notice.isNullOrEmpty()) {
            //OthorActivity
        } else {
            //NoticeActivity
        }
    }
}
```
この辺りが比較的簡単にできる効果的な活用方法かと思います。


## おわりに
今回はPush通知のパラメータの活用について書かせていただきました。
もちろん今回紹介させていただいた以外にもさまざまな活用をされていることもあるかと思いますので、「うちではこんな使い方をしていますよ」というものがあれば是非ともコメントください。