Android 在cordova/ionic中创建本地通知以响应推送通知(来自firebase)
我正在使用Ionic框架构建一个应用程序,该应用程序实现了一个类似于老式facebook messenger的聊天功能,我想通知用户一条聊天信息,但如果他们在别处查看,我想从他们的主屏幕上删除通知 我使用firebase作为推送通知的后端(尽管我想这可能会改变) 我知道远程通知不能过期,但我被告知可以过期+删除本地通知,所以我的问题是-我是否可以可靠地接收远程通知、创建本地通知并显示该通知,然后响应范围为“过期”或“删除”的通知,删除本地通知,以便我的用户不会看到重复信息? 大多数插件倾向于检测应用程序的状态,并在主屏幕上添加一个远程通知,其中包含您默认推送的信息,有没有办法避免这种情况 谢谢各位 编辑: -本地通知:Android 在cordova/ionic中创建本地通知以响应推送通知(来自firebase),android,ios,cordova,ionic-framework,Android,Ios,Cordova,Ionic Framework,我正在使用Ionic框架构建一个应用程序,该应用程序实现了一个类似于老式facebook messenger的聊天功能,我想通知用户一条聊天信息,但如果他们在别处查看,我想从他们的主屏幕上删除通知 我使用firebase作为推送通知的后端(尽管我想这可能会改变) 我知道远程通知不能过期,但我被告知可以过期+删除本地通知,所以我的问题是-我是否可以可靠地接收远程通知、创建本地通知并显示该通知,然后响应范围为“过期”或“删除”的通知,删除本地通知,以便我的用户不会看到重复信息? 大多数插件倾向于检测
-Firebase云消息:cordova/ionic中通知的唯一棘手之处是JS部分接收通知并触发Android代码 我用过图书馆,它很简单 当在JS(Cordova/Ionic)中收到通知时,会有一个回调,使用它在Android中本地呈现通知
附言:巴塞尔的答案告诉你如何清除通知,所以我决定省去这一点。据我所知,没有插件可以满足你的所有需要。然而 我是否可以可靠地接收远程通知、创建本地通知并显示该通知,然后响应范围为“过期”或“删除”的通知,删除本地通知,以便我的用户不会看到重复的信息 大多数插件倾向于检测应用程序的状态,并在主屏幕上添加一个远程通知,其中包含您默认推送的信息,有没有办法避免这种情况 是的,通过自己使用和构建本地通知 对于我正在从事的一个项目,我修改了插件
cordova plugin fcm
,添加了对(本地点播)通知的支持,包括关闭/显示、向cordova应用程序发送多个通知以及一些尚未包含的PRs。此外,我自己构建通知,以完全控制显示的内容。您可以查看代码以获得一些想法
简言之,其工作原理如下:
首先,我向应用程序发送一个“无声”推送,Android不会显示:
{
"content_available": true, // IMPORTANT: For Apple -> content-available: 1, for firebase -> content_available: true
"priority": "high",
"to": "/topics/all", // or to a fcm token
"data"{
"title": "My title", // this implies that you display the notification by yourself
"body": "My body", // this implies that you display the notification by yourself
"type": "NEW_USER_MESSAGE", // only relevant to this project
"userId": "1", // only relevant to this project
"timestamp", "150000000"
}
}
注意:如果有效负载有“通知”:{}
项,Android将在系统托盘上显示它(如果应用程序在后台)。
其次,当推送到达应用程序时(在中),我构建本地通知,为其分配一个标记和一个ID。这是您以后可以用来取消它的方式。
例如,您可以创建带有标记“NEW_USER_MESSAGE”和ID 1(一个指示消息状态的常量,例如用户ID)的本地通知。此外,这也是自动替换通知的另一种方式(例如,如果您发送一条通用消息,如“New update available”)
这样做的一个优点是,您可以完全控制要显示的通知,因此您可以根据需要对其进行样式化
如果要丢弃过期邮件,可以:
第三,当用户单击通知时,Android将启动您的应用程序,插件将推送消息的有效负载发送到cordova视图(onNotificationReceived()
)
打开应用程序并收到推送消息后,您可以通过向插件添加新操作来关闭推送消息:
onNotificationReceived(data){
if (data.wasTapped === true){
if (data.type === 'NEW_USER_MESSAGE'){
FCMPlugin.dismissNotification(NEW_USER_MESSAGE, 1);
}
}
}
Android操作系统:
else if (action.equals( ACTION_DISMISS_NOTIFICATION )) {
cordova.getThreadPool().execute(new Runnable() {
public void run() {
try{
Log.d(TAG, "FCMPlugin dismissNotificaton: " + args.getString(0)); //tag
NotificationManager nManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.cancel(args.getString(0)/*NEW_USER_MESSAGE*/, args.getInt(1) /*1*/);
Log.d(TAG, "FCMPlugin dismissNotificaton() to remove: " + id); //tag
callbackContext.success();
}catch(Exception e){
callbackContext.error(e.getMessage());
}
}
});
以及cordova应用程序公开的方法:
// dismisses a notification by tag+id
FCMPlugin.prototype.dismissNotification = function( tag, userId, success, error ){
exec(success, error, "FCMPlugin", 'dismissNotification', [tag, userId]);
}
如何将远程通知转换为本地通知?您的回答似乎非常完整,但据我所知,它使您无法在应用程序不运行的情况下接收通知,对吗?只是为了确认一下。非常感谢。
else if (action.equals( ACTION_DISMISS_NOTIFICATION )) {
cordova.getThreadPool().execute(new Runnable() {
public void run() {
try{
Log.d(TAG, "FCMPlugin dismissNotificaton: " + args.getString(0)); //tag
NotificationManager nManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.cancel(args.getString(0)/*NEW_USER_MESSAGE*/, args.getInt(1) /*1*/);
Log.d(TAG, "FCMPlugin dismissNotificaton() to remove: " + id); //tag
callbackContext.success();
}catch(Exception e){
callbackContext.error(e.getMessage());
}
}
});
// dismisses a notification by tag+id
FCMPlugin.prototype.dismissNotification = function( tag, userId, success, error ){
exec(success, error, "FCMPlugin", 'dismissNotification', [tag, userId]);
}