krapotkin Опубликовано 29 сентября, 2015 Поделиться Опубликовано 29 сентября, 2015 2 дня пытаюсь продолбиться сквозь эти дебри (( прошу помощи тех, кто уже прошел этот уровень... Мне нужен способ послать сообщение одному конкретному клиенту. Например, мобильный клиент шлет данные на мой сервер, через какое-то время сервер шлет клиенту push - ваши данные проверены, все ок... Я использовал Parse Provider, т.к. не нашел другого способа получить DeviceToken от GCM теперь уперся сюда, пример взят из инструкции: https://developers.google.com/cloud-messaging/downstream отправляю сообщение https://gcm-http.googleapis.com/gcm/sendContent-Type:application/jsonAuthorization:key=AIzaSyZ_мой_серверный_ключ{ "data": { "score": "5x1", "time": "15:10" }, "to" : "APA91..._мой_device_token"} сейчас приходит ответ HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 ... {"multicast_id":4890281057234742377,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]} Кто такой SenderID ??? и где его указать ?? (( p.s. заголовок вроде верный, т.к. если что-то менять в Authorization, сразу ошибка 401 Unauthorized если менять параметр "to", то ответ 400 Bad Request INVALID_REGISTRATION Цитата Ссылка на комментарий
0 rustam_d Опубликовано 30 сентября, 2015 Поделиться Опубликовано 30 сентября, 2015 2 дня пытаюсь продолбиться сквозь эти дебри (( прошу помощи тех, кто уже прошел этот уровень... мда странный подход у вас крапоткин...обычно сначала пишут в поисковике PUSH ну у меня все без посредников и дроид и иос давай начнем с дроида я на форуме писал что манифест править обязон правил? Цитата Ссылка на комментарий
0 rustam_d Опубликовано 30 сентября, 2015 Поделиться Опубликовано 30 сентября, 2015 (изменено) Отправка на VCL и FMX (но без разницы, т.е. вообще откуда без разницы, php, mssql, c# да даже с батника кажись мона...) procedure TForm1.Button1Click(Sender: TObject); var vIn, vOut: TStringStream; begin Memo1.Clear; try vIn := TStringStream.Create( '{"registration_ids":["' + Edit1.Text + '"],"data":{"id":"'+ edID.Value.ToString +'","message":"' + Edit2.Text + '"}}', TEncoding.UTF8 ); vOut := TStringStream.Create('',TEncoding.UTF8); pIdHTTP.Post('https://android.googleapis.com/gcm/send', vIn, vOut); Memo1.Lines.Add(vOut.DataString); Memo1.Lines.Add(vIn.DataString); if Pos('"success":1',vOut.DataString) > 0 then ShowMessage('Сообщение отправлено успешно!'); finally vIn.Free; vOut.Free; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin pIdHTTP.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin ID := 1; pIdHTTP := TIdHttp.Create(Self); pIdHTTP.Request.ContentType := 'application/json'; pIdHTTP.Request.CustomHeaders.AddValue('Authorization',CKey); end; CKey это ключ GCM, 40 знаков, он у вас есть думаю, Edit1 токен, Edit2 сообщение (обратите внимание SSL и т.п. здесь не нужен) По серверу я закрыл вам вопрос, по клиенту если че пишите. Upd: Забыл сказать, ID любая цифра (на ваше усмотрение, например 1 можно обозначить обновление, 2 реклама, 3 и т.п. это для вашего клиента). Изменено 30 сентября, 2015 пользователем rustam_d Цитата Ссылка на комментарий
0 ruslan Опубликовано 30 сентября, 2015 Поделиться Опубликовано 30 сентября, 2015 а как без SSL шлешь на https ? ето в 10-ке какая-то новинка ? где-то слышал, что там вроде indy щас https по-другому обрабатывает. п.с. раньше без SSL не работало Цитата Ссылка на комментарий
0 rustam_d Опубликовано 30 сентября, 2015 Поделиться Опубликовано 30 сентября, 2015 а как без SSL шлешь на https ? ето в 10-ке какая-то новинка ? где-то слышал, что там вроде indy щас https по-другому обрабатывает. п.с. раньше без SSL не работало вопрос к делфи? зачем вы меня спрашиваете если работает...)) а в других случаях да использую... Цитата Ссылка на комментарий
0 krapotkin Опубликовано 30 сентября, 2015 Автор Поделиться Опубликовано 30 сентября, 2015 проблема не отправить пуш проблема отправить пуш конкретному клиенту vIn := TStringStream.Create( '{"registration_ids":["' + Edit1.Text в новом API рекомендуют вместо "registration_ids" использовать "to" так вот что бы такое написать в Edit1.text ?? Цитата Ссылка на комментарий
0 krapotkin Опубликовано 30 сентября, 2015 Автор Поделиться Опубликовано 30 сентября, 2015 кстати, на http запрос тоже прекрасно проходит Цитата Ссылка на комментарий
0 rustam_d Опубликовано 1 октября, 2015 Поделиться Опубликовано 1 октября, 2015 (изменено) проблема не отправить пуш проблема отправить пуш конкретному клиенту vIn := TStringStream.Create( '{"registration_ids":["' + Edit1.Text в новом API рекомендуют вместо "registration_ids" использовать "to" так вот что бы такое написать в Edit1.text ?? ок, но мало ли че рекомендуешь...тут экстаз когда вообще эта канитель заработает )). Edit1 или конкретный юзер, это все уникальный токен(ID) приложения для каждого клиента. Правильно выразиться тебе можно было так "как получить токен", лови упрощенный тест...должен работать (правда там есть ненавистное тобой сохранение токена в файл )) ): uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.PushNotification.Android, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.PushNotification, FMX.StdCtrls, System.IOUtils, IPPeerClient, REST.Backend.PushTypes, System.JSON, Data.Bind.Components, Data.Bind.ObjectScope, REST.Backend.BindSource, REST.Backend.PushDevice, FMX.Notification; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure PushEvents1PushReceived(Sender: TObject; const AData: TPushData); private { Private declarations } public { Public declarations } procedure OnChange(Sender: TObject; AChange: TPushService.TChanges); procedure OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification); procedure getAllNotfications; end; var Form1: TForm1; APushService: TPushService; AServiceConnection: TPushServiceConnection; NotificationCenter: TNotificationCenter; implementation {$R *.fmx} procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Lines.Clear; end; procedure TForm1.OnChange(Sender: TObject; AChange: TPushService.TChanges); begin Memo1.Lines.Add('OnChange'); end; procedure TForm1.OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification); begin Memo1.Lines.Add('DataKey=' + ANotification.DataKey); Memo1.Lines.Add('JSon=' + ANotification.Json.ToString); Memo1.Lines.Add('DataObject=' + ANotification.DataObject.ToString); end; procedure TForm1.PushEvents1PushReceived(Sender: TObject; const AData: TPushData); begin Memo1.Lines.Add('PushReceived = ' + AData.GCM.Message); end; procedure TForm1.Button1Click(Sender: TObject); var ADeviceID, ADeviceToken: string; begin APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); APushService.AppProps[TPushService.TAppPropNames.GCMAppID] := '1234567890'; //ваш GCM ID короткий AServiceConnection := TPushServiceConnection.Create(APushService); AServiceConnection.Active := true; AServiceConnection.OnChange := OnChange; AServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent; ADeviceID := APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID]; ADeviceToken := APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken]; Memo1.Lines.Add('ADeviceID=' + ADeviceID); Memo1.Lines.Add('ADeviceToken=' + ADeviceToken); Memo1.Lines.SaveToFile(TPath.GetDownloadsPath + '/token.txt'); Memo1.Lines.Add(TPath.GetDownloadsPath + '/token.txt'); //getAllNotfications; end; //this procedure is called in the OnActivate event of app the main form. procedure TForm1.getAllNotfications; var LNotification: TPushServiceNotification; begin for LNotification in AServiceConnection.Service.StartupNotifications do begin if Assigned(LNotification) and (LNotification.Json.ToString<>'') then begin Memo1.Lines.Add('Enter by Notification Click: ' + LNotification.Json.ToString); end; end; end; есть пара нюансов которые ты ощутишь когда пуши заработают, когда открыта прога, то пуши не отражаются в шторке, вот для их отлова и OnReceiveNotificationEvent. Также когда прога закрыта и не запущена, юзер входит в прогу по шторке и тогда их ловишь через Form1.OnActivate - getAllNotfications. Прога в штроке не очищается сама...персонально каждую иконку не очистишь(никто в этом мире не знает как из фмх!), но все иконки своей проги можно стереть, в этой же активате процедуре подчищаешь за собой типа так with TNotificationCenter.Create(Self) do CancelAll; манифест андроида клиента править ВСЯКО надо. пост тут http://fire-monkey.ru/topic/1745-rad-x-push-uvedomleniia/ UPD: забыл сказать, тебе ADeviceID нафиг не нужен, есть и другие пути его определения, да и нужно ли, если на чайна планшетах он всегда 012345678... все я тебе закрыл вопрос по пушам полностью, удачи. Когда начнешь юзать ИОС (точнее ощутишь разницу между "windows-это комфорт андроид" и "unix-вешалка с идио..ми из мак") обращайся... Изменено 1 октября, 2015 пользователем rustam_d Цитата Ссылка на комментарий
0 krapotkin Опубликовано 9 октября, 2015 Автор Поделиться Опубликовано 9 октября, 2015 с чем может быть связано ? APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); APushService == NIL Kitty 1 Цитата Ссылка на комментарий
0 krapotkin Опубликовано 9 октября, 2015 Автор Поделиться Опубликовано 9 октября, 2015 отвечу сам в оригинальном видео на испанском языке товарищ подчеркивает наличие в uses fmx.PushNotification.android Kitty 1 Цитата Ссылка на комментарий
0 rustam_d Опубликовано 9 октября, 2015 Поделиться Опубликовано 9 октября, 2015 отвечу сам в оригинальном видео на испанском языке товарищ подчеркивает наличие в uses fmx.PushNotification.android да есть такое, уже привык что отсутствие модуля не значит, что не скомпилится...еще как ). Писал вон с ИОС аналог ситуация была...не добавил и привет... а я ведь не зря юсесы показываю...не зря... P.S. в VCL всегда старался убрать лишние модули, т.к. потенциальная потеря памяти...а тут... Цитата Ссылка на комментарий
0 alexbirukov Опубликовано 9 октября, 2015 Поделиться Опубликовано 9 октября, 2015 А в Delphi 10 надо добавить System.Notification, если указывать fmx.PushNotification.android или fmx.PushNotification.ios будет выдавать ошибку компиляции. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 20 октября, 2015 Автор Поделиться Опубликовано 20 октября, 2015 чтобы новую тему не открывать, попробую тут продолжить в документации написано { "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", "notification" : { "body" : "This week’s edition is now available.", "title" : "NewsMagazine.com", "icon" : "new", },} и предполагается, что в уведомлении в шторке показывается заголовок из поля title и текст из body у меня почему-то просто пустое уведомление висит (режим программа неактивна, просто висит в памяти) Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 24 октября, 2015 Поделиться Опубликовано 24 октября, 2015 (изменено) чтобы новую тему не открывать, попробую тут продолжить в документации написано { "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", "notification" : { "body" : "This week’s edition is now available.", "title" : "NewsMagazine.com", "icon" : "new", }, } и предполагается, что в уведомлении в шторке показывается заголовок из поля title и текст из body у меня почему-то просто пустое уведомление висит (режим программа неактивна, просто висит в памяти) { "registration_ids": [ "APA91bFwDgtPtlwgvbgVt7qpxqes0UIi...", "APA91bFS3fknVDY6qifQiJ1KZDSjwZE..." ], "data": { "title": "Заголовок сообщения", "message": "Текст сообщения" } } Изменено 24 октября, 2015 пользователем Евгений Корепов rustam_d 1 Цитата Ссылка на комментарий
0 krapotkin Опубликовано 24 октября, 2015 Автор Поделиться Опубликовано 24 октября, 2015 да, это я тоже нашел методом тыка вопрос как раз, что с документацией, либо я что-то недоглядел? Цитата Ссылка на комментарий
0 krapotkin Опубликовано 24 октября, 2015 Автор Поделиться Опубликовано 24 октября, 2015 либо это сервис от Embarcadero так работает, вне доков? Цитата Ссылка на комментарий
0 rustam_d Опубликовано 24 октября, 2015 Поделиться Опубликовано 24 октября, 2015 да, это я тоже нашел методом тыка я не понял из вашего текста, это работает то что написал Евгений? ...а то давно мечтал название программы заменить на титле... Цитата Ссылка на комментарий
0 krapotkin Опубликовано 24 октября, 2015 Автор Поделиться Опубликовано 24 октября, 2015 Да, это работает. Нашел случайно. Вопрос был как раз в том, что никак с документацией google не пересекается rustam_d 1 Цитата Ссылка на комментарий
0 rustam_d Опубликовано 24 октября, 2015 Поделиться Опубликовано 24 октября, 2015 (изменено) Браво Евгений! Однако для ИОС не судьба заменить титле...( Эх еще бы группой принять пуш в дроиде...тогда на 100% можно по пушам закрыть вопросы.. Вот пример группового пуш. Изменено 24 октября, 2015 пользователем rustam_d Rusland 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 4 апреля, 2017 Поделиться Опубликовано 4 апреля, 2017 (изменено) В 09.10.2015 в 06:21, krapotkin сказал: отвечу сам в оригинальном видео на испанском языке товарищ подчеркивает наличие в uses fmx.PushNotification.android А мне не помогло, в андроид проекте APushService все время NIL #include <System.PushNotification.hpp> private TPushService * APushService; TPushServiceConnection * AServiceConnection; #include <System.PushNotification.hpp> #if defined(__ANDROID__) #include <FMX.PushNotification.Android.hpp> #endif #if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__)) #include <FMX.PushNotification.IOS.hpp> #endif const String FAndroidServerKey = L"820629486434"; void __fastcall TForm1::Button1Click(TObject *Sender) { APushService = nullptr; AServiceConnection = nullptr; #if defined(__ANDROID__) APushService = TPushServiceManager::Instance->GetServiceByName(TPushService_TServiceNames_GCM); //NULL!!! APushService->AppProps[TPushService_TAppPropNames_GCMAppID] = FAndroidServerKey;//Error: segmentation fault 11 #endif } Изменено 4 апреля, 2017 пользователем Kitty Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 5 апреля, 2017 Поделиться Опубликовано 5 апреля, 2017 (изменено) Вот мой код из работающего проекта, может поможет разобраться interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Generics.Collections, System.JSON, FMX.TextLayout, System.IOUtils, FMX.Surfaces, System.Math, System.Net.URLClient, // SyncObjs, {$IFDEF ANDROID} FMX.Platform.Android, System.PushNotification, uVedroProcess, FMX.VirtualKeyboard, FMX.Platform, androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.Helpers, {$ENDIF ANDROID} UnitGetHttpThread, UnitSettingPage, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Advertising, FMX.Objects, UnitTypesAndFunction, FMX.Notification, FMX.Layouts, FMX.TabControl, FMX.ListView.Types, FMX.ListView, FGX.ApplicationEvents, FMX.Ani, FMX.ExtCtrls, FMX.ListBox, FMX.MultiView, FMX.Edit; ..... implementation {$IFDEF ANDROID} uses FMX.PushNotification.Android; Var APushService : TPushService; AServiceConnection : TPushServiceConnection; {$ENDIF ANDROID} {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin ........ PushServiceInit; ........ end; procedure TFormMain.PushServiceInit; begin // if Debug then // Exit; try APushService:=TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); APushService.AppProps[TPushService.TAppPropNames.GCMAppID]:='568*********'; 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]; finally NotificationCenter:=TNotificationCenter.Create(Self); NotificationCenter.OnReceiveLocalNotification:=NotificationCenterOnReceiveLocalNotification; end; end; procedure TFormMain.ServiceConnectionOnChange(Sender: TObject; AChange: TPushService.TChanges); begin FAppStage:='ServiceConnectionOnChange start'; if AChange=[TPushService.TChange.DeviceToken] Then GetHTTP(CommandActions, -1, ''); FAppStage:='ServiceConnectionOnChange stop'; end; procedure TFormMain.ServiceConnectionOnReceiveNotification(Sender: TObject; const ANotification: TPushServiceNotification); Var JSONValue : TJSONValue; begin if ANotification.Json.TryGetValue('message',JSONValue) Then if Not JSONValue.Value.IsEmpty then begin // GetHTTP(CommandActions, -1, ''); // Memo.Lines.Add(JSONValue.Value); // ShowMessage(JSONValue.Value); end end; procedure TFormMain.NotificationCenterOnReceiveLocalNotification(Sender: TObject; ANotification: TNotification); begin // ShowMessage(ANotification.AlertBody); end; Еще забыл объявление: type TFormMain = class(TForm) ......... private { Private declarations } ...... HDevicePushParams : TDevicePushParams; ....... Изменено 5 апреля, 2017 пользователем Евгений Корепов Kitty 1 Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 5 апреля, 2017 Поделиться Опубликовано 5 апреля, 2017 В GetHTTP отправляю токен и id на свой сервер procedure TFormMain.GetHTTP(ACommand : String; AIndex : Integer; AImageURL : String); Var FHTTPRec : THTTPRec; AFileName, APath : String; begin .... FHTTPRec.Query:=APIURL+'?cmd='+ACommand+'®ion='+Setting.RegionCode+ '&DeviceID='+HDevicePushParams.DeviceID+'&DeviceToken='+HDevicePushParams.DeviceToken; ....... FQueueRequest.PushItem(FHTTPRec); end; Kitty 1 Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 5 апреля, 2017 Модераторы Поделиться Опубликовано 5 апреля, 2017 На билдере проблема в том что GSMService не инициализируется, хотя реализация идёт Делфовая (сгенерированный пасник для плюсов) в чем причина так и не выяснил, настройка проекта полностью совпадает с аналогичным на делфи Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 5 апреля, 2017 Поделиться Опубликовано 5 апреля, 2017 У меня есть только две версии происходящего: 1. Это очередной баг эмбаркадеро. Как бороться неизвестно. 2. Этой строки APushService = TPushServiceManager::Instance->GetServiceByName(TPushService_TServiceNames_GCM); не достаточно для инициализации APushService и для билдера требуется какой то хитрый не документированы не где способ... что также говорит об уровне справочной системы... Цитата Ссылка на комментарий
0 Kitty Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 (изменено) Просьба проголосовать, может эмбакадеро предложит фикс: https://quality.embarcadero.com/browse/RSP-17714 Спасибо. Изменено 7 апреля, 2017 пользователем Равиль Зарипов (ZuBy) поправил ссылку, вела на мобильную версию Евгений Корепов 1 Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 2 часа назад, Kitty сказал: Просьба проголосовать, может эмбакадеро предложит фикс: https://quality.embarcadero.com/plugins/servlet/mobile#issue/RSP-17714 Спасибо. У них для дельфи issue месяцами игнорятся, для билдера наверное вообще никто не смотрит. Но проголосовал. Kitty 1 Цитата Ссылка на комментарий
Вопрос
krapotkin
2 дня пытаюсь продолбиться сквозь эти дебри ((
прошу помощи тех, кто уже прошел этот уровень...
Мне нужен способ послать сообщение одному конкретному клиенту.
Например, мобильный клиент шлет данные на мой сервер, через какое-то время сервер шлет клиенту push - ваши данные проверены, все ок...
Я использовал Parse Provider, т.к. не нашел другого способа получить DeviceToken от GCM
теперь уперся сюда, пример взят из инструкции:
https://developers.google.com/cloud-messaging/downstream
отправляю сообщение
https://gcm-http.googleapis.com/gcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ_мой_серверный_ключ
{ "data": {
"score": "5x1",
"time": "15:10"
},
"to" : "APA91..._мой_device_token"
}
сейчас приходит ответ
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
...
{"multicast_id":4890281057234742377,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
Кто такой SenderID ??? и где его указать ?? ((
p.s.
заголовок вроде верный, т.к. если что-то менять в Authorization, сразу ошибка 401 Unauthorized
если менять параметр "to", то ответ
400 Bad Request
INVALID_REGISTRATION
Ссылка на комментарий
30 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.