gonzales Опубликовано 3 июля, 2020 Опубликовано 3 июля, 2020 (изменено) Не могу одолеть пуши при компиляции приложения в 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 уже не идет, сразу ошибка. Если кто сталкивался, помогите плиз Изменено 3 июля, 2020 пользователем gonzales ENERGY 1 Цитата
1 gonzales Опубликовано 3 июля, 2020 Автор Опубликовано 3 июля, 2020 Нашел причину, В недрах класса 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); Все работает Roma77751, Astin Wolfone, ENERGY и 2 других 4 1 Цитата
0 Wada99 Опубликовано 19 июля, 2020 Опубликовано 19 июля, 2020 В 03.07.2020 в 16:45, gonzales сказал: Интересно, зачем они так оставили? Или просто недоглядели? Цитата
0 gonzales Опубликовано 12 августа, 2020 Автор Опубликовано 12 августа, 2020 Веселье продолжается. Все тоже стандартное приложение не компилится на Андроид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 gonzales Опубликовано 12 августа, 2020 Автор Опубликовано 12 августа, 2020 Нашел причину В Library path для Андроид64 добавил путь E:\Embarcadero\Studio\21.0\source\rtl\android, где собственно и лежит Androidapi.JNI.PlayServices.Tasks.pas и все заработало. Буду с iOS разбираться теперь Roma77751 и Ingalime 2 Цитата
0 gonzales Опубликовано 14 августа, 2020 Автор Опубликовано 14 августа, 2020 На iOS заметил, что приложение крашится при использовании aNotificationCenter.CancelAll; Пока не понятно, как без этого удалить пуши из шторки. Цитата
0 Roma77751 Опубликовано 22 августа, 2020 Опубликовано 22 августа, 2020 (изменено) В 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-защищённые-приложения/ Изменено 22 августа, 2020 пользователем Roma77751 Цитата
0 Edward Tarasov Опубликовано 1 декабря, 2020 Опубликовано 1 декабря, 2020 В 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 gonzales Опубликовано 3 декабря, 2020 Автор Опубликовано 3 декабря, 2020 В 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? Цитата
0 Edward Tarasov Опубликовано 3 декабря, 2020 Опубликовано 3 декабря, 2020 (изменено) 8 часов назад, gonzales сказал: А какая версия Delphi? 10.3... на 10.4.1 - все гуд. спасибо! Изменено 3 декабря, 2020 пользователем Edward Tarasov gonzales 1 Цитата
Вопрос
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 уже не идет, сразу ошибка.
Если кто сталкивался, помогите плиз
Изменено пользователем gonzales9 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.