Я добавил записи что ты просил.. Я не очень понял в какой момент вызывается OnServiceConnectionChange.. для Анроид приложения.Вот полный код.. И по его исполнению.. выводится только первый блок в мемо1. А до OnServiceConnectionChange не доходит..Подправьте пожалуйста код -- так как он должен быть в рабочем состоянии... Заранее благодарю!!!!!!!
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.StdCtrls,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,System.PushNotification,
FMX.PushNotification.Android,system.JSON;
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Memo1: TMemo;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
FDeviceID: string;
FDeviceToken: string;
FPushService: TPushService;
FPushServiceConnection: TPushServiceConnection;
public
{ Public declarations }
procedure OnReceiveNotificationEvent(Sender: TObject;
const ANotification: TPushServiceNotification);
procedure OnServiceConnectionChange(Sender: TObject;AChange: TPushService.TChanges);
procedure PushServiceRegister;
end;
const
FAndroidServerKey = '687234578278';
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormShow(Sender: TObject);
begin
PushServiceRegister();
end;
procedure TForm1.OnReceiveNotificationEvent(Sender: TObject;
const ANotification: TPushServiceNotification);
const
FCMSignature = 'gcm.notification.body';
GCMSignature = 'message';
APNsSignature = 'alert';
var
aText: string;
aObj: TJSONValue;
begin
// это событие срабатывает при открытом приложении
{$IFDEF ANDROID}
aObj := ANotification.DataObject.GetValue(GCMSignature);
if aObj <> nil then
aText := aObj.Value
else
aText := ANotification.DataObject.GetValue(FCMSignature).Value;
{$ELSE}
aObj := ANotification.DataObject.GetValue(APNsSignature);
if aObj <> nil then
aText := aObj.Value;
{$ENDIF}
ShowMessage(aText);
end;
procedure TForm1.OnServiceConnectionChange(Sender: TObject;
AChange: TPushService.TChanges);
begin
if (TPushService.TChange.DeviceToken in AChange) and
Assigned(FPushServiceConnection) then
begin
FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
memo1.Lines.Add('FDeviceID2: '+FDeviceID);
memo1.Lines.Add('FDeviceToken2: '+FDeviceToken);
// тут отправляем в хранилище токенов (на сервер с БД например)
end;
end;
procedure TForm1.PushServiceRegister;
begin
FPushService := nil;
FPushServiceConnection := nil;
{$IF defined(ANDROID)}
FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey;
{$ENDIF}
{$IF defined(IOS) AND defined(CPUARM)}
FPushService := TPushServiceManager.Instance.GetServiceByName
(TPushService.TServiceNames.APS);
{$ENDIF}
if Assigned(FPushService) then
begin
FPushServiceConnection := TPushServiceConnection.Create(FPushService);
FPushServiceConnection.OnChange := OnServiceConnectionChange;
FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;
FPushServiceConnection.Active := true;
FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
// тут отправляем в хранилище токенов (на сервер с БД например)
memo1.Lines.Add('FDeviceID: '+FDeviceID);
memo1.Lines.Add('FDeviceToken: '+FDeviceToken);
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
//ghj
end;
end.