Delphiでお手軽プログラミング

Delphiでお手軽プログラミングメニュー

DelphiでFirebase Cloud Messaging(FCM)へandroidのPush通知を行うWindowsアプリケーションを作成する


Delphiを起動して新規作成を行う

Delphiを起動し、ファイル→新規作成→VCLフォームアプリケーション をクリックします。
TButtonとTMemoをフォームにドラッグ&ドロップします。
Button1をダブルクリックするとコードエディタに切り替わります。

ソースコードを記述する

以下は指定のアプリパッケージをインストールしている指定のDeviceTokenのandroid端末にPush通知を送ることができます。
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Net.HttpClient, System.Net.HttpClientComponent,System.Net.URLClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var HTTPClient: TNetHTTPClient;
    s1,s2:TMemoryStream;
    hd: TArray<TNameValuePair>;
    st:string;
    b:TBytes;
begin
  HTTPClient:=TNetHTTPClient.Create(nil);
  s1:=TMemoryStream.Create;
  s2:=TMemoryStream.Create;
  try
    HTTPClient.ContentType:='application/json';
    st:='{'+
        '"to":"ここにPush送信先DEVICE TOKENを記述する"'+
        '"priority":"high",'+
        '"restricted_package_name":"Push通知を送るアプリのパッケージ名を記述する",'+
        '"time_to_live":0,'+
        '"notification":{"sound":"default","badge":"1",'+
        '"title":"Pushタイトル","body":"プッシュ通知本文"}'+
      '}';
    setlength(hd,1);
    b:=TEncoding.UTF8.GetBytes(st);
    s1.Write(b,length(b));
    s1.Position:=0;
    hd[0].Name:='Authorization';
    hd[0].Value:='key=ここにサーバーキーを記述する';
    HTTPClient.Post('https://fcm.googleapis.com/fcm/send',s1,s2,hd);
    s2.Position:=0;
    memo1.Lines.LoadFromStream(s2,TEncoding.UTF8);
  finally
    s1.Free;
    s2.Free;
    HTTPClient.Free;
  end;
end;

end.

実行する

ツールバーの実行ボタン(F9キーでも同じ)を押して実行します。(デバッガを使わずに実行でもOKです。)
Button1をクリックし、Push通知の送信に成功すると
{"multicast_id":47068889804********,"success":1,"failure":0,"canonical_ids":0,
"results":[{"message_id":"0:15763105********%22dfc2a4********"}]}
のような値がMemo1に表示されます。


デバイストークンを指定せず、インストールしているすべてのデバイスに送る場合

特定のアプリパッケージをインストールしているandroid端末すべてにPush通知を送る場合は以下のように記述します。
(conditionでtopicsがnothing_anytopicではないもの としています)
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Net.HttpClient, System.Net.HttpClientComponent,System.Net.URLClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var HTTPClient: TNetHTTPClient;
    s1,s2:TMemoryStream;
    hd: TArray<TNameValuePair>;
    st:string;
    b:TBytes;
begin
  HTTPClient:=TNetHTTPClient.Create(nil);
  s1:=TMemoryStream.Create;
  s2:=TMemoryStream.Create;
  try
    HTTPClient.ContentType:='application/json';
    st:='{'+
        '"condition":"!(''nothing_anytopic'' in topics)"'+
        '"priority":"high",'+
        '"restricted_package_name":"Push通知を送るアプリのパッケージ名を記述する",'+
        '"time_to_live":0,'+
        '"notification":{"sound":"default","badge":"1",'+
        '"title":"Pushタイトル","body":"プッシュ通知本文"}'+
      '}';
    setlength(hd,1);
    b:=TEncoding.UTF8.GetBytes(st);
    s1.Write(b,length(b));
    s1.Position:=0;
    hd[0].Name:='Authorization';
    hd[0].Value:='key=ここにサーバーキーを記述する';
    HTTPClient.Post('https://fcm.googleapis.com/fcm/send',s1,s2,hd);
    s2.Position:=0;
    memo1.Lines.LoadFromStream(s2,TEncoding.UTF8);
  finally
    s1.Free;
    s2.Free;
    HTTPClient.Free;
  end;
end;

end.

実行してButton1をクリックし、Push通知の送信に成功すると
{"message_id":2072**************}
のような値がmemo1に表示されます。


デバイストークンがどのtopicをsubscribe(購読)しているか確認する

https://iid.googleapis.com/iid/info/デバイストークン?details=true
をGETすれば返してきます。
procedure TForm1.Button3Click(Sender: TObject);
var HTTPClient: TNetHTTPClient;
    s1:TMemoryStream;
    hd: TArray<TNameValuePair>;
begin
  HTTPClient:=TNetHTTPClient.Create(nil);
  s1:=TMemoryStream.Create;
  setlength(hd,1);
  hd[0].Name:='Authorization';
  hd[0].Value:='key=サーバーキーを記述';

  HTTPClient.Get(
    'https://iid.googleapis.com/iid/info/'+
    'デバイストークン'+
    '?details=true',s1,hd
  );

  s1.Position:=0;
  memo1.Lines.LoadFromStream(s1,TEncoding.UTF8);

  HTTPClient.Free;
  s1.Free;
end;

実行してButtonをクリックし受信に成功すると
{"applicationVersion":"1","application":"net.mam_mam.Project1","scope":"*",
"authorizedEntity":"9987****","appSigner":"c92b****","platform":"ANDROID"}

のような値がmemo1に表示されます。

Copyright 2019 Mam