• 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

Сделал новый проект . в  нем создал новое приложение.
в программе прописал новый  id..
результат тотже покачто.

com.embarcadero.test.png

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


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

+ в проекте на FBase добавил ид приложения?

в проекте есть?

image.png.ec31e7e9a7fcb857cc18e693d5334da2.png

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

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


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

Receive push есть..
А по первому уточните..это где смотреть   "+ в проекте на FBase добавил ид приложения?"

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, Антон Емельянов сказал:

типо  "com.embarcadero.test" ?

Clip2net_180227115452.png

да, а как написано в настрйках проекта в ембе?

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


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

да, а как написано в настрйках проекта в ембе?

это где? Уточни пожалуйста

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


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

 еще обрати внимание на apiKey это из гугл консоли. там включаешь API GoogleCloudMessage

image.png.ca647a5a968b693ea0812a95dfd7d364.png

 

 

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

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


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

Clip2net_180227115628.png

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти


  • Похожий контент

    • От AliZairov
      Привет. Я сделал новую версию YouTubeApi компоненты. Поддерживаемые VCL & FMX + Mobile.
      Никаких официальных YouTube Api компоненты. Только данные с парсинг. Пример доступен в архиве.
       
      Новый
      ===
      v1.4 - 25/02/2018
        + Устранение проблем
      YouTubeApiDelphi
    • От gresaggr
      Добрый день.
      Как под FMX в ListView сделать подчеркивание Detail в рантайме?
      Пытался делать так:
      LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
      но не срабатывает.
      P.S. Возможно это применить не ко всем строкам, а только к некоторым?
    • От Виталий Иванов
      Ошибка при запуске программы на отладку:
       
      "
      Can't open socket: Permission denied 
      Exiting
      .
      "
       
      кто знает как побороть ? 
       
      Отладку запускаю на OnePlus3 с Android 8.0.0, драйвера Google USB переустанавливал. 

    • От dim
      Есть код который работает при смещении карты и получив координаты центра пытаюсь получить адрес по ним.
      procedure TMasterDetailForm.MapView3CameraChanged(Sender: TObject); var myCoordinat: TLocationCoord2D; begin inherited; myCoordinat.Create(MapView3.Location.Latitude,MapView3.Location.longitude); if (int(myCoordinat.Latitude)<>0) then begin //проверяю, что координаты определены if not Assigned(fGeocoder) then begin if Assigned(fGeocoder.Current) then fGeocoder := TGeocoder.Current.Create; if Assigned(fGeocoder) then fGeocoder.OnGeocodeReverse := OnGeocodeReverseEventStart; end; if Assigned(fGeocoder) and not fGeocoder.Geocoding then fGeocoder.GeocodeReverse(myCoordinat); end end; все работало до очередного обновления, а сейчас ругается "java.io.IOException: Service not Available" на fGeocoder.GeocodeReverse(myCoordinat);
      подскажите куда копать
    • От striker
      Всем привет!
      Нужен совет.
      Есть Grid, в нем расписание дня.
      В БД каждая строка это отдельная запись.
      Нужно как-то визуально сделать подобие объединения ячеек в Excel.
      Т.е. нужно занять расписание на 2 часа.
      При этом функционал по событиям для строки "второго часа" должен быть недоступен.
      Может хотя бы границу стирать, т.е. оставлять значение в верхней ячейки, а нижнюю просто не отображать.
      Как это лучше сделать?
      FMX, Windows, Delphi XE6, MySQL
       

    • От x11
      Нет ли у FMX готовой функции для открытия веб-ссылок из приложения?
      А то приходится городить огород с лисапетами и кучей IFDEF.
      В итоге что у меня получилось.
      Для удобства разнес все по разным модулям.
      Модуль для Windiws
      unit uUtilsWindows; interface {$IFDEF MSWINDOWS} uses ShellApi, Variants, Windows, FMX.Types, FMX.Platform.Win; procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle); {$ENDIF} implementation {$IFDEF MSWINDOWS} procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle); begin ShellExecute(FmxHandleToHWND(WindowHandle), 'open', PChar(VarToStr(sURL)), nil, nil, SW_NORMAL); end; {$ENDIF} end.  
      Модуль для Android
      unit uUtilsAndroid; interface {$IFDEF ANDROID} uses FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, AndroidApi.Helpers; procedure AndroidOpenUrl(const sUrl: string); {$ENDIF} implementation {$IFDEF ANDROID} procedure AndroidOpenUrl(const sUrl: string); Var Uri: Jnet_Uri; OpenLinkIntent: JIntent; begin Uri := StrToJURI(sUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);// будем что-то смотреть OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE);// смотреть в браузере OpenLinkIntent.setData(Uri);// смотреть эту ссылку SharedActivity.startActivity(OpenLinkIntent);// открываем end; {$ENDIF} end.  
      теперь в основной форме:
      uses ..., ...{$IFDEF ANDROID}, vkbdhelper, uUtilsAndroid{$ENDIF} {$IFDEF MSWINDOWS}, uUtilsWindows {$ENDIF}; ... ... ... procedure TfmEditObject.actOpenUrlExecute(Sender: TObject); begin {$IFDEF ANDROID}AndroidOpenUrl(edMapsCoordUrl.Text);{$ENDIF} {$IFDEF MSWINDOWS}WindowsOpenUrl(edMapsCoordUrl.Text, Self.Handle);{$ENDIF} end;  
      А если добавлять ещё одну платформу, то ещё один модуль понадобится.
      Может есть более правильный вариант, так сказать, дизайна исходного кода?
       
    • От SerhioUser
      Добрый день.
      Как в FMX при перерисовке объекта включить/отключить привязку к вертикальной синхронизации (v-sync) развертки экрана? Есть ли такая возможность в FMX? (В OpenGL и DirectX - есть)
      Например если делаем видео-плеер, то чтобы не было артефактов синхронизация нужна, а если хотим узнать реальный fps - синхронизацию выключаем.
    • От Макс Войтенко
      var Keyboard: IFMXVirtualKeyboardService; begin if TPlatformServices.Current.SupportsPlatformService( IFMXVirtualKeyboardService, IInterface( Keyboard ) ) then if TVirtualKeyboardState.Visible in Keyboard.GetVirtualKeyBoardState then ShowMessage( 'клавиатура открыта' ) else ShowMessage( 'клавиатура скрыта' ); end; ТАК Я на шел для делфи. Но мне нужно для C++
    • От Роман Фил
      Привет Всем уважаемые! 
      Пытаюсь сделать растягивание по содержимому компонента. Как это реализовано в мессенджерах типа WhatsApp если большой текст то растягивает (выделяется) по содержимому большое поле, если короткий то малое. 
        Text2.Text := Memo1.Lines.Strings[4];   text2.Height := canvas.TextHeight(Text2.Text); //по высоте строки меняется т.к. там и есть одна строка в TText просто переносится WordWrap визуально.   text2.Height:=canvas.TextWidth(text2.Text); //  - так чушь  Как это вообще реализовано кто нибудь сталкивался?

    • От Роман Фил
      Привет ребят! Помогите кто знает, попытаюсь доходчиво объяснить - 
      имеется набор компонентов KernowSoftwareFMX - в нем использую TksTableView для вывода данных с Tmemo, в нем так же есть Image.
      В Tmemo с сервера грузится файл txt внутри которого строки с ссылками на изображения вида http://бла-бла/1.png
      Для загрузки использую FMX.Features.Bitmap.Helpers.pas - позволяет по прямой ссылке загружать изображение в TImage.
      что пытаюсь сделать?
      Нужно наполнять список TksTableView с Memo содержащий ссылки и в строках TksTableView - они же ListItem тоже самое что в ListView  и загружать в image каждой строки картинки по ссылкам memo.
       
      AItem.Image.Bitmap := Image4.MultiResBitmap.Bitmaps[1].LoadFromUrl(Memo1.Lines.Strings[i]); - так ругается [DCC Error] untMain.pas(92): E2010 Incompatible types: 'TBitmap' and 'procedure, untyped pointer or untyped parameter' AItem.Image.Bitmap := Image4.Bitmap.LoadFromUrl(Memo1.Lines.Strings[i]); - так тожн не работает Глюк в том что первым делом создаются строки . а потом грузятся по очереди картинки в Image4.
      Как заставить подгружать картинки в  TksTableView?
      Как ожидать хавершения загрузки каждой картинки в Image4 и после создавать AItem.Image.Bitmap?
       
       
       
  • Последние посетители   0 пользователей онлайн

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