• 0
krapotkin

Push сообщение для одного конкретного клиента

Вопросы

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 ответов на этот вопрос

  • 0

2 дня пытаюсь продолбиться сквозь эти дебри ((

прошу помощи тех, кто уже прошел этот уровень...

 

 

мда странный подход у вас крапоткин...обычно сначала пишут в поисковике PUSH

ну у меня все без посредников и дроид и иос

давай начнем с дроида я на форуме писал что манифест править обязон

правил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Отправка на 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 и т.п.

это для вашего клиента).

Изменено пользователем rustam_d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

а как без SSL шлешь на https ?

ето в 10-ке какая-то новинка ? где-то слышал, что там вроде indy щас https по-другому обрабатывает.

п.с. раньше без SSL не работало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

а как без SSL шлешь на https ?

ето в 10-ке какая-то новинка ? где-то слышал, что там вроде indy щас https по-другому обрабатывает.

п.с. раньше без SSL не работало

вопрос к делфи? зачем вы меня спрашиваете если работает...))

а в других случаях да использую...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

проблема не отправить пуш

проблема отправить пуш конкретному клиенту

vIn := TStringStream.Create(
      '{"registration_ids":["' + Edit1.Text 

в новом API рекомендуют вместо "registration_ids" использовать "to"

так вот что бы такое написать в Edit1.text ??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

проблема не отправить пуш

проблема отправить пуш конкретному клиенту

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-вешалка с идио..ми из мак") обращайся...

 

 

 

 

Изменено пользователем rustam_d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

с чем может быть связано ?

APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);

 

APushService == NIL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

отвечу сам

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

отвечу сам

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

да есть такое, уже привык что отсутствие модуля не значит, что не скомпилится...еще как ). Писал вон с ИОС аналог ситуация была...не добавил и привет...

а я ведь не зря юсесы показываю...не зря...

 

P.S. в VCL всегда старался убрать лишние модули, т.к. потенциальная потеря памяти...а тут...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

А в Delphi 10 надо добавить System.Notification, если указывать fmx.PushNotification.android или fmx.PushNotification.ios будет выдавать ошибку компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

в документации написано

{
  "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
  "notification" : {
    "body" : "This week’s edition is now available.",
    "title" : "NewsMagazine.com",
    "icon" : "new",
  },
}

и предполагается, что в уведомлении в шторке показывается заголовок из поля title и текст из body

у меня почему-то просто пустое уведомление висит

(режим программа неактивна, просто висит в памяти)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

в документации написано

{

  "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": "Текст сообщения"
    }
}
Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

да, это я тоже нашел методом тыка

вопрос как раз, что с документацией, либо я что-то недоглядел?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

да, это я тоже нашел методом тыка

я не понял из вашего текста, это работает то что написал Евгений?

...а то давно мечтал название программы заменить на титле...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да, это работает. Нашел случайно.

Вопрос был как раз в том, что никак с документацией google не пересекается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Браво Евгений! 

Однако для ИОС не судьба заменить титле...(

 

Эх еще бы группой принять пуш в дроиде...тогда на 100% можно по пушам закрыть вопросы..

Вот пример группового пуш.

 

d92d634f03b1.jpg

Изменено пользователем rustam_d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 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
}

 

Изменено пользователем Kitty

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вот мой код из работающего проекта, может поможет разобраться

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;
.......

 

Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В GetHTTP отправляю токен и id на свой сервер

procedure TFormMain.GetHTTP(ACommand : String; AIndex : Integer; AImageURL : String);
Var FHTTPRec : THTTPRec;
    AFileName, APath : String;
begin
....
    FHTTPRec.Query:=APIURL+'?cmd='+ACommand+'&region='+Setting.RegionCode+
      '&DeviceID='+HDevicePushParams.DeviceID+'&DeviceToken='+HDevicePushParams.DeviceToken;
.......
  FQueueRequest.PushItem(FHTTPRec);  
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

На билдере проблема в том что GSMService не инициализируется, хотя реализация идёт Делфовая (сгенерированный пасник для плюсов)

в чем причина так и не выяснил, настройка проекта полностью совпадает с аналогичным на делфи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

У меня есть только две версии происходящего:

1. Это очередной баг эмбаркадеро. Как бороться неизвестно.

2. Этой строки APushService = TPushServiceManager::Instance->GetServiceByName(TPushService_TServiceNames_GCM);

не достаточно для инициализации APushService и для билдера требуется какой то хитрый не документированы не где способ... что также говорит об уровне справочной системы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Просьба проголосовать, может эмбакадеро предложит фикс: https://quality.embarcadero.com/browse/RSP-17714

Спасибо.

Изменено пользователем Равиль Зарипов (ZuBy)
поправил ссылку, вела на мобильную версию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Kitty сказал:

Просьба проголосовать, может эмбакадеро предложит фикс: https://quality.embarcadero.com/plugins/servlet/mobile#issue/RSP-17714

Спасибо.

У них для дельфи issue месяцами игнорятся, для билдера наверное вообще никто не смотрит. Но проголосовал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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