首页 > 解决方案 > 服务器通过firebase云消息发送消息后,如果客户端恢复在线,android客户端如何接收消息?

问题描述

我有用 Delphi 10.2.3 编写的服务器和 android 客户端的示例项目。服务器通过 Firebase Cloud Messaging 向 android 客户端发送消息。客户端接收并显示消息。

如果在服务器发送消息之前客户端应用程序在线或在后台运行,则在android客户端接收消息是没有问题的。如果客户端应用程序在服务器发送消息后恢复在线,我面临客户端应用程序无法接收消息的问题。如何解决这个问题呢?

以下是示例项目。

服务器:

procedure TForm2.SendClick(Sender: TObject);
var R: IHTTPResponse;
    M: TBytesStream;
    o: THTTPClient;
    J: TJSONObject;
    A: TBytes;
    S: string;
begin
  Memo1.Lines.Clear;
  S := {"to":"token","time_to_live":120,"data":{"title":"test title","body":"test body"}}

  M := TBytesStream.Create;
  o := THTTPClient.Create;
  try
    J := TJSONObject.ParseJSONValue(S) as TJSONObject;
    if Assigned(J) then begin
      try
        A := TEncoding.UTF8.GetBytes(J.ToString);
        M.Write(A, Length(A));
        M.Position := 0;
      finally
        J.DisposeOf;
      end;
    end;

    o.AcceptCharSet := 'UTF-8';
    o.ContentType := 'application/json';
    o.CustomHeaders['Authorization'] := 'key=FirebaseProjectServerKey';
    R := o.Post('https://fcm.googleapis.com/fcm/send', M);
    Memo1.Lines.Add(Format('Status Code=%s' + sLineBreak + 'Status Text=%s' + sLineBreak + 'Content=%s', [R.StatusCode.ToString, R.StatusText, R.ContentAsString]));
  finally
    M.DisposeOf;
    o.DisposeOf;
  end;
end;

客户:

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, FMX.StdCtrls,
  System.PushNotification, FMX.PushNotification.Android;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   CheckBox1: TCheckBox;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure CheckBox1Change(Sender: TObject);
 private
   FPushService: TPushService;
   FPushServiceConnection: TPushServiceConnection;
   procedure OnChange(Sender: TObject; AChange: TPushService.TChanges);
   procedure OnReceivedNotification(Sender: TObject; const ANotification:
        TPushServiceNotification);
 public
   procedure AfterConstruction; override;
   procedure BeforeDestruction; override;
 end;

 var
   Form1: TForm1;

 implementation

 uses System.Threading, FMX.Platform;

{$R *.fmx}

procedure TForm1.AfterConstruction;
begin
  inherited;
  FPushService :=TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
  FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := 'FirebaseProjectSenderID';

  FPushServiceConnection := TPushServiceConnection.Create(FPushService);
  FPushServiceConnection.OnChange := OnChange;
  FPushServiceConnection.OnReceiveNotification := OnReceivedNotification;
end;

procedure TForm1.BeforeDestruction;
begin
  inherited;
  FPushServiceConnection.DisposeOf;
  FPushService.DisposeOf;
end;

procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  Memo1.Lines.Clear;

  TTask.Run(
    procedure
    begin
      FPushServiceConnection.Active := CheckBox1.IsChecked;
    end
  );
end;

procedure TForm1.OnChange(Sender: TObject; AChange: TPushService.TChanges);
begin
  Memo1.Lines.Add('Token=' + FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken]);
end;

procedure TForm1.OnReceivedNotification(Sender: TObject; const ANotification: TPushServiceNotification);
begin
  Memo1.Lines.Add('Notification=' + ANotification.DataObject.ToString);
end;

标签: androidfirebasedelphifirebase-cloud-messaging

解决方案


推荐阅读