Вроде все работает. Разрешений не нужно никаких вообще. До этого ошибочно требовало доступ к учетной записи - пофиксили.
Код вроде остался прежним, вот кусок из живого проекта:
procedure TFormMain.InitPushService;
begin
TTask.Run(
procedure
Var ADeviceID, ADeviceToken : String;
begin
FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := ConstGCMAppID;
if Assigned(FPushService) then
begin
FPushServiceConnection := TPushServiceConnection.Create(FPushService);
FPushServiceConnection.OnChange := OnPushServiceConnectionChange;
FPushServiceConnection.OnReceiveNotification := OnReceivePushNotificationEvent;
FPushServiceConnection.Active := True;
ADeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
ADeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
FSettings.Flags.PushServiceInited:=True;
TThread.Synchronize(TThread.CurrentThread,
procedure ()
begin
FNetwork.DeviceID:=ADeviceID;
FNetwork.DeviceToken:=ADeviceToken;
FNetwork.SendFCMRegistration(); // ??????????????????????????????
Log('DeviceID: ' + FNetwork.DeviceID);
Log('DeviceToken: ' + FNetwork.DeviceToken);
end);
end;
end
);
end;
procedure TFormMain.OnPushServiceConnectionChange(Sender: TObject; AChange: TPushService.TChanges);
begin
TThread.Synchronize(TThread.CurrentThread,
procedure ()
begin
if TPushService.TChange.DeviceToken in AChange then
begin
if Assigned(FNetwork) then
begin
FNetwork.DeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
FNetwork.DeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
Log('DeviceID: ' + FNetwork.DeviceID);
Log('DeviceToken: ' + FNetwork.DeviceToken);
FNetwork.SendFCMRegistration();
end;
end;
end
);
end;
procedure TFormMain.OnReceivePushNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification);
var AMessageSection : String;
begin
if Assigned(ANotification.Json) then
begin
Log('Push Message Json');
Log(ANotification.Json.ToString);
if ANotification.Json.TryGetValue('message_section', AMessageSection) then
begin
if AMessageSection.Equals('support') then
SetActiveTab(ConstSectionSupport);
if AMessageSection.Equals('news') then
SetActiveTab(ConstSectionNews);
if AMessageSection.Equals('info') then
SetActiveTab(ConstSectionInfo);
if AMessageSection.Equals('services') then
SetActiveTab(ConstSectionServices);
end
else
if FSettings.CurrentSection <> ConstSectionSupport then
SetActiveTab(ConstSectionSupport)
else
WebBrowserCallJS(TCallJS.SupportLoadContent);
PlaySoundEffects(1);
end;
end;
procedure TFormMain.CheckStartupNotifications();
var CurNotification : TPushServiceNotification;
begin
if Length(FPushService.StartupNotifications) > 0 then
for CurNotification in FPushService.StartupNotifications do
if Assigned(CurNotification) then
OnReceivePushNotificationEvent(Self, CurNotification);
NotificationCenter.CancelAll;
end;
Метод FNetwork.SendFCMRegistration() отсылает регистрацию на мой сервер. В методе проверяется получение регистрации и факт отсылки (он может вызываться несколько раз у меня)