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

TPushClient - нашёл чудесную вещь


Вопрос

Наткнулся тут на изящную штуку для приложения с PUSH уведомлениями на Android и Ios. Один объект, все сам делает.

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

Описание тут https://delphiworlds.com/2017/04/firebase-cloud-messaging-android-ios/

Исходный код с примером на гитхабе https://github.com/DelphiWorlds/PushClient

Использование максимально простое:

uses DW.PushClient;
....
	private
    FPushClient: TPushClient;
    procedure PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges);
    procedure PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification);
....

procedure TFormMain.InitPushService;
begin
  FPushClient := TPushClient.Create;
  FPushClient.GCMAppID := ConstGCMAppID;
  FPushClient.ServerKey := '';
  FPushClient.BundleID := '';
  FPushClient.UseSandbox := Debug; // Change this to False for production use!
  FPushClient.OnChange := PushClientChangeHandler;
  FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler;
  try
    FPushClient.Active := True;
  except
    SendError('FPushClient.Active Exception');
  end;
end;

procedure TFormMain.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges);
begin
  if TPushService.TChange.DeviceToken in AChange then
  begin
    HDevicePushParams.DeviceID:=FPushClient.DeviceID;
    HDevicePushParams.DeviceToken:=FPushClient.DeviceToken;
    GetHTTP(CommandRegisterFCM);
//    Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID);
//    Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken);
  end;
end;

procedure TFormMain.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification);
begin
//  ShowMessage(ANotification.DataObject.ToString...
end;

Правда руки не дошли разобраться для чего ему 

  FPushClient.ServerKey := '';
  FPushClient.BundleID := '';

Но и без этого работает.
 

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

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

  • 0
  • Модераторы
1 час назад, Евгений Корепов сказал:

Правда руки не дошли разобраться для чего ему 

  FPushClient.ServerKey := '';
  FPushClient.BundleID := '';

Но и без этого работает.

Это для iOS чтобы преобразовывать токен, apns->fcm

Я думаю что у него не правильно реализована iOS часть, токен умрет если часто не входить в приложение.

он отправляет уже преобразованный токен, а надо хранить реальный который выдал девайс.

Ссылка на комментарий
  • 0
16 минут назад, Равиль Зарипов (ZuBy) сказал:

Это для iOS чтобы преобразовывать токен, apns->fcm

Я думаю что у него не правильно реализована iOS часть, токен умрет если часто не входить в приложение.

он отправляет уже преобразованный токен, а надо хранить реальный который выдел девайс.

У него на гитхабе внизу есть пометка

Цитата

NOTE: This project has been put into sleep mode, in preference of the FCMStarter demo in the KastriFree project:

но что за KastriFree project я не успел посмотреть, может там все есть.

Под андроидом работает отлично. Давно сам хотел все в отдельном модуле оформить, но тут удачно наткнулся...

Ссылка на комментарий
  • 0
  • Модераторы
50 минут назад, Евгений Корепов сказал:

Давно сам хотел все в отдельном модуле оформить, но тут удачно наткнулся...

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

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

Запустил Демо, уведомления не приходят. Ошибок никаких не выдается, но и уведомлений нет. 

Функция 

procedure TForm1.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges);
begin
  if TPushService.TChange.DeviceToken in AChange then
  begin
    Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID);
    Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken);
  end;
end;

отрабатывает, появляются значения DeviceID и DeviceToken, а функция 

procedure TForm1.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification);
begin
  Memo1.Lines.Add('Notification: ' + ANotification.DataObject.ToString);
end;

не вызывается.

Может я что не так в FireBase настроил. Но вроде там трудно ошибиться.

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

Наткнулся тут на изящную штуку для приложения с PUSH уведомлениями на Android и Ios. Один объект, все сам делает.

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

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

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

И работает демо из коробки, ничего изменять не надо? Только вбить FPushClient.GCMAppID?

Я правильно понимаю, что при отправке Notification из консоли Firebase я должен сразу получить уведомление?

Ссылка на комментарий
  • 0
3 минуты назад, gonzales сказал:

И работает демо из коробки, ничего изменять не надо? Только вбить FPushClient.GCMAppID?

Я правильно понимаю, что при отправке Notification из консоли Firebase я должен сразу получить уведомление?

Бывает что после настройки Firebase изменения не сразу проходят в недрах гугля, иногда через пару дней только все начинает работать. Не знаю как сейчас, раньше нужно было еще и опубликовать приложение в маркете, бывало что под дебаг версией не приходили сообщения, а только под релизной. Хотя могу и ошибаться, давно было, сейчас все работает - настроил и забыл...

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

Еще раз хочу уточнить технику секса

1. Регистрирую приложение для Андроид в FireBase

2. В настройках проекта на вкладке Cloud Messaging копирую Идентификатор отправителя

3. Открываю Demo проект, кстати вопрос, DW.PushClient.pas и  DW.RegisterFCM.pas лежат не в папке с Демо, тем не менее все компилится, как-то странно. Эти файлы никуда не нужно положить?

4. Вношу изменения

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  FPushClient := TPushClient.Create;
  FPushClient.GCMAppID :='280557678639'; //cFCMSenderID;
  FPushClient.ServerKey :=''; //cFCMServerKey;
  FPushClient.BundleID :=''; //cFCMBundleID;
  FPushClient.UseSandbox := True; // Change this to False for production use!
  FPushClient.OnChange := PushClientChangeHandler;
  FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler;
  FPushClient.Active := True;
end;

5. Запускаю на телефоне. Компилится без ошибок. После старта наблюдаю значения DeviceID и DeviceToken

6. В FireBase на вкладке Notifications создаю новое сообщение, в котором указываю Цель - сегмент пользователей, выбираю свое приложение, жму "Отправить сообщение"

По идее все. Может чего упустил? Может ли кто-нибудь повторить такой подход, был бы крайне благодарен?

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

У меня закрадываются сомнения, что я чего-то не понимаю в отправке пушей. Нужен ли еще дополнительно сервер для отправки пушей, как написано в этой статье

Хотя судя по этой статье для тестирования пушей ничего кроме FireBase не надо

Евгений, поясните пожалуйста строку 

GetHTTP(CommandRegisterFCM);

В демо примере такого нет

 

Изменено пользователем gonzales
Ссылка на комментарий
  • 0
1 час назад, gonzales сказал:

У меня закрадываются сомнения, что я чего-то не понимаю в отправке пушей. Нужен ли еще дополнительно сервер для отправки пушей, как написано в этой статье

Хотя судя по этой статье для тестирования пушей ничего кроме FireBase не надо

Евгений, поясните пожалуйста строку 


GetHTTP(CommandRegisterFCM);

В демо примере такого нет

 

Сервер просто заменит вас, т.е. его функция хранение идентификаторов устройств (если нужно) и токенов. И вы его заставите делать тоже самое что и вы сейчас - запомнить токен и отправить сообщение с помощью него (но уже через АПИ FireBase).

В FireBase есть отладка пушсообщений, она вам что то показывает?

И еще вопрос - приложение у вас опубликовано в маркете?

Ссылка на комментарий
  • 0
1 час назад, gonzales сказал:

Евгений, поясните пожалуйста строку 


GetHTTP(CommandRegisterFCM);
В демо примере такого нет
procedure TFormMain.GetHTTP(ACommand : String; AIndex : Integer = -1; AImageURL : String = '');
Var AHTTPRec : THTTPRec;
    AFileName : String;
begin
  FAppStage:='GetHTTP '+ACommand+' start';
  AHTTPRec.Query:='';
  AHTTPRec.CachePath:='';
  AHTTPRec.ErrorMsg:='';
  AHTTPRec.ErrorCode:=0;
{SKIP CODE}
  if ACommand=CommandRegisterFCM then
  begin
    if Setting.RegionCode.IsEmpty then
      Exit;
    AHTTPRec.Query:=APIURL+'?cmd='+ACommand+'&region='+Setting.RegionCode+
      '&DeviceID='+HDevicePushParams.DeviceID+'&DeviceToken='+HDevicePushParams.DeviceToken+'&AppVer='+AppVersion;
    if Setting.SettingState.AllNotification then
      AHTTPRec.Query:=AHTTPRec.Query+'&AllNotification=1'
    Else
      AHTTPRec.Query:=AHTTPRec.Query+'&AllNotification=0';
  end;
{SKIP CODE}
  FQueueRequest.PushItem(AHTTPRec); //Заталкиваем данные в FQueueRequest: TThreadedQueue<THTTPRec> - передаем данные в отдельный поток для отправки запроса
  FAppStage:='GetHTTP stop '+ACommand;
end;

Вот что в этой функции - подготавливаем все нужные данные для моего сервера PUSH на PHP и отправляем в очередь для потока который их отправит как освободится от других задач.

  THTTPRec=record
    Command : String;        //Текущая команда
    Query : String;        //Запрос в виде http://url
    CachePath : String;        //Путь для хранения кеша полученных данных
    ErrorMsg : String;     //Результатт в текстовом виде
    ErrorCode : Integer;   //Результат в числовом виде
    JSON : TJSONObject;       
//    MemoryStream : TMemoryStream;
//    Bitmap : TBitmap;
    BitmapSurface : TBitmapSurface;
//    ListItemImage : TListItemImage;
//    ListItemImage : TBitmap;
    ImageIndex : Integer;
    FromCache : Boolean;
  end;

THTTPRec  служит для обмена данными с HTTP потоком - отправляем данные потоку и получаем данные из потока

Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0
Цитата

В FireBase есть отладка пушсообщений, она вам что то показывает?

Что все завершено, см скрин

 

Цитата

И еще вопрос - приложение у вас опубликовано в маркете?

Нет, пока только тест.

 

Сейчас сделал все по примеру Равиля http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html

В нем работает ПУШ при таргетировании на устройство, обычный так и не приходит

Снимок.PNG

Ссылка на комментарий
  • 0
5 часов назад, gonzales сказал:

Приведенный здесь код тоже оказался рабочий при посылке пуша по токену. Пуш приходит. Но встает вопрос, как обработать его при открытии приложения?

Ответ уже есть на форуме в ветке пуша, поищите.

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

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

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

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

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

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

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

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

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

×
×
  • Создать...