プッシュ通知管理(Flutter)

プッシュ通知証明書とサービスアカウントを設定する

プッシュ通知証明書を設定するサービスアカウントを設定するを参照してください。

flutter-apnsを追加する

サンプルコードではflutter-apnsopen in new windowを使用します。

インストール

以下のコマンドをプロジェクトのルートディレクトリで実行して、インストールしてください。

flutter pub add flutter_apns

iOS向けの設定

AppDelegateのapplication(_:didFinishLaunchingWithOptions:)に以下のコードを追記してください。

UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
[UNUserNotificationCenter currentNotificationCenter].delegate = (id<UNUserNotificationCenterDelegate>) self;

Android向けの設定

まず、サービスアカウントを設定するで作成したgoogle-services.jsonをandroid/appディレクトリの下にコピーします。

続いて、android/build.gradleに以下を追記してください。

buildscript {
    // ...

    dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.3.10'
    }
}





 


android/app/build.gradleに以下を追記してください。

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
// ...


 

デバイストークンを登録する

デバイストークンを取得してBaaS@rakuzaに登録します。デバイストークンをBaaS@rakuzaに登録することで、管理画面からデバイストークンに紐づく端末にプッシュ通知を送信することができます。

デバイストークンを取得するために、PushConnector.tokenを監視します。

取得したデバイストークンはregisterPushDeviceTokenメソッドでBaaS@rakuzaに登録してください。

final connector = createPushConnector();

connector.token.addListener(() async {
  final token = connector.token.value;
  if (token != null) {
    final userAccessToken = 'xxx';
    await RKZClient.instance.registerPushDeviceToken(userAccessToken, token);
  }
});

connector.requestNotificationPermissions();

プッシュ通知を送信する

プッシュ通知を送信するを参照してください。

受信したプッシュ通知を処理する

受信したプッシュ通知の情報をハンドリングすることができます。

BaaS@rakuzaではカスタムペイロードとして以下の項目を送信しています。カスタムペイロードはプッシュ通知を受信した時や、通知バナーをタップした時に参照することができます。

項目名概要備考
news_idお知らせID※お知らせをプッシュ通知した場合のみ送信
news_tenant_idお知らせを配信しているテナントID※お知らせをプッシュ通知した場合のみ送信
urlURL
custom_varsカスタム情報

プッシュ通知を受信すると、フォアグラウンドの場合はPushConnector.configureに設定したonMessageメソッドが呼び出されます。

カスタムペイロードは引数のmessage.dataから取得することができます。

connector.configure(
  // ...
  onMessage: (message) async {
    print('onMessage: ${message.data.toString()}');
  },
);

バックグラウンドの場合はプラットフォームごとに異なります。

iOSの場合、onResumeメソッドが呼び出されます。

Androidの場合、onBackgroundMessageメソッドが呼び出されます。(onBackgroundMessageに設定するメソッドは、非匿名関数およびトップレベル関数である必要があります)

Future<void> _onBackgroundMessage(RemoteMessage message) async {
  print('onBackgroundMessage: ${message.data.toString()}');
}
// ...

connector.configure(
  // ...
  onResume: (message) async {
    print('onResume: ${message.data.toString()}');
  },
  onBackgroundMessage: _onBackgroundMessage
);

通知バナーをタップすると、onResumeメソッドが呼び出されます。

iOSの場合、バックグラウンドから呼び出されたかどうかは、UNNotificationAction.getIdentifierで判別することができます。

connector.configure(
  // ...
  onResume: (message) async {
    print('onResume: ${message.data.toString()}');

    final action = UNNotificationAction.getIdentifier(message.data);
    if (action != null) {
      // 通知バナーをタップした時の処理
    }
  },
);

注意

Androidでメッセージタイプがデータメッセージopen in new windowの場合、通知バナーが表示されません。通知バナーを表示するには、通知メッセージopen in new windowを選択してください。(メッセージタイプの選択方法は受信したプッシュ通知を表示するを参照してください)

注意

iOSの場合、フォアグラウンド時も通知バナーを表示するには、ApnsPushConnector.shouldPresentを実装してtrueを返す様にしてください。

if (connector is ApnsPushConnector) {
  connector.shouldPresent = (x) => Future.value(true);
}

注意

Androidでメッセージタイプがデータメッセージの場合、タイトルとメッセージの一部文字がHTMLエンティティに変換されます。 詳細は受信したプッシュ通知を表示するを参照してください。

デバイストークンをクリアする

ユーザーがログアウトするなど、デバイストークンが不要になった場合はクリアすることができます。

デバイストークンのクリアはclearPushDeviceTokenメソッドで行います。

final userAccessToken = 'xxx';

await RKZClient.instance.clearPushDeviceToken(userAccessToken);