android - 服务器通过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;
解决方案
推荐阅读
- hyperledger - 如何在超级账本卡尺中修复“缺少其“caliper.blockchain”字符串属性”
- google-apps-script - GAS 错误:TypeError:无法读取 null 的属性“getLastRow”(第 4 行,文件“Code2”)
- jquery - 如果列表中没有项目(通知),则切换 div
- javascript - 如何使用来自 for 循环的信息来编写电子邮件
- php - 打开页面时删除url中的某些部分
- javascript - 当用户单击/移出文本框时删除错误验证消息
- ios - 它们是否相当于原生 iOS 模拟器开发的反应原生“热重载”?
- html - 寻找正确的 Laravel 路线 | 从数据库中获取照片
- c - 我的快速排序实现不起作用
- google-colaboratory - Google Colab 中的运行时和会话有什么区别?