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

FPushService.DeviceTokenValue = nil Что делать?


Антон Емельянов

Вопрос

Приложение не даёт DeviceToken...  ,  (DeviceID есть)
FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];

Тест пример реализован по статье нашего замечательного модератора
http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html

Используется:
Компиляция SDK Android 5.1
Среда-разработки Delphi XE 10.2 

Пожалуйста запустите проект на своей версии Delphi..
Посмотрите будет  сгенерирован ТОКЕН или нет.. 
в случае удачи ,  напишите какая у вас версия Дельфи..

Исходник-проекта:  https://drive.google.com/open?id=1mCPvYYd0tXBALt-J_ymVuzChj_TtztC0
Только APK: https://drive.google.com/open?id=1x8q4RyVylpGOMjcQYjlvFxFBSQaYs7NL 


Помогите люди добрые :unsure:
За помощь и консультацию отблагодарю..
 

где токен.png

Изменено пользователем Антон Емельянов
Ссылка на комментарий
  • Ответы 52
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

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

  • 0

добавь для проверки эти строки

    memo1.Lines.Add('FDeviceID: '+FDeviceID);
    memo1.Lines.Add('FDeviceToken: '+FDeviceToken);

 

 

procedure TForm1.OnServiceConnectionChange(Sender: TObject;
  AChange: TPushService.TChanges);
begin
  if (TPushService.TChange.DeviceToken in AChange) and
    Assigned(FPushServiceConnection) then
  begin
    FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
    FDeviceToken := FPushService.DeviceTokenValue
      [TPushService.TDeviceTokenNames.DeviceToken];

    memo1.Lines.Add('FDeviceID: '+FDeviceID);
    memo1.Lines.Add('FDeviceToken: '+FDeviceToken);


    // тут отправляем в хранилище токенов (на сервер с БД например)
  end;
end;

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

Эм.. так и сделано. Я прикрепил скриншот к первому сообщению.. Там видно, что токен не выводится..
дублирую ссылкой скриншот:   http://fire-monkey.ru/uploads/monthly_2018_02/5a944cc210b64_.thumb.png.6486139139dc7ad8058be958daf0854a.png

Изменено пользователем Антон Емельянов
Ссылка на комментарий
  • 0
9 часов назад, Антон Емельянов сказал:

Эм.. так и сделано. Я прикрепил скриншот к первому сообщению.. Там видно, что токен не выводится..
дублирую ссылкой скриншот:   http://fire-monkey.ru/uploads/monthly_2018_02/5a944cc210b64_.thumb.png.6486139139dc7ad8058be958daf0854a.png

Эм...Я не вижу чтобы ты так сделал. При колбеке повторного получения у тебя ничего не происходит

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

Я добавил записи что ты просил.. Я не очень понял в какой момент вызывается OnServiceConnectionChange.. для Анроид приложения.
Вот полный код.. И по его исполнению.. выводится только первый блок в мемо1.  А до OnServiceConnectionChange не доходит..
Подправьте  пожалуйста код -- так как он должен быть в рабочем состоянии... Заранее благодарю!!!!!!!
 

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,System.PushNotification,
  FMX.PushNotification.Android,system.JSON;


type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    Memo1: TMemo;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
     FDeviceID: string;
     FDeviceToken: string;
     FPushService: TPushService;
     FPushServiceConnection: TPushServiceConnection;
  public
    { Public declarations }
     procedure OnReceiveNotificationEvent(Sender: TObject;
     const ANotification: TPushServiceNotification);
     procedure OnServiceConnectionChange(Sender: TObject;AChange: TPushService.TChanges);
     procedure PushServiceRegister;
  end;

  const
  FAndroidServerKey = '687234578278';

var
  Form1: TForm1;

implementation

{$R *.fmx}


procedure TForm1.FormShow(Sender: TObject);
begin
PushServiceRegister();

end;

procedure TForm1.OnReceiveNotificationEvent(Sender: TObject;
  const ANotification: TPushServiceNotification);
const
  FCMSignature = 'gcm.notification.body';
  GCMSignature = 'message';
  APNsSignature = 'alert';
var
  aText: string;
  aObj: TJSONValue;
begin
  // это событие срабатывает при открытом приложении
{$IFDEF ANDROID}
  aObj := ANotification.DataObject.GetValue(GCMSignature);
  if aObj <> nil then
    aText := aObj.Value
  else
    aText := ANotification.DataObject.GetValue(FCMSignature).Value;
{$ELSE}
  aObj := ANotification.DataObject.GetValue(APNsSignature);
  if aObj <> nil then
    aText := aObj.Value;
{$ENDIF}
  ShowMessage(aText);
end;

procedure TForm1.OnServiceConnectionChange(Sender: TObject;
  AChange: TPushService.TChanges);
begin
  if (TPushService.TChange.DeviceToken in AChange) and
    Assigned(FPushServiceConnection) then
  begin
    FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
    FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];

    memo1.Lines.Add('FDeviceID2: '+FDeviceID);
    memo1.Lines.Add('FDeviceToken2: '+FDeviceToken);


    // тут отправляем в хранилище токенов (на сервер с БД например)
  end;
end;

procedure TForm1.PushServiceRegister;
begin
  FPushService := nil;
  FPushServiceConnection := nil;

{$IF defined(ANDROID)}
  FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
  FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey;
{$ENDIF}
{$IF defined(IOS) AND defined(CPUARM)}
  FPushService := TPushServiceManager.Instance.GetServiceByName
   (TPushService.TServiceNames.APS);
{$ENDIF}
  if Assigned(FPushService) then
  begin
    FPushServiceConnection := TPushServiceConnection.Create(FPushService);
    FPushServiceConnection.OnChange := OnServiceConnectionChange;
    FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;
    FPushServiceConnection.Active := true;

    FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
    FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
    // тут отправляем в хранилище токенов (на сервер с БД например)
    memo1.Lines.Add('FDeviceID: '+FDeviceID);
    memo1.Lines.Add('FDeviceToken: '+FDeviceToken);
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  //ghj


end;

end.

 

Изменено пользователем Антон Емельянов
Ссылка на комментарий
  • 0

А нет. пардон.. процедура  OnServiceConnectionChange  выполняется..
но условие которое в ней, нет.. для теста . убрал условие..  теперь так выводится

 

procedure TForm1.OnServiceConnectionChange(Sender: TObject;
  AChange: TPushService.TChanges);
begin
  //if (TPushService.TChange.DeviceToken in AChange) and
  //  Assigned(FPushServiceConnection) then
  //begin
    FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
    FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];

    memo1.Lines.Add('FDeviceID2: '+FDeviceID);
    memo1.Lines.Add('FDeviceToken2: '+FDeviceToken);


    // тут отправляем в хранилище токенов (на сервер с БД например)
  //end;
end;

 

Screenshot_2018-02-27-11-19-12.png

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

в процедуре оставь просто такой код и поставь точку останова. Проверь приходит в нее вообще

procedure TForm1.OnServiceConnectionChange(Sender: TObject;
  AChange: TPushService.TChanges);
begin
    FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
end;

Ссылка на комментарий
  • 0
Только что, FREEFAR сказал:

в процедуре оставь просто такой код и поставь точку останова. Проверь приходит в нее вообще

procedure TForm1.OnServiceConnectionChange(Sender: TObject;
  AChange: TPushService.TChanges);
begin
    FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
end;

не актуально получается

Ссылка на комментарий
  • 0
6 минут назад, Антон Емельянов сказал:

Я пробовал на разных устройствах. результат одинаковый..
По-мо-ги-те

откуда FAndroidServerKey = '687234578278'; ???

имею ввиду сам ключ откуда. 

Изменено пользователем FREEFAR
Ссылка на комментарий
  • 0
Только что, FREEFAR сказал:

откуда FAndroidServerKey = '687234578278'; ???

Эм. Это из firebase... id отправителя..
или тут должен быть -длииииный id/вот что у меня есть

 

Clip2net_180227112714.png

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

пробовал менять ID на Ключ сервера.  Тоже не работает..
Я там приложил весь архив с проектом.. в теме.. 
там в все настройки .. можешь скачать - открыть, запустить?
может проблема с sdk или ещё что. или я чтото упускаю =(

Изменено пользователем Антон Емельянов
Ссылка на комментарий
  • 0
3 минуты назад, Антон Емельянов сказал:

Эм. Это из firebase... id отправителя..
или тут должен быть -длииииный id/вот что у меня есть

 

Clip2net_180227112714.png

Не пойму в проекте один ключ, на скрине другой..

4286... - этот введи 

Ссылка на комментарий
  • 0
6 минут назад, Антон Емельянов сказал:

Clip2net_180227115628.png

APIKey не тот вбит брат. Ходи в консоль гугловую

+ надеюсь проект test.dpr?

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

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

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

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

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

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

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

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

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


×
×
  • Создать...