Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在cordova/ionic中创建本地通知以响应推送通知(来自firebase)_Android_Ios_Cordova_Ionic Framework - Fatal编程技术网

Android 在cordova/ionic中创建本地通知以响应推送通知(来自firebase)

Android 在cordova/ionic中创建本地通知以响应推送通知(来自firebase),android,ios,cordova,ionic-framework,Android,Ios,Cordova,Ionic Framework,我正在使用Ionic框架构建一个应用程序,该应用程序实现了一个类似于老式facebook messenger的聊天功能,我想通知用户一条聊天信息,但如果他们在别处查看,我想从他们的主屏幕上删除通知 我使用firebase作为推送通知的后端(尽管我想这可能会改变) 我知道远程通知不能过期,但我被告知可以过期+删除本地通知,所以我的问题是-我是否可以可靠地接收远程通知、创建本地通知并显示该通知,然后响应范围为“过期”或“删除”的通知,删除本地通知,以便我的用户不会看到重复信息? 大多数插件倾向于检测

我正在使用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]);
}