トップへ(mam-mam.net/)

Firebase Cloud Messaging(FCM)のAndroidプッシュ通知を受け取る ~Delphiソースコード集

Firebase Cloud Messaging(FCM)のAndroidプッシュ通知を受け取る ~Delphiソースコード集

Firebaseでプロジェクトの作成

Firebaseにログインして「プロジェクトを作成」を押下します。

プロジェクト名を入力して「続行」を押下します。

プロジェクト用にGoogleアナリティクスを設定するを選択したまま「続行」を押下します。

「プロジェクトを作成」を押下します。

プロジェクト作成が完了したら「続行」を押下します。

Firebaseでプロジェクトにアプリの追加

「Androidパッケージ名」を入力して「アプリを登録」を押下します。 パッケージ名は、「ドメインの逆順」.「プロジェクト名」で入力します。 Androidの場合、ドメインのハイフンはアンダースコアに変えます。 mam-mam.net の場合は net.mam_mam になります。

「google-services.jsonをダウンロード」を押下します。
ダウンロードしたgoogle-services.jsonファイルは後でDelphiのプロジェクトに取り込みます。
ダウンロードが終わったら「次へ」を押下します。

「次へ」を押下します。

Delphiを起動してプロジェクトを作成

DelphiのIDEを起動し「ファイル」⇒「新規作成」⇒「マルチデバイスアプリケーション」を押下して、 「空のアプリケーション」を押下します。

右ペインのProject1.dprojプロジェクトのターゲット プラットフォームをAndroidに切り替え(ダブルクリック)します。
フォームにTMemoを1つドロップし、alignをTopに設定します。
「ファイル」⇒「すべて保存」を押下して、デフォルト(Project1.dproj、Unit1)で適当なフォルダに保存します。
(保存先フォルダ名に全角を使うとAndroidにインストールできなくなる場合があるので半角文字のみでフォルダを作成することをお勧めします。)

「プロジェクト」⇒「オプション」から「アプリケーション」⇒「資格リスト」を押下します。
プッシュ通知の受信にチェック(True)を入れます。

「アプリケーション」⇒「サービス」を押下します。
「インポート」ボタンを押下します。

上記のFirebaseの操作でダウンロードした「google-services.json」ファイルを選択して「開く」を押下します。

インポートされて、「Google アプリケーション ID」「デフォルトの送信者 ID」が設定されます。

「アプリケーション」⇒「バージョン情報」を押下します。
上記「Firebaseでプロジェクトにアプリの追加」で設定した「Androidパッケージ名」と同じ文字列を「package」に入力します。


ソースコードの入力

以下のソースコードを入力します。
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
  System.PushNotification, System.Notification, FMX.PushNotification.Android;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
    FDeviceId:String;   //デバイスID(端末ごとに不変)・・・この値で端末を管理する必要がある
    FDeviceToken:String;//デバイストークン            ・・・Push通知に必要で変更される場合がある
    procedure OnReceiveNotification(Sender: TObject;
      const ServiceNotification: TPushServiceNotification);
    procedure OnServiceConnectionChange(Sender: TObject;
      PushChanges: TPushService.TChanges);
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
var
   PushService: TPushService;
   ServiceConnection: TPushServiceConnection;
   Notifications: TArray<TPushServiceNotification>
begin
  PushService := TPushServiceManager.Instance.GetServiceByName(
    TPushService.TServiceNames.FCM);
  ServiceConnection := TPushServiceConnection.Create(PushService);
  ServiceConnection.Active := True;

  //■アプリ起動中でアクティブ時にPush通知が届いたら
  //  通知センターにPush通知が表示されずに
  //  OnReceiveNotificationが呼び出される
  //■アプリ起動中でアクティブではない時にPush通知が届いたら
  //  通知センターにPush通知が表示され、タップすると
  //  OnReceiveNotificationが呼び出される
  ServiceConnection.OnReceiveNotification := OnReceiveNotification;

  //デバイストークンが変更された場合は以下が呼び出される
  ServiceConnection.OnChange := OnServiceConnectionChange;

  //デバイスID(端末ごとに不変)・・・この値でAndroid端末を管理する必要がある
  FDeviceId := PushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceId];

  //■アプリが起動していない場合
  //  Push通知が届くと通知センターにPush通知が表示される。
  //  その通知センターのPush通知をタップした時にアプリが起動し以下が処理される
  Notifications := PushService.StartupNotifications;
  if Length(Notifications) > 0 then
  begin
    Memo1.Lines.Add('-----------------------------------------');
    Memo1.Lines.Add('Json = ' + Notifications[0].Json.ToString);
    Memo1.Lines.Add('-----------------------------------------');
  end;
end;

procedure TForm1.OnReceiveNotification(Sender: TObject;
  const ServiceNotification: TPushServiceNotification);
begin
  //届いたPush通知をMemoに出力
  Memo1.Lines.Add('-----------------------------------------');
  Memo1.Lines.Add('Json = ' + ServiceNotification.Json.ToString);
  Memo1.Lines.Add('-----------------------------------------');
end;

procedure TForm1.OnServiceConnectionChange(Sender: TObject;
  PushChanges: TPushService.TChanges);
var
  PushService: TPushService;
begin
  PushService :=
    TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM);
  if TPushService.TChange.DeviceToken in PushChanges then
  begin
    FDeviceToken := PushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
    Memo1.Lines.Add('DeviceID: ' + FDeviceId);
    Memo1.Lines.Add('Firebase Token: ' + FDeviceToken);
    //ここで、この「デバイスID」をキーとした データベースのテーブル等にREST通信などで
    //この「デバイスID」がレコードに存在していなければ 「デバイスID」と「デバイストークン」を挿入し、
    //この「デバイスID」がレコードに存在していれば、「デバイストークン」を更新する処理を行うのが常套手段
  end;
  if (TPushService.TChange.Status in PushChanges) and 
     (PushService.Status = TPushService.TStatus.StartupError) then
       Memo1.Lines.Add('Error: ' + PushService.StartupError);
end;


end.

ソースコードの入力が終わったら、デバッガを使わずに実行(Shift+Ctrl+F9)ボタンを押下して、実機に転送して実行します。


Firebaseからプッシュ通知を送信する

Firebaseの左のメニューの下のほう、又は一番下のリンクから「Cloud Messaging」を押下します。

「Send your first message」を押下します。
(既に送信したことがある場合は「新しい通知」ボタンを押下します)

通知のタイトル、通知テキストを入力して「次へ」を押下します。

ターゲット アプリを選択します。以下の場合は「net.mam_mam.Project1」を選択しています。
「次へ」を押下します。
(他にオプションを設定しない場合は「確認」を押下しても構いません)

スケジュールを設定します。デフォルトの「現在」のまま「次へ」を押下します。
(他にオプションを設定しない場合は「確認」を押下しても構いません)

コンバージョン イベントを設定します。デフォルトのまま「次へ」を押下します。
(他にオプションを設定しない場合は「確認」を押下しても構いません)

その他のオプションを設定します。
今回はカスタムデータを設定します。設定したら「確認」ボタンを押下します。

「公開」ボタンを押下します。(プッシュ通知が送信されます。)


実機での確認

実機にJsonデータが届きます。カスタムデータも届いています。