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

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


dmokrushin123

Вопрос

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

  • 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, отправляем в хранилище
Ссылка на комментарий

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

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

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

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

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

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

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

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

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