Открыть специальную страницу с помощью firebase api

Я отправляю push-уведомление на устройства, использующие код ниже.

      var nTitle = "New message from " + $rootScope.clients_firstName;
      var to = "DeviceToken is here";
      var notification = {
        'title': nTitle,
        //'body': 'Click here to more details...',
        'icon': 'firebase-logo.png',
        'click_action': 'openapp'
      };

      var key = 'your key';
      fetch('https://fcm.googleapis.com/fcm/send', {
      'method': 'POST',
        'headers': {
        'Authorization': 'key=' + key,
        'Content-Type': 'application/json'
      },
      'body': JSON.stringify({
        'notification': data,
        'to': to
      })
      }).then(function(response) {
        //console.log("res ", response);
      }).catch(function(error) {
        console.error("err ", error);
     });

push уведомления отправляет на устройство успешно.

Но когда я нажимаю на уведомление, определенная страница должна быть открыта.

Например 'click_action' : 'openapp/somepage'

Затем "некоторая страница" должна быть открыта, когда я нажимаю pushnotification.

AndroidManifest.xml

<activity android:name="MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">

        <intent-filter>
            <action android:name="openapp" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>

</activity>

Моя структура проекта

--platforms
--plugins
--www
  --app
    --about
      --about.html
      --about.ctrl.js
    --product
      --product.html
      --product.ctrl.js
  --css
  --js
  --lib
  index.html

Если я нажимаю на уведомление, и я хочу открыть продукт или страницу, то что мне делать?

Что здесь не так? Скажите, пожалуйста, правильное решение.

Ответ 1

Я знаю, что вы спрашиваете об Ионном 1. Но я знаю только для Иона 2. Надеюсь, это поможет вам.

Я думаю, вы должны добавить информацию о том, какую страницу вам нужно открыть в разделе дополнительных данных вашего уведомления. Что-то вроде этого:

'body': JSON.stringify({
        'notification': data,
        'to': to,
        'data' : {
           'action' : 'Needed page'
        }
      })

И тогда вы должны поймать его на методе подписки. Что-то вроде этого:

fcm.onNotification().subscribe(data=>{
  console.log("data", data);
  if (data['action'] && data['action'] == 'Needed page'){
    this.navCtrl.push('Needed page'); //Use Navigation controller to open needed page
  }
})

Для плагина FCM родной кордовой:

FCMPlugin.onNotification(function(data){
    console.log("data", data);
    if (data['action'] && data['action'] == 'Needed page'){
      this.navCtrl.push('Needed page'); //Use Navigation controller to open needed page
    }
});

Ответ 2

Если вы используете Ionic Push Plugin, вы можете получить с помощью

$scope.$on('cloud:push:notification', function(event, data) {
        var msg = data.message;
        var appState = msg.app;
        var appAsleep = appState.asleep;
        var appClosed = appState.closed;


        if (appAsleep || appClosed) {               
            $state.go("your state");
        } else {
           //if app is open while receiving push
        }

    });

Ответ 3

Чтобы уведомления были доступны для просмотра, когда ваше приложение находится в фоновом режиме, вам нужен атрибут click_action в вашей полезной нагрузке.

Пожалуйста, проверьте этот раздел в документах Firebase.

Также, когда вы определяете атрибут click_action, вам также понадобится соответствующий атрибут <action> в <intent-filter> для действия, которое вы хотите запустить.

Этот видео объясняет это довольно подробно.

Однако, обратите внимание, что вы не можете установить атрибут click__action, если вы отправляете уведомления из Firebase Console. Это можно сделать только в том случае, если вы отправляете уведомление с вашего собственного сервера администратора или с помощью облачных функций Firebase.

Наконец, в запущенной деятельности вы можете установить дополнительный Data с помощью атрибута data (также показано в том же документе, который я связал выше). И когда вы запускаете свое приложение, нажав на уведомление, вы можете получить данные уведомления с помощью getIntent(). Ознакомьтесь с этим ответом для получения более подробной информации о том, как это сделать.

Изменить после обновления вопроса: -

Вместо того, чтобы помещать этот <intent-filter> в MainActivity, поместите фильтр в тег <activity> активности, которую вы хотите открыть, когда нажимается уведомление. Примером может служить следующее: -

<activity android:name="ProductDetailsActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">

    <intent-filter>
        <action android:name="openapp" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>

Теперь, когда ваше заданное действие открывается, вы можете получить информацию из части уведомления Data с помощью getIntent().

Например, если ваша полезная нагрузка для уведомлений имеет следующую структуру,

payload = {
  notification: {
    title: `You ordered a new product`,
    click_action : 'HANDLE_NOTIFICATION',

  },
  data : {
        product_id : 'ABC98292',
        type : `Clothes`,
        product_name : 'Cotton spring shirt'
    }
};

Затем вы можете получить product_id из уведомления с помощью getIntent().getStringsExtra("product_id") и т.д.

Таким образом, вы откроете требуемую активность и можете заполнить ее соответствующими данными, полученными из вашего уведомления, без использования каких-либо дополнительных фреймворков.

Ответ 4

Передайте свой url в полезной нагрузке push и используйте следующий код, чтобы открыть конкретный экран, на который ссылается этот URL:

$rootScope.$on("$cordovaLocalNotification:click", function(notification, state) {
    var data = JSON.parse(state.data);
    window.location.href = data.url;
});

Ответ 5

Ты спросил меня здесь. Если вы используете мое решение и вручную создаете уведомления в методе onReceive(Context context, Intent intent), вы должны поставить ожидающее намерение на конструктор уведомлений.

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
//init builder with icon, text, any other params

Intent activityIntent = new Intent(context, Activity.class);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); //it is needed if you creating an activity from not activity context
PendingIntent pendingIntent = PendingIntent.getActivity(context, REQUEST_CODE, activityIntent, PendingIntent.FLAG_CANCEL_CURRENT);
builder.setContentIntent(pendingIntent);

Notification notification = builder.build();
notification.defaults |= Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS;
NotificationManagerCompat.from(context).notify(notificationId, notification);