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

PushEvents без Provider


krapotkin

Вопрос

Первый раз столкнулся с необходимостью слать push

Пытаюсь понять логику работы.

 

У меня есть back-end сервер на php и мобильное приложение Android на DX

Мне нужно сделать оповещение конкретного пользователя о нужных ему изменениях в БД на сервере. Желательно даже когда программа в бакграунде.

Я сделал тестовый пример PushEvents + ParseProvider. Все чудесно, но

 

Поправьте меня, plz, если я неправильно понимаю концепцию

1) при запуске приложения зарегистрироваться в GCM и получить от него некий токен

2) переслать этот токен своему бак-енд серверу

3) в нужный момент сервер вызывает GCM сервис и просит передать сообщение конкретному клиенту с вот таким токеном

так?

 

Но всякие push события реализованы в TPushEvents, а реквизиты GCM - в провайдере TParseProvider.

Нужен ли мне вообще ParseProvider если я все сообщения шлю от своего сервера прямо в GCM не используя parse??

По идее, мне нужен собственный провайдер??

что для этого нужно сделать?

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

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

  • 0
Var HDevicePushParams : TDevicePushParams;
       APushService : TPushService;
      AServiceConnection : TPushServiceConnection;
      SQuery : String;
begin
    APushService:=TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
    APushService.AppProps[TPushService.TAppPropNames.GCMAppID]:='ХХХХХХХХХХХХХХХХ';
    AServiceConnection:=TPushServiceConnection.Create(APushService);
    AServiceConnection.Active:=True;
    AServiceConnection.OnChange:=ServiceConnectionOnChange;
    AServiceConnection.OnReceiveNotification:=ServiceConnectionOnReceiveNotification;
    HDevicePushParams.DeviceID:=APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
    HDevicePushParams.DeviceToken:=APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];


  SQuery:=APIURL+'?DeviceID='+HDevicePushParams.DeviceID+'&DeviceToken='+HDevicePushParams.DeviceToken;  
  HTTPThread:=THTTPThread.Create(SQuery,FQueue);  // Здесь просто отправка на сервер в потоке.

Сервер принимает стоку и складывает в базу пары "DeviceID - DeviceToken", можно еще что нибудь отправлять, чтоб точно идентифицировать клиента.

А на сервере все еще проще. Вот php:
$title = 'Это заголовок';
$message = 'Это текст сообщения.'
$devices = 'DeviceToken - один конкретный получатель';
$apiKey = "AIzaХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ";
$gcpm = new GCMPushMessage($apiKey);
$gcpm->setDevices($devices);
$response = $gcpm->send($message, array('title' => $title));

Лениво было писать велосипед, использовал готовую отсылалку https://github.com/mattg888/GCM-PHP-Server-Push-Message . Там все просто, она заворачивает все в json и отправляет  на http

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

Провайдер тебе не нужен, посмотри в статье которую я сегодня выложил, там есть этот момент. Когда приходит Push, вызывается отдельная функция, которая выводит Notification, вне зависимости от состояния программы (в фоне или запущена). На форме никакие провайдеры не нужны. Я там привёл полный рабочий код из проекта для Delphi.

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

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

проблема была именно в получении токена. со стороны сервера вызов HTTP примитивен.

до сих пор пытаюсь найти источник, где вы это узнали )))

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

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

проблема была именно в получении токена. со стороны сервера вызов HTTP примитивен.

до сих пор пытаюсь найти источник, где вы это узнали )))

Что именно нашёл? Там в статье есть ссылки на библиотеки PHP для работы с Push, есть примеры работы. Я просто объединил обе библиотеки одним скриптом простейшим + прикрутил запись токенов в базу. Код для Delphi взял из одного видео испанца (или итальянца), где он делает отправку Push через обращение напрямую к сервисам, но опять же используется токен. Я взял оттуда часть определения токена устройства.

 

Просто для меня скрипт на PHP удобен тем, что к нему я могу обратиться из любого места, с любой платформы, будь то Web форма или приложение на C# \Delphi. Это лучше, чем для каждой отдельной программы\проекта писать код отправки Push сообщения напрямую через Apple и Google, уж тем более если платформа этого явно не поддерживает.

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

словил проблему

 

TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM) возвращает NIL

...

 

В uses должно быть только System.PushNotification.

В опциях проекта отметили Receive push notifications?

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

отвечу сам

в оригинальном видео на испанском языке товарищ подчеркивает наличие  в uses  fmx.PushNotification.android 

Да, точно. Дезинформировал в прошлом посте. У меня вот так:

implementation
{$IFDEF ANDROID}
uses FMX.PushNotification.Android;

Var APushService : TPushService;
    AServiceConnection : TPushServiceConnection;
{$ENDIF ANDROID}
Ссылка на комментарий
  • 0

Почему-то у меня вот эта строчка ADeviceToken := APushService.DeviceTokenValue[ TPushService.TDeviceTokenNames.DeviceToken ]; возвращает ''

"Project Options"->"Entitlement List"->"Receive Push notifications" установлено в True?

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

У меня Делфи 10, я в ней такого пункта не нашел. Сейчас нет под рукой. Там что-то типа Send WAP push есть

Согласно http://docwiki.embarcadero.com/RADStudio/Seattle/en/Multi-Device_Application_to_Receive_Push_Notifications  , примерно в середине статьи:

Project Settings

To enable your application to receive remote notifications:

  1. Right-click your project in the Project Manager.
  2. Choose Project > Options > Entitlement List.
  3. Set Receive Push Notification value to True.
Ссылка на комментарий
  • 0
  • Модераторы

Нужно не только обновить/установить приложение, но и зарегистрировать ваш токен для получения уведомлений

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

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

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

Провайдер тебе не нужен, посмотри в статье которую я сегодня выложил, там есть этот момент. Когда приходит Push, вызывается отдельная функция, которая выводит Notification, вне зависимости от состояния программы (в фоне или запущена). На форме никакие провайдеры не нужны. Я там привёл полный рабочий код из проекта для Delphi.

 

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

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

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

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

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

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

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

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

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

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

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

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