Перейти к содержанию
Fire Monkey от А до Я
  • 1

поломались ПУШи в 10.4


gonzales

Вопрос

Не могу одолеть пуши при компиляции приложения в 10.4

Вот стандартный код

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.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.PushNotification, System.JSON,
  System.Net.HTTPClient, System.Threading,REST.Types
{$IFDEF ANDROID}, FMX.PushNotification.Android, FMX.Memo.Types{$ENDIF}
{$IFDEF IOS}, FMX.PushNotification.IOS{$ENDIF};

type
  TForm1 = class(TForm)
    MemoLog: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    FDeviceID: string;
    FDeviceToken: string;

    FPushService: TPushService;
    FPushServiceConnection: TPushServiceConnection;

    procedure OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification);
    procedure OnServiceConnectionChange(Sender: TObject; AChange: TPushService.TChanges);

    procedure PushServiceRegister;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

const
  FAndroidServerKey = '13648316531';

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];
    MemoLog.Lines.Add('DeviceID - '+ FDeviceID);
    MemoLog.Lines.Add('DeviceToken - '+ 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];

    MemoLog.Lines.Add('DeviceID - '+ FDeviceID);
    MemoLog.Lines.Add('DeviceToken - '+ FDeviceToken);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 PushServiceRegister;
end;


end.

При регистрации пуш-сервиса строка FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey; вызывает Segmentation Fault (11)

В 10.3 тот же самый код работает, дебаг ничего не дает, проваливаюсь в процедуру

procedure TPushService.SetAppProp(const AName, AValue: string);
begin
  FAppProps.AddOrSetValue(AName, AValue);
end;

а внутрь AddOrSetValue уже не идет, сразу ошибка.

Если кто сталкивался, помогите плиз

Изменено пользователем gonzales
Ссылка на комментарий

Рекомендуемые сообщения

  • 1

Нашел причину,

В недрах класса TPushService

 TPushService = class abstract
  public
    type
      TPropPair = TPair<string, string>;
      TPropArray = TArray<TPropPair>;
      // commonly used names
      TServiceNames = record
      public const
        GCM = 'gcm';  // deprecated 'Is not available anymore. Please use FCM instead';  // Google cloud messaging
        FCM = 'fcm';  // Google Firebase cloud messaging
        APS = 'aps';  // Apple
      end;

Соответственно нужно исправить

FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);

на

FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM);

 

Все работает

Ссылка на комментарий
  • 0

Веселье продолжается.

Все тоже стандартное приложение не компилится на Андроид64 (На iOS тоже, но с ним буду разбираться отдельно)

Ругается на  юнит FMX.PushNotification.Android

[DCC Fatal Error] Unit1.pas(10): F2613 Unit 'Androidapi.JNI.PlayServices.Tasks' not found.
  Unit1.pas(10): Unit 'Androidapi.JNI.PlayServices.Tasks' is used by 'Androidapi.JNI.Firebase'
  Unit1.pas(10): Unit 'Androidapi.JNI.Firebase' is used by 'FMX.PushNotification.Android'

Может библиотеку нужно какую добавить?

ЗЫ. Для Андроид32 компилится без ошибок и работает правильно

Ссылка на комментарий
  • 0

Нашел причину

В Library path для Андроид64 добавил путь E:\Embarcadero\Studio\21.0\source\rtl\android, где собственно и лежит Androidapi.JNI.PlayServices.Tasks.pas и все заработало.

Буду с iOS разбираться теперь

Ссылка на комментарий
  • 0
В 03.07.2020 в 16:45, gonzales сказал:

Нашел причину,

В недрах класса TPushService


 TPushService = class abstract
  public
    type
      TPropPair = TPair<string, string>;
      TPropArray = TArray<TPropPair>;
      // commonly used names
      TServiceNames = record
      public const
        GCM = 'gcm';  // deprecated 'Is not available anymore. Please use FCM instead';  // Google cloud messaging
        FCM = 'fcm';  // Google Firebase cloud messaging
        APS = 'aps';  // Apple
      end;

Соответственно нужно исправить

FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);

на

FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM);

 

Все работает

Спасибо за решение! Ещё не пробовал, тоже столкнулся со всеми проблемами о которых ты пишешь. Решил просто андроид собирать на 10.3 во избежании проблем... на иосе вроде проблем не заметил... на хуавее проверь уведомления, приходить не будут? пытаюсь разобраться не получается, поднял тему на форуме...

http://fire-monkey.ru/topic/6768-не-приходят-push-на-huawei-защищённые-приложения/

Изменено пользователем Roma77751
Ссылка на комментарий
  • 0
В 03.07.2020 в 13:45, gonzales сказал:

Нашел причину,

В недрах класса TPushService


 TPushService = class abstract
  public
    type
      TPropPair = TPair<string, string>;
      TPropArray = TArray<TPropPair>;
      // commonly used names
      TServiceNames = record
      public const
        GCM = 'gcm';  // deprecated 'Is not available anymore. Please use FCM instead';  // Google cloud messaging
        FCM = 'fcm';  // Google Firebase cloud messaging
        APS = 'aps';  // Apple
      end;

Соответственно нужно исправить

FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);

на

FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM);

 

Все работает

Все сделал так как вы описали. При компиляции выдает: [DCC Error] Unit3.pas(2142): E2003 Undeclared identifier: 'FCM'. Складывается такое впечатление, что эти константы определены где то еще. потому что даже если удалить всю структуру  TServiceNames = record из TPushService = class abstract, всеравно компилируется, хоть и строка FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM) подчеркивается красным... что за ерунда?

Ссылка на комментарий
  • 0
В 01.12.2020 в 21:32, Edward Tarasov сказал:

Все сделал так как вы описали. При компиляции выдает: [DCC Error] Unit3.pas(2142): E2003 Undeclared identifier: 'FCM'. Складывается такое впечатление, что эти константы определены где то еще. потому что даже если удалить всю структуру  TServiceNames = record из TPushService = class abstract, всеравно компилируется, хоть и строка FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM) подчеркивается красным... что за ерунда?

А какая версия Delphi?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...