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 и 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 уже не идет, сразу ошибка.
Если кто сталкивался, помогите плиз
Изменено пользователем gonzalesСсылка на комментарий
9 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.