アプリには必須と言えるPush通知ですが、いざ実装しようとすると色々と複雑そうでよくわからない…
そんな人に向けてAppvisorを利用した実装方法を紹介します。
「Firebaseを使った場合とどう違うの?」
という人もいるかと思いますので、FirebaseとAppvisorの関係を簡単に説明させてもらいます。

Appvisorとは

Appvisorとはbravesoftが開発・運用するPush通知/アプリ開発支援のツールとなっています。
元々Push通知のみに特化していたAppvisor Pushをリニューアルし、Push通知機能自体のパワーアップアプリの設定管理強制アップデートなどのよく必要とされる機能をSDKとして内包して提供するようになりました。
今回はPush通知の部分にフォーカスして説明させていただきます。

Firebase Cloud Messaging(FCM)とAppvisorの関係

FCMはFirebaseの中の1つの機能として、Push通知を送ることができるサービスになっています。
FCMのSDKをアプリ側に実装することでFirebaseの管理画面からPush通知を送ることができるようになります。

ただ、実際の運用を開始するとアプリが保持しているユーザ情報と紐付けを行ったり、アプリサーバからFCMのAPIを使って配信処理を行ったりということをするかと思います。
特にサーバ側のPush通知の実装はユーザをセグメントするための管理画面を新しく作ったり、ユーザ数が増えてくると配信速度やサーバ負荷等を考慮した実装にする必要が出てきたりと、さまざまな機能の実装が必要となってきます。

AppvisorはFCMのSDKを内包する形で、そういった複雑かつ面倒な実装や処理を肩代わりして実装・運用負荷を軽減しより簡単に実装・運用をできるようにしたサービスになっています。

Push通知実装までの流れ

※事前にAppvisorのHPよりアカウント発行を済ませている前提となります。

  1. 1. ベースとなるAndroidアプリの実装
  2. 2. Firebaseコンソール上でFirebaseプロジェクトを作成
  3. 3. AndroidアプリでFirebaseのサービスを実装
  4. 4. フォアグラウンド時の通知表示の実装

動作環境

  • ・Android Studio Jellyfish | 2023.3.1
  • ・Android Gradle Plugin Version 8.4.0
  • ・Gradle Version 8.6
  • ・Mac OS Sonoma 14.4.1
  • ・Android 14

※Push通知の動作検証にはGoogle開発者サービスが入っている端末(エミュレータ)が必要です。

Androidアプリの作成方法

  1. 1. New Projectからプロジェクトを作成
  2. 2. 「Empty Views Activity」 を選択してNextをクリック
    Jetpack Composeでアプリを作る場合は「Empty Activity」を選択してください。
  3. 3. Nameを入力してFinishをクリック(ここでプロジェクトの作成が完了するまで待ってください)
    全て手動で設定していくことも可能ですが、Android StudioにはFirebaseとの連携機能が備わっているため、今回はそちらを利用していきます。
  4. 4. プロジェクトの作成が完了したら「Tools > Firebase Cloud Messaging」を選択
  5. 5. 「Set up Firebase Cloud Messaging」をクリック
  6. 6. 「Connect to Firebase」をクリック

    ブラウザが表示され、Googleアカウントの連携とFirebaseのプロジェクト作成手順が表示されるため作成する
  7. 7. ブラウザでFirebaseコンソールが表示されたら「プロジェクトを追加」をクリック
  8. 8. プロジェクトに名前をつける
  9. 9. 本番のプロジェクトの場合は正式なプロジェクト名をつけておきましょう。(Firebase自体の一意なIDとなってきます)
    サンプルの場合はサンプルであることがわかるような名前にしておきましょう。
  10. 10. Googleアナリティクスの設定
    本番で利用する際には分析のためにも必須となるため有効としましょう。
    サンプルの場合は無効で問題ありません。
  11. 11. Firebaseプロジェクトの作成中という画面が出てくるため完了を待つ
  12. 12. プロジェクトの作成完了と接続完了という画面が出たらAndroid Studioに戻り、「Connected」になっていることを確認する
  13. 13. 「Add FCM to your app」をクリックする
  14. 14. 出てきたポップアップの「Accept Changes」をクリックし、gradleファイルにコードが追加されるのを待つ
  15. 15. app以下に「libs」というDirectoryを作成しその中に1でダウンロードしたSDKを配置する

  16. 16. 「File -> Project Structure… -> Dependencies ->JAR/AAR Dependency」よりSDKを導入する
    image.png
  17. 17.step1に「libs/appvisorPush-release.aar」というpathを入力してOKをクリックする
    image.png
  18. 18.app > build.gradle.ktsを確認し以下のように行が増えていることを確認する
    スクリーンショット 2024-05-09 12.41.25.png
  19. 19. Projectタブに切り替えて app > src > main > AndroidManifest.xmlを開く
  20. 20. AndroidManifest.xmlに以下のserviceとmetadataを追加する
    .AndroidManifest.xml
<service
  android:name="biz.appvisor.push.android.sdk.AppVisorPushFirebaseMessagingService"
  android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>
<meta-data
  android:name="com.google.firebase.messaging.default_notification_channel_id"
  android:value="default_notification_channel_id" />
  1. 21. AppvisorのSDKの初期化処理を行う
import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
//以下を追加
import biz.appvisor.push.android.sdk.AppVisorPush

class MainActivity : AppCompatActivity() {
  //以下1行追加
  private val appVisorPush: AppVisorPush by lazy { AppVisorPush.init(applicationContext) }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    enableEdgeToEdge()
    setContentView(R.layout.activity_main)
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
      val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
      v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
    }

    //AppvisorのSDKの初期化処理ここから

    try {
      // AppVisorの管理画面で設定されているAppKeyを設定します
      val appKey = "XXXXXXX"
      this.appVisorPush.setAppInfo(appKey)
      // 通知チャネルを初期化します。
      this.appVisorPush.setNotificationChannel("default_notification_channel_id", "default notification channel")
      //通知関連の内容を設定します。(送信者ID,通知アイコン,ステータスバーアイコン,通知で起動するClass名、デフォルトの通知タイトル)
      //{Your Sender ID}に関してはFirebase > プロジェクトの設定 > Cloud Messagingの「送信者ID」に記載されている12桁ほどの数字を入力してください。
      this.appVisorPush.startPush("{Your Sender ID}", R.drawable.ic_launcher, R.drawable.ic_launcher, MainActivity::class.java, getString(R.string.app_name))
      //Push反応率チェック(必須)
      this.appVisorPush.trackPushWithActivity(this)
      // 通知権限をリクエストします。(TargetAPI33以上の場合必須)
      this.appVisorPush.requestNotificationPermission(this)
    } catch(e: IllegalArgumentException) {
       // ここにエラー発生時の処理を記述
    }

    //ここまで追加
  }

  //onNewIntentメソッドをここから
  override fun onNewIntent(intent: Intent?) {
     super.onNewIntent(intent)
     setIntent(intent)
  }
  //ここまで追加
}
  1. 22.(オプション)アプリ起動時にPush通知のパラメータを受け取る
    Bundleからペイロードの中身を受け取ることができるため、今回の例では受け取った値をダイアログに表示しています。

.MainActivity.kt

//Push通知からアプリを起動した際に通知の内容をアラートに表示する例
if (appVisorPush.checkIfStartByAppVisorPush(this)) {
  //例:Push内のメーセージ内容をAlertで表示させる。
  val bundle : Bundle? = this.appVisorPush.getBundleFromAppVisorPush(this)
  if (bundle!=null) {
    val title = bundle.getString("title")
    val message = bundle.getString("message")
    val alertDialogBuilder = AlertDialog.Builder(this)
    // アラートダイアログのタイトルを設定します
    alertDialogBuilder.setTitle(title)
    // アラートダイアログのメッセージを設定します
    alertDialogBuilder.setMessage(message)
    // アラートダイアログのボタンを設定します
    alertDialogBuilder.setPositiveButton("OK", null)
    //アラートダイアログを表示します
    alertDialogBuilder.create().show()
  }
}
  1. 23. 手順の7で作成したFirebaseのコンソールにログインし「プロジェクトの設定 > サービスアカウント」を開く
  2. 24. 「新しい秘密鍵を生成」をクリックする
  3. 25. 表示されたポップアップの「キーを生成」をクリック
    そうするとjsonファイルがダウンロードされます。
  4. 26. Appvisorの管理画面にログインし、「設定」を開く
  5. 27.「プロジェクトID」と書いてある場所にFirebaseコンソールの「プロジェクトの設定 > 全般 > プロジェクトID」に記載されているIDを入力する
  6. 28. 「firebaseのjsonファイル」と書いてある場所に先ほどダウンロードした秘密鍵をアップロードする
  7. 29.「利用可」という表記になるため、これにて設定は完了です
  8. 30. あとは実際に「通常配信」の画面からPush通知を送ってもらえればOKです
    実際の画面はこのようになっており、各OSまとめて簡単にセグメントして配信をすることが可能になっています

Q&A

No1. POST_NOTIFICATIONSについて

Q1. android.permission.POST_NOTIFICATIONS の記載がないですが、必要ないですか?

A1. 今回導入している「firebaseMessaging = “24.0.0”」のライブラリバージョンではFCMのライブラリ内に記載されているため、別途の記載は不要となっています。

おわりに

ここまでご覧いただきありがとうございます。

これでPush通知を送ることができるようになったわけですが、効果的なPush通知の運用であったり、サーバからのPush通知の送付であったりと実際に半年、1年と運用を続けていくと色々と大変な部分が出てくるかと思います。
そんな時は経験豊富な担当者によるサポートが受けられるASPを活用していきましょう!