krapotkin Опубликовано 28 сентября, 2015 Поделиться Опубликовано 28 сентября, 2015 (изменено) Первый раз столкнулся с необходимостью слать push Пытаюсь понять логику работы. У меня есть back-end сервер на php и мобильное приложение Android на DX Мне нужно сделать оповещение конкретного пользователя о нужных ему изменениях в БД на сервере. Желательно даже когда программа в бакграунде. Я сделал тестовый пример PushEvents + ParseProvider. Все чудесно, но Поправьте меня, plz, если я неправильно понимаю концепцию 1) при запуске приложения зарегистрироваться в GCM и получить от него некий токен 2) переслать этот токен своему бак-енд серверу 3) в нужный момент сервер вызывает GCM сервис и просит передать сообщение конкретному клиенту с вот таким токеном так? Но всякие push события реализованы в TPushEvents, а реквизиты GCM - в провайдере TParseProvider. Нужен ли мне вообще ParseProvider если я все сообщения шлю от своего сервера прямо в GCM не используя parse?? По идее, мне нужен собственный провайдер?? что для этого нужно сделать? Изменено 28 сентября, 2015 пользователем krapotkin Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 2 октября, 2015 Поделиться Опубликовано 2 октября, 2015 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 Vitaldj 1 Цитата Ссылка на комментарий
0 alexbirukov Опубликовано 2 октября, 2015 Поделиться Опубликовано 2 октября, 2015 Провайдер тебе не нужен, посмотри в статье которую я сегодня выложил, там есть этот момент. Когда приходит Push, вызывается отдельная функция, которая выводит Notification, вне зависимости от состояния программы (в фоне или запущена). На форме никакие провайдеры не нужны. Я там привёл полный рабочий код из проекта для Delphi. Ingalime 1 Цитата Ссылка на комментарий
0 krapotkin Опубликовано 3 октября, 2015 Автор Поделиться Опубликовано 3 октября, 2015 да спасибо за ответы. именно в статье почерпнул все что нужно. проблема была именно в получении токена. со стороны сервера вызов HTTP примитивен. до сих пор пытаюсь найти источник, где вы это узнали ))) Цитата Ссылка на комментарий
0 alexbirukov Опубликовано 3 октября, 2015 Поделиться Опубликовано 3 октября, 2015 да спасибо за ответы. именно в статье почерпнул все что нужно. проблема была именно в получении токена. со стороны сервера вызов HTTP примитивен. до сих пор пытаюсь найти источник, где вы это узнали ))) Что именно нашёл? Там в статье есть ссылки на библиотеки PHP для работы с Push, есть примеры работы. Я просто объединил обе библиотеки одним скриптом простейшим + прикрутил запись токенов в базу. Код для Delphi взял из одного видео испанца (или итальянца), где он делает отправку Push через обращение напрямую к сервисам, но опять же используется токен. Я взял оттуда часть определения токена устройства. Просто для меня скрипт на PHP удобен тем, что к нему я могу обратиться из любого места, с любой платформы, будь то Web форма или приложение на C# \Delphi. Это лучше, чем для каждой отдельной программы\проекта писать код отправки Push сообщения напрямую через Apple и Google, уж тем более если платформа этого явно не поддерживает. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 9 октября, 2015 Автор Поделиться Опубликовано 9 октября, 2015 словил проблему TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM) возвращает NIL ... Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 9 октября, 2015 Поделиться Опубликовано 9 октября, 2015 словил проблему TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM) возвращает NIL ... В uses должно быть только System.PushNotification. В опциях проекта отметили Receive push notifications? Цитата Ссылка на комментарий
0 krapotkin Опубликовано 9 октября, 2015 Автор Поделиться Опубликовано 9 октября, 2015 отвечу сам в оригинальном видео на испанском языке товарищ подчеркивает наличие в uses fmx.PushNotification.android Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 9 октября, 2015 Поделиться Опубликовано 9 октября, 2015 отвечу сам в оригинальном видео на испанском языке товарищ подчеркивает наличие в uses fmx.PushNotification.android Да, точно. Дезинформировал в прошлом посте. У меня вот так: implementation {$IFDEF ANDROID} uses FMX.PushNotification.Android; Var APushService : TPushService; AServiceConnection : TPushServiceConnection; {$ENDIF ANDROID} Цитата Ссылка на комментарий
0 alewka006 Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 Почему-то у меня вот эта строчка ADeviceToken := APushService.DeviceTokenValue[ TPushService.TDeviceTokenNames.DeviceToken ]; возвращает '' Цитата Ссылка на комментарий
0 krapotkin Опубликовано 12 февраля, 2016 Автор Поделиться Опубликовано 12 февраля, 2016 AServiceConnection.Active:=True; ? Цитата Ссылка на комментарий
0 alewka006 Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 Да Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 Почему-то у меня вот эта строчка ADeviceToken := APushService.DeviceTokenValue[ TPushService.TDeviceTokenNames.DeviceToken ]; возвращает '' "Project Options"->"Entitlement List"->"Receive Push notifications" установлено в True? Цитата Ссылка на комментарий
0 alewka006 Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 У меня Делфи 10, я в ней такого пункта не нашел. Сейчас нет под рукой. Там что-то типа Send WAP push есть Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 У меня Делфи 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: Right-click your project in the Project Manager. Choose Project > Options > Entitlement List. Set Receive Push Notification value to True. Цитата Ссылка на комментарий
0 alewka006 Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 Спасибо большое, вечером посмотрю. Цитата Ссылка на комментарий
0 alewka006 Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 Все, нашел. Спасибо. Еще такой вопрос. У меня опубликовано приложение без пуш. Пока не обновлю пуш не пойдут или установив apk уже должен получать пуш? Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 12 февраля, 2016 Модераторы Поделиться Опубликовано 12 февраля, 2016 Нужно не только обновить/установить приложение, но и зарегистрировать ваш токен для получения уведомлений test_parser 1 Цитата Ссылка на комментарий
0 alewka006 Опубликовано 13 февраля, 2016 Поделиться Опубликовано 13 февраля, 2016 Выложил приложение в маркет на альфа тестирование, API ключ получил, идентификатор отправителя получил. Но сообщения доходят только когда приложение запущено. Цитата Ссылка на комментарий
0 dante333 Опубликовано 13 февраля, 2016 Поделиться Опубликовано 13 февраля, 2016 AndroidManifest.xml настраивали? Цитата Ссылка на комментарий
0 alewka006 Опубликовано 13 февраля, 2016 Поделиться Опубликовано 13 февраля, 2016 Нет. Я в делфи новичок, настроил все как в статье написано. Цитата Ссылка на комментарий
0 dante333 Опубликовано 14 февраля, 2016 Поделиться Опубликовано 14 февраля, 2016 Можно глянуть на него?Лежит в папке с вашим проектом.Название файла AndroidManifest.template.xml. Цитата Ссылка на комментарий
0 alewka006 Опубликовано 14 февраля, 2016 Поделиться Опубликовано 14 февраля, 2016 Да AndroidManifest.template.xml Цитата Ссылка на комментарий
0 dante333 Опубликовано 14 февраля, 2016 Поделиться Опубликовано 14 февраля, 2016 У вас не хватает в нем немного.Используйте этот.Он 100% рабочий. AndroidManifest.template.xml Цитата Ссылка на комментарий
0 alewka006 Опубликовано 14 февраля, 2016 Поделиться Опубликовано 14 февраля, 2016 Все получилось. Спасибо! Цитата Ссылка на комментарий
0 masmat Опубликовано 26 февраля, 2016 Поделиться Опубликовано 26 февраля, 2016 Провайдер тебе не нужен, посмотри в статье которую я сегодня выложил, там есть этот момент. Когда приходит Push, вызывается отдельная функция, которая выводит Notification, вне зависимости от состояния программы (в фоне или запущена). На форме никакие провайдеры не нужны. Я там привёл полный рабочий код из проекта для Delphi. Alex, а Вы не могли бы ссылку на статью отправить, а то не могу найти ее на сервере, может просто не понимаю какую статью искать Цитата Ссылка на комментарий
Вопрос
krapotkin
Первый раз столкнулся с необходимостью слать push
Пытаюсь понять логику работы.
У меня есть back-end сервер на php и мобильное приложение Android на DX
Мне нужно сделать оповещение конкретного пользователя о нужных ему изменениях в БД на сервере. Желательно даже когда программа в бакграунде.
Я сделал тестовый пример PushEvents + ParseProvider. Все чудесно, но
Поправьте меня, plz, если я неправильно понимаю концепцию
1) при запуске приложения зарегистрироваться в GCM и получить от него некий токен
2) переслать этот токен своему бак-енд серверу
3) в нужный момент сервер вызывает GCM сервис и просит передать сообщение конкретному клиенту с вот таким токеном
так?
Но всякие push события реализованы в TPushEvents, а реквизиты GCM - в провайдере TParseProvider.
Нужен ли мне вообще ParseProvider если я все сообщения шлю от своего сервера прямо в GCM не используя parse??
По идее, мне нужен собственный провайдер??
что для этого нужно сделать?
Изменено пользователем krapotkinСсылка на комментарий
34 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.