• 0
dmokrushin123

ANDROID не приходят PUSH Уведомления

Вопросы

На устройство с IOS сообщения приходят и через Kinvey и через FCM (Firebase Cloud Messaging).

На Android возвращается Token, сами уведомления НЕ приходят. 

 

 

 

 

 

 

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


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

12 ответов на этот вопрос

  • 0
<%services%>

>>>>>>>>>>>>>>>  Взял из документации  FireBase.  

<service
                android:name=".MyFirebaseMessagingService">
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
                </intent-filter>
            </service>

            <service
                android:name=".MyFirebaseInstanceIDService">
                <intent-filter>
                    <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
                </intent-filter>
            </service>

<<<<<<<<<<<<<<<<<<

<%services%>

 

 

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


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

Вообще в файле GCM, а нужно FCM. 

Согласно документу миграции часть опций удалена, часть модифицирована.  

При настройке проекта предлагается сохранить файл в формате JSON который в принципе непонятно как прикруть к Delphi.

Попробую записать и GCM из файла, посмотрим что получиться

 

 

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


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

это для андроид студии и/или xcode.

У меня также настроен на CGM но присылают пуши через FCM (на пхп написан бэкэнд, который отправляет через FCM)

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


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

Бэкэнд это вторично, у меня не приходят сообщения в принципе когда из консоли FCM отправляю.  

Попробовал ваш манифест, результат отрицательный.

 

 

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


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

Изначально ...

Создал сертификат (возможно тут и проблема), добавил в Provision проекта в Delphi.

Создал проект в FCM, создал приложение в проекте для Android, в настройках добавил FINGERPRINT SHA1 и SHA256 полученные на предыдущем этапе.

 

Код везде одинаковый, ну например как у вас...

var
  ADeviceID, AdeviceToken: String;
begin
  APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
  APushService.AppProps[TPushService.TAppPropNames.GCMAppID] := '650136475054';  // SENDER ID
  AServiceConnection := TPushServiceConnection.Create(APushService);

  AServiceConnection.Active := True;

  AServiceConnection.OnChange := OnServiceConnectionChange;
  AServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;

ADeviceID := APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
ADeviceToken := APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];

!!!  Токен получаю      APA91bHh..............

 

Захожу в консоль FCM и отправляю сообщение, на токен или на приложение.

!!! OnReceiveNotificationEvent не срабатывает (пробовал на пару телефонах)

 

 

 

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


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

Такс, начнём с этого:

  • Project
    • Options
      • Entitlement List
        • Recieve Push Notification = true
      • Version Info
        • apiKey = server_key (из консоли)

uses секция

Спойлер

System.PushNotification
{$IFDEF ANDROID} , FMX.PushNotification.Android{$ENDIF}
{$IFDEF IOS} , FMX.PushNotification.IOS{$ENDIF}

 

в private секции формы пишем

Спойлер

diDeviceID, diDeviceToken: string;
APushService: TPushService;
AServiceConnection: TPushServiceConnection;

 

процедура для получения и отправки токенов на сервер

Спойлер

procedure TfrmMain.RegisterPushService;
begin
  if (TOSVersion.Platform = pfAndroid) or (TOSVersion.Platform = pfiOS) then
  begin
    APushService := nil;

    // Получение и отправка токена устройства
{$IFDEF ANDROID}
    // Для Android
    APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
    APushService.AppProps[TPushService.TAppPropNames.GCMAppID] := '........';
{$ENDIF}
{$IF DEFINED(IOS) AND DEFINED(CPUARM)} // только на живом теле, симулятор исключаем
    // Для iOS
    APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.APS);
{$ENDIF}
    if Assigned(APushService) then
    begin
      // Создаём подключение к серверу
      AServiceConnection := TPushServiceConnection.Create(APushService);
      // Активируем подключение
      AServiceConnection.Active := true;
      // Подключаем делегаты
      AServiceConnection.OnChange := OnServiceConnectionChange;
      AServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;

      diDeviceID := APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
      diDeviceToken := APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];

      // отправляю на сервер, сохраняю в БД
    end;
  end;
end;

 

событие OnServiceConnectionChange

Спойлер

procedure TfrmMain.OnServiceConnectionChange(Sender: TObject; AChange: TPushService.TChanges);
begin
  diDeviceID := APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
  diDeviceToken := APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
  // отправляю на сервер, сохраняю в БД
end;

 

событие OnReceiveNotificationEvent

Спойлер

procedure TfrmMain.OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification);
var
  FTitle, FText: string;
  xJS: ISuperObject;
begin
  xJS := SO(ANotification.Json.ToString);

  FTitle := xJS.s['title'];
  FText := xJS.s['message'];
  if (FTitle.IsEmpty) or (FText.IsEmpty) then
    exit;
  ShowNotification(FTitle, FText);
end;

 

AndroidManifest.template.xml

Спойлер

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="%package%"
        android:versionCode="%versionCode%"
        android:versionName="%versionName%"
        android:installLocation="%installLocation%">

    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%>
	<permission android:name="%package%.permission.C2D_MESSAGE"
		android:protectionLevel="signature" />
	<uses-permission
		android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="%package%.permission.C2D_MESSAGE" />

    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    <application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%">

<%application-meta-data%>
		<%services%>
        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                android:value="%libNameValue%" />
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> 
        </activity>
		<receiver
			android:name="com.embarcadero.gcm.notifications.GCMNotification" android:exported="true"
			android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
				<action android:name="com.google.android.c2dm.intent.RECEIVE" />
				<category android:name="%package%" />
            </intent-filter>
		</receiver>
		<service android:name="com.embarcadero.gcm.notifications.GCMIntentService" />		
        <%activity%>
        <%receivers%>
    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

 

Ваша реализация может отличаться, т.к. у меня работа с FCM выполнена на PHP

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


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

В Вашем сообщении для меня ничего нового потому как смотрел ваш код и то что нашел в интернете прежде чем написал вопрос.  Вопрос был задан про приход сообщения на клиента с Android, а не его отправка. На Android событие просто не вызывается.

OnReceiveNotificationEvent

 Напомню на IOS все прекрасно работает, так что что дело не в коде, а в каких то настройках для Android. 

 

 

 

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


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

Ну в общем как то заработало.  Сообщения доставляются только на токен для Android хотя в интерфейсе FCM есть общевещательная отправка на приложение (для IOS это работает).

OnReceiveNotificationEvent  изменил

FText := x['"gcm.notification.body"'].AsString

FTitle := x['"gcm.notification.title"'].AsString;

..................................

Есть пара вопросов:

1. Как понять что токен устройства сменился, как то не очень хотелось бы сложно решать этот вопрос

2. В версии IOS 10 убрали возможность группировки уведомлений по приложению, в итоге происходит загромождение.   В NotificationCenter есть СancelAll но что то ничего не происходит, как было несколько уведомлений так и остается

 

 

 

 

 

 

 

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


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

на счёт токенов

  • организовать хранилище токенов (БД например)
  • при запуске приложения получаем токен и отправляем в хранилище
  • получаем изменившийся токен в событии OnServiceConnectionChange, отправляем в хранилище

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


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

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

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

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

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

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

Войти

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

Войти

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

    • От Tarik Live
      Здравствуйте! Уже почти неделю пытаюсь завести библиотеку org.eclipse.paho.client.mqttv3-1.2.0 в своём приложении. Я знаю о существовании компонента от TMS, но он не умеет работать в фоновом сервисе.
      Вот код который я использую для тестов:
       
      Стандартная библиотека org.eclipse.paho.client.mqttv3-1.2.0 выпадает в ошибку initializer error сразу на строчке 
      mqtt:=TJMqttClient.JavaClass.init(StringToJString('tcp://m23.cloudmqtt.com:11021'), StringToJString('java')); по логам с телефона стало понятно, что проблема в логах 😐 а конкретно когда библиотека пытается создать логгер выпадает ошибка что не найден файл локализации ru_RU для logcat (сами файлы там вроде как есть). Ладно. Скачал исходники почистил код библиотеки от упоминаний логгера, собрал ииии и ничего. Продвинулся до строчки 
      mqtt.connect(); также пробивал 
      mqtt.connect(mqttconopt); ничего не помагает, получаю ошибку сегментации класса 
      Пока не понятно куда копать дальше? Возможно что не все библиотеки можно использовать в delphi приложениях? 

      P.S Старая версия 1.1.1 тоже не завелась :(
      service test2.rar
    • От FREEFAR
      Всем доброго времени суток. 
      Казалось бы. Во время разработки и перед тем как подписали приложение сертификатом Distribution, пуши приходили норм. Но после того как прошли аудит Apple пуши куда-то пропали. FCM возвращал ошибку InvalidRegistration.
      Оказалось все достаточно просто. На сервере с которого мы отправляем пуш, В php скрипте, который отправляет пуши надо выставить
      sandbox = false
      Ура! Всем удачи)
    • От Юрий Гусач
      Доброго дня!
      Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?
       
       
    • От Андрей Лещинский
      Здравствуйте ребята. С Firemonkey знаком только два дня. Многое уже подчеркнул с данного форума. Спасибо вам. 
      Проблема заключается в том, что у меня sdk для андроид 7 версии. Я собираю apk файл, запускаю его на Андроид 7 и все отлично, но как только я устанавливаю приложение на Андроид например версии 5, то при запуске оно мерцает пару раз и потом отображается отлично. Не подскажите в чем проблема? Я пробовал проект с данного форума, чтобы форма уходила под статусбара. Вот все они и мерцают на Андроид ниже 7, другие не пробовал проекты
      Стаж у меня только 2 дня, скажите в какую сторону смотреть мне далее
    • От gutalin79
      Почему при добавлении MapView в пример Android Service, приложение перестает работать?
      AndroidSimpleService.zip
       
       
       
      Пример делал по этому видео: 
       
    • От Astghik
      Hello !!!
      I want onButtonClick create popup. I use TPopup component. All good, but on android "Back button" click closing forma. But I want close popup (when popup is shown).

       
      //---------------------------------------------------------------------------------
      void __fastcall  btn3PointsClick(TObject *Sender)
      {
          PopUpSettings->IsOpen = true;
          PopUpSettings->PlacementTarget = btn3Points;
          PopUpSettings->BringToFront();
      }
      //-------------------------------------------------------------------------------------
      void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose)
      {
          try {
              if (PopUpSettings->IsOpen == true) {
                  CanClose = false;
              }
              else {
                  CanClose = true;
              }
          } __finally {
              PopUpSettings->IsOpen = false;
          }
      }
      //-------------------------------------------------------------------
       
    • От Savage
      Здравствуйте!
      Второй день не получается поменять стандартный звук в push-уведомлении на свой.
      Сделал все по мануалу Гугла,  https://developers.google.com/cloud-messaging/http-server-ref
      Добавил звуковые файлы в проект в нужное место (/res/raw/ )
      Пуши летают, но звук стандартный. Такое впечатлеие, что com.embarcadero.gcm.notifications.GCMIntentService  просто игнорирует параметр sound
      Посмотрел при помощи LogCat
      В конечном итоге, в NotificationService прилетает уже дефолтный звук.
      04-05 23:03:34.172 V/NotificationService(1143): enqueueNotificationInternal: pkg=com.savage.pushtest id=4 notification=Notification(pri=0 contentView=null vibrate=null sound=content://settings/system/notification_sound defaults=0x0 flags=0x0 color=0x00000000 vis=PRIVATE)
      Неужели копать только в сторону правок com.embarcadero.gcm.notifications.GCMIntentService?
      Может есть готовое решение?
    • От Rokweb
      Таймер с интервалом 1мс заметно подтормаживает во время выполнения анимации TFloatAnimation в Tokyo. У всех так или только у меня?
    • От Rokweb
      Здравствуйте.
      Речь пойдёт об Android.
      Использовал в Berlin данный unit для проигрывания звуков (TMediaPlayer не подходит) и все отлично работало. Сейчас перешел на Tokyo и происходит зависание в цикле:
       
      while not GLoaded do begin Sleep(10); Application.ProcessMessages; end;  
      Модуль прикрепил в сообщении.
       
      Так же интересует - возможно ли, использовать стиль, созданный в процессе разработки Android приложения - в iOS и если да - то как это правильно реализовать (почти каждый контрол имеет сейчас свой стиль)?
       
      Прошу помощи.
      GameAudioManager.zip
  • Последние посетители   0 пользователей онлайн

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