本記事では、b→dash mobile SDK(Android用)でPush配信を行うための実装方法について紹介しています。
実装手順は、大きく下記の4つです。
各手順の詳細は、以下をご参照ください。
b→dash mobile SDKでは、Push配信時に「通知パラメーター」というデータを指定することで、配信から遷移する表示画面を変えるなどの制御が可能です。内部のPush通知サービスとしてFirebase Cloud Messaging(FCM)を利用しています。
本SDKでは、エンドユーザーへのPush通知として下記の3パターンとサイレント通知を用意しており、現行のSDKでは「標準通知」のみをサポートしています。
通知タイプ |
通知の仕方 |
影響度 |
| 標準通知 | ステータスエリアへの通知、Android5以降ではロック画面への通知も行います | 通常 |
| 割込通知 | 次期バージョン対応予定。画像を含めることが出来るレイアウトで独自の割込通知を行います | 高 |
| アクティブ状態を判断しての割込通知 | 次期バージョン対応予定。アプリケーションがアクティブのときのみ割込通知を行います | 通常 |
| サイレント通知 | 今後のバージョン対応予定。ユーザーへは通知を行わない通知です | 低 |
Android端末で「Push通知」を受信したときのイメージを、「Push通知」「リッチ通知(画像付きPush通知)」の場合でそれぞれご紹介します。

Push通知を利用するにはGoogleアカウントが必要です。事前に用意し、Firebase Consoleで「サーバーキー」を発行してください。
Firebase Consoleで任意のプロジェクトを作成し、ダウンロードしたgoogle-service.jsonをプロジェクトのappディレクトリに組み込みます。

Push通知を受け取った時、標準ではandroid.intent.category.LAUNCHERのActivityが起動します。独自に指定する場合は、下記の<meta-data>をmanifestの<application>内に追加します。
パラメーター名 |
値 |
| com.f_scratch.bdash.mobile.push.launch | 【オプション】起動アクティビティをフルパスで指定します |
<meta-data android:name="com.f_scratch.bdash.mobile.push.launch" android:value="パッケージ名も含めてActivityを指定します" />デフォルトではアプリケーション組み込みのアイコンが利用されますが、サイズ差異によるイメージ崩れを防ぐためにmanifestで定義することを推奨します。
パラメーター名 |
値 |
| com.f_scratch.bdash.mobile.push.icon | 【必須】drawableディレクトリ内の画像を指定 |
| com.f_scratch.bdash.mobile.push.accentColor | 【オプション】Android5以降で「アイコンの背景色」を指定 |
| com.f_scratch.bdash.mobile.push.bigIcon | 【オプション】Android 5.0未満で自動的に有効 |
| com.f_scratch.bdash.mobile.push.lollipop.bigIcon | 【オプション】Android 5.0以降で自動的に有効 |
drawable-dpi |
Image size (width x height) |
ldpi |
18 x 18 |
mdpi |
24 x 24 |
hdpi |
36 x 36 |
xhdpi |
48 x 48 |
xxhdpi |
72 x 72 |
xxxhdpi |
96 x 96 |
通知チャンネルを有効にするためには、下記の必須設定をmanifestで定義する必要があります。最初に作成後、通知チャンネル名/説明の更新は可能ですが、通知の重要度などはAPIを通して変更できません(変更には既存チャンネルの削除と再作成が必要)。
パラメーター名 |
値 |
| com.f_scratch.bdash.mobile.push.channel.id | 【必須】通知チャンネルIDをユニークで指定 |
| com.f_scratch.bdash.mobile.push.channel.name | 【必須】通知チャンネル名を指定 |
| com.f_scratch.bdash.mobile.push.channel.desc | 【オプション】通知チャンネルの説明 |
| com.f_scratch.bdash.mobile.push.channel.badge | 【オプション】通知チャンネルでバッジを付けるか(デフォルト: true) |
| com.f_scratch.bdash.mobile.push.channel.importance | 【オプション】通知の重要度(high/default/low/min/none、デフォルト: high) |
Android版では組み込みの「Push通知の設定画面」を3種類のデザインテーマで用意しています。

Push通知の受信処理に独自のペイロード解析を行っている場合、Androidでは「FirebaseMessagingService」クラスを継承して実装します。b→dash Mobile SDKでは上記のクラスを継承しmanifestで定義しているため、この定義はmanifest内に1つしか定義できず、アプリで定義するとSDKの定義が上書きされb→dashの通知受信が行われなくなります。
アプリとSDK双方で受信できるように、「アプリ側でb→dash受信クラスを継承し処理を切り分ける」対応が必要です(FCMReceiverServiceを継承し、メッセージ種別によって処理メソッドを分ける)。
Push通知を利用するために計測ログとしてFCMトークンを送信する必要があります。Push通知で利用するAPIは下記です。
API |
送信内容 |
| Tracker.setScreenName() | スマホアプリでアクセスした画面の名前 |
| Tracker.setRelationalKey(key, val) | データ統合のためのレコードを一意に特定するカラムの名前 |
BDashNotification.getToken() からも取得可能ですBDashNotificationクラスで公開されているAPIの主要なものは下記です(★は登録/解除を行う主要API)。
API |
例外 |
概要 |
| getInstance() | - | シングルトンのオブジェクトを取得 |
| registerNotification() | BDashBusyException | ★b→dashサーバへFCMトークンを登録する |
| registerForceNotification() | BDashBusyException | ★強制してFCMトークンをサーバ登録する |
| cancelNotification() | BDashBusyException | ★b→dashサーバからFCMトークンを解除する |
| isRegisterNotification() | - | FCMトークンが登録されているかを返す |
| getToken() | - | FCMトークンを返す |
| getRegistrationId() | - | ストレージに保存されているFCMトークンを返す |
| addStateListener() / removeStateListener() / clearStateListener() | - | 通知状態を受け取るリスナーの追加/削除 |
| addTokenRefreshListener() / removeTokenRefreshListener() / clearTokenRefreshListener() | - | トークンリフレッシュリスナーの追加/削除 |
| setFCMNativeEventListener() | - | FCMのネイティブイベントを受け取るリスナーを設定 |
| setEnableSound() / setEnableVibration() / isEnableSound() / isEnableVibration() | - | Android 8.0未満のみサウンド/バイブを切り替え/取得 |
一覧 |
概要 |
| NotificationStateListener.onEnable() | 通知がONで同期されたときに呼び出される |
| NotificationStateListener.onDisable() | 通知がOFFで同期されたときに呼び出される |
| NotificationStateListener.onError(type, exception) | 通知の同期でエラーが発生したときに呼び出される |
| ERROR_FCM_READY / ERROR_CONNECT | FCMトークン未発行 / 同期エラーの定数 |
| BDashNativeSyncException | FCMトークン新規採番時の内部自動同期失敗時に設定 |
| BDashBusyException | b→dashが同期中のときに再度同期を行う関数が呼ばれたときに発生 |
| FCMNativeEventListener.onNewToken(token) | FirebaseMessagingService.onNewToken()と同一の挙動 |
| FCMNativeEventListener.onDeletedMessages() | 配信メッセージが削除されたとき(デバイスが1ヶ月以上オフライン/未配信メッセージが100件超過) |
| FCMNativeEventListener.onUnregistered(token) | 現在利用しているトークンが無効になったときに呼び出される |
| FCMTokenRefreshListener.onRefreshToken(token) | アプリ起動時にトークンを取得することができる |
Push通知を有効/無効にするには、それぞれ下記のコードを呼び出します。
BDashNotification bdashNotification = Tracker.getInstance(this).getNotification();
bdashNotification.addStateListener(new BDashNotification.NotificationStateListener() {
@Override public void onEnable() { /* 通知有効時 */ }
@Override public void onDisable() { /* 通知無効時 */ }
@Override public void onError(int i, Throwable throwable) { /* エラー発生時 */ }
});
bdashNotification.registerNotification(); // 有効化 (無効化は cancelNotification())
addStateListener()に登録したリスナーに通知されます。通信エラーやFCM内部エラー発生時はonErrorとして通知されるため、リトライ処理やユーザーへの促しを考慮してくださいremoveStateListener()で必要に応じて削除する必要がありますトークンを取得したタイミングで処理を行いたい場合、BDashNotification.FCMTokenRefreshListenerを使うことで適切なタイミングで取得可能です。ほとんどのアプリでは本実装は必須になります。
setFCMNativeEventListenerも同様の制約)。onRefreshToken()はアプリケーションのタスクが新規起動するたびに呼び出されますregisterForceNotification()を呼ぶ必要がありますAndroid 8.0以降では、サウンド・バイブともに「通知チャンネルにてデフォルトでON」となります。Android 8.0未満では下記メソッドで制御可能ですが、現在は動作保証されていません。
bdashNotification.setEnableSound(true); // サウンド有効
bdashNotification.setEnableVibration(true); // バイブ有効
// false で無効化
エンドユーザーが受信した通知をタップした時、「起動アクティビティ」で設定したActivityが起動されます。通知から遷移した時に含まれる「起動パラメーター」を利用した判定や、成果としてTracking情報を送るには、起動したActivityのonCreate()で下記のように送信します。
Intent intent = getIntent();
int isNotification = intent.getIntExtra(BDashNotification.LAUNCH_NOTIFICATION, 0);
if (isNotification != 0) {
String param = intent.getStringExtra(BDashNotification.LAUNCH_EXTRA_PARAM);
if (param != null) {
param = URLDecoder.decode(param, "UTF-8"); // URLデコード
// 起動パラメーターを判断して画面遷移
}
// Tracking情報を生成
Tracker.getInstance(this).setBootType(Tracker.BootType.BOOT_PUSH, param);
Tracker.getInstance(this).setScreenName("任意のスクリーン名");
Tracker.getInstance(this).send(new ScreenViewBuilder().build());
}
FCM公式サイトによると、下記の場合に登録トークンが変更されることがあります。
トークンが更新されると内部ではonNewToken()が呼び出され、SDKでb→dashサーバーに自動連携されます。通信エラー発生時はリトライ処理は行われずonErrorが呼ばれ、BDashNativeSyncExceptionが設定されます。この場合はregisterNotification()またはregisterForceNotification()で手動同期する必要があります。
下記のステップ順で確認してください。
registerNotification()を呼び出した結果200ステータスが返り、トークンが出力されているか確認 - STG環境ではadb logcat/XCodeコンソールでログを確認可能。200が返らない場合はサーバーダウンの可能性onEnableが来ているか確認 - registerNotification()の引数に渡したクロージャーにコールバックされます