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

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


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

 

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

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

  • 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

отвечу сам

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

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

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

 

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

Ссылка на комментарий
  • 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

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

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

 

Эх еще бы группой принять пуш в дроиде...тогда на 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 месяцами игнорятся, для билдера наверное вообще никто не смотрит. Но проголосовал.

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

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

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

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

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

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

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

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

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

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

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