Открыть специальную страницу с помощью 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);