FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

Androidのプッシュ通知を改行する

f:id:mbaasdevrel:20180524170416p:plain

mBaaSの管理画面では本文を改行してプッシュ通知を作成できます。iOSはそのまま改行が再現されますが、Androidでは標準のままでは改行されません。

送られてくるメッセージ(message)には改行コード(\n)が入った状態となっています。これを使ってプッシュ通知を改行させましょう。

具体的なやり方

参考にしたのは【mBaaS】プッシュ通知のメッセージを改行する【Android】 - Qiitaの記事です。こちらはJava、かつSDKが2系でしたので、Kotlinで3系のコードとして紹介します。

注意点としては NCMBFirebaseMessagingService を継承するということです。その onMessageReceived メソッドをオーバーライドすることで実装できます。

コードの全体は次のようになります。

class CustomFcmListenerService : NCMBFirebaseMessagingService() {
    fun onMessageReceived(from: String, data: Bundle) {
        
        if (!data.containsKey("message") && !data.containsKey("title")) {
            return
        }

        val notificationBuilder = notificationSettings(data)
        val inboxStyle = NotificationCompat.InboxStyle(notificationBuilder)

        if (null != data.getString("title")) {
            val title = data.getString("title")
            inboxStyle.setBigContentTitle(title)
        }

        if (null != data.getString("message")) {
            val message = data.getString("message")

            val messageArray = message!!.split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()

            for (i in messageArray.indices) {
                inboxStyle.addLine(messageArray[i])
            }
        }

        var appInfo: ApplicationInfo? = null
        try {
            appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA)
        } catch (e: PackageManager.NameNotFoundException) {
            throw IllegalArgumentException(e)
        }

        val containsKey = appInfo!!.metaData.containsKey("notificationOverlap")
        val overlap = appInfo.metaData.getInt("notificationOverlap")

        var notificationId = Random().nextInt()

        if (overlap == 0 && containsKey) {
            notificationId = 0
        }

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?

        notificationManager!!.notify(notificationId, inboxStyle.build())

    }
}

改行処理

改行は次の部分で行っています。メッセージを \n で分割し、それを順番に inboxStyle.addLine として追加していきます。

if (null != data.getString("message")) {
    val message = data.getString("message")

    val messageArray = message!!.split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()

    for (i in messageArray.indices) {
        inboxStyle.addLine(messageArray[i])
    }
}

まとめ

最新(3系)のAndroid SDKではonMessageReceivedがなくともプッシュ通知の表示ができるようになっています。そのため、カスタマイズのためには自分で継承したクラスを作成し、AndroidManifest.xmlの修正も必要になります。

一度実装しておけば、プッシュ通知のカスタマイズの幅が広がります。ぜひ試してみてください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。