android– 当应用程序在后台时,Cordova本地通知不起作用

android– 当应用程序在后台时,Cordova本地通知不起作用,第1张

概述我正在使用Cordova开发一个Android应用程序,它使用PushPlugin从我的服务器接收推送通知.特别是,我正在使用PushPluginExample进行一些测试.我也在使用CordovaLocalNotificationplugin,因为我希望应用程序在收到推送通知后立即显示本地通知.以下代码有效,并且仅在应用程序位

我正在使用Cordova开发一个Android应用程序,它使用PushPlugin从我的服务器接收推送通知.

特别是,我正在使用PushPlugin Example进行一些测试.

我也在使用Cordova Local Notification plugin,因为我希望应用程序在收到推送通知后立即显示本地通知.

以下代码有效,并且仅在应用程序位于前台时显示本地通知.

即使应用程序在后台,我也希望显示本地通知.
可能吗?我怎样才能使它工作?

提前致谢

<!DOCTYPE HTML><HTML>    <head>        <Title>com.PhoneGap.c2dm</Title>    </head>    <body>    <script type="text/JavaScript" charset="utf-8" src="cordova.Js"></script>    <script type="text/JavaScript" charset="utf-8" src="jquery_1.5.2.min.Js"></script>    <script type="text/JavaScript" src="PushNotification.Js"></script>    <script type="text/JavaScript">        var pushNotification;        function onDeviceReady() {            $("#app-status-ul").append('<li>deviceready event received</li>');                    document.addEventListener("backbutton", function(e){                $("#app-status-ul").append('<li>backbutton event received</li>');                    if( $("#home").length > 0){                            // call this to get a new token each time. don't call it to reuse existing token.                            //pushNotification.unregister(successHandler, errorHandler);                            e.preventDefault();                            navigator.app.exitApp();                        }                        else{                            navigator.app.backHistory();                        }                    }, false);                    try{                     pushNotification = window.plugins.pushNotification;                        $("#app-status-ul").append('<li>registering ' + device.platform + '</li>');                        if (device.platform == 'androID' || device.platform == 'AndroID' || device.platform == 'amazon-fireos' ){                                 pushNotification.register(successHandler, errorHandler, {"senderID":"527085141383","ecb":"onNotification"});                                     } else {                             pushNotification.register(tokenHandler, errorHandler, {"badge":"true","sound":"true","alert":"true","ecb":"onNotificationAPN"});   // obbligatorio!                        }                    }                    catch(err) {                         txt="There was an error on this page.\n\n";                         txt+="Error description: " + err.message + "\n\n";                         alert(txt);                     }         }   // fine onDeviceReady        function onNotificationAPN(e) {            if (e.alert) {                 $("#app-status-ul").append('<li>push-notification: ' + e.alert + '</li>');                 // showing an alert also requires the org.apache.cordova.dialogs plugin                 navigator.notification.alert(e.alert);            }            if (e.sound) {                // playing a sound also requires the org.apache.cordova.media plugin                var snd = new Media(e.sound);                snd.play();            }            if (e.badge) {                pushNotification.setApplicationIconBadgeNumber(successHandler, e.badge);            }        }        function onNotification(e) {            $("#app-status-ul").append('<li>EVENT -> RECEIVED:' + e.event + '</li>');            switch( e.event ){                case 'registered':                            if ( e.regID.length > 0 )                            {                                $("#app-status-ul").append('<li>REGISTERED -> REGID:' + e.regID + "</li>");                                // Your GCM push server needs to kNow the regID before it can push to this device                                // here is where you might want to send it the regID for later use.                                console.log("regID = " + e.regID);                            }                    break;                case 'message':                    // if this flag is set, this notification happened while we were in the foreground.                    // you might want to play a sound to get the user's attention, throw up a dialog, etc.                      var notificaOk = function(){                        console.log("OK");                      }                      var notificaKo = function(){                        console.log("KO");                      }                      window.plugin.notification.local.add({ID: 1, Title: "Product available", message: "Nexus 6 in stock", smallicon: 'ic_dialog_email', icon: 'ic_launcher'}, notificaOk, notificaKo);                    if (e.foreground){                                   $("#app-status-ul").append('<li>--INliNE NOTIFICATION--' + '</li>');                                  // on AndroID soundname is outsIDe the payload.                                 // On Amazon fireos all custom attributes are contained within payload                                var soundfile = e.soundname || e.payload.sound;                                // if the notification contains a soundname, play it.                                // playing a sound also requires the org.apache.cordova.media plugin                                var my_media = new Media("/androID_asset/www/"+ soundfile);                                     my_media.play();                              }                              else{ // otherwise we were launched because the user touched a notification in the notification tray.                                if (e.coldstart)                                     $("#app-status-ul").append('<li>--ColDSTART NOTIFICATION--' + '</li>');                                else                                   $("#app-status-ul").append('<li>--BACKGROUND NOTIFICATION--' + '</li>');                            }                            $("#app-status-ul").append('<li>MESSAGE -> MSG: ' + e.payload.message + '</li>');                              //androID only                            $("#app-status-ul").append('<li>MESSAGE -> MSGCNT: ' + e.payload.msgcnt + '</li>');                              //amazon-fireos only                              $("#app-status-ul").append('<li>MESSAGE -> TIMESTAMP: ' + e.payload.timeStamp + '</li>');                      break;                case 'error':                            $("#app-status-ul").append('<li>ERROR -> MSG:' + e.msg + '</li>');                          break;                          default:                            $("#app-status-ul").append('<li>EVENT -> UnkNown, an event was received and we do not kNow what it is</li>');                          break;                  }        }        function tokenHandler (result) {            $("#app-status-ul").append('<li>token: '+ result +'</li>');            // Your iOS push server needs to kNow the token before it can push to this device            // here is where you might want to send it the token for later use.        }        function successHandler (result) {            $("#app-status-ul").append('<li>success:'+ result +'</li>');        }        function errorHandler (error) {            $("#app-status-ul").append('<li>error:'+ error +'</li>');        }             document.addEventListener('deviceready', onDeviceReady, true);     </script>    <div ID="home">        <div ID="app-status-div">            <ul ID="app-status-ul">                <li>Cordova PushNotification Plugin Demo</li>            </ul>        </div>    </div></body></HTML>

然后我使用以下nodeJs脚本向我的设备发送推送通知:

var GCM = require('gcm').GCM;var APIKey = "***";var gcm = new GCM(APIKey);var devRegIDTarget = "APA9....";var message = {    message: "Text msg",    registration_ID : devRegIDTarget,     Title : 'Title',    msgcnt : '1',    collapseKey : "msg1",    soundname : 'beep.wav'};message.timetolive = 3000;message.delayWhileIDle = true;gcm.send(message, function(err, messageID){    if (err) {        console.log("Something has gone wrong!");    } else {        console.log("Sent with message ID: ", messageID);    }});

解决方法:

我在使用PushPlugin和localnotification方面有类似的经验.

对于我的情况,通知在后台工作但是androID的白色空白.

我整晚都在检查localnotification插件的源代码,但事实证明这是PushPlugin本身的问题. (我会说,确切的问题是两个插件之间断开连接)在PushPlugin的源代码中,它检查应用程序是在前台还是后台.

如果应用程序在后台,则不会向cordova应用程序触发通知事件,但PushPlugin会创建自己的本地通知.

    @OverrIDeprotected voID onMessage(Context context, Intent intent) {    Log.d(TAG, "onMessage - context: " + context);    // Extract the payload from the message    Bundle extras = intent.getExtras();    if (extras != null)    {        // if we are in the foreground, just surface the payload, else post it to the statusbar        if (PushPlugin.isInForeground()) {            extras.putBoolean("foreground", true);            PushPlugin.sendExtras(extras);        }        else {            extras.putBoolean("foreground", false);            // Send a notification if there is a message            if (extras.getString("message") != null && extras.getString("message").length() != 0) {                createNotification(context, extras);            }        }    }}

因此,如果您想在后面运行应用程序时使用自定义的smallicon.

我通过覆盖初始代码来快速破解

    public voID createNotification(Context context, Bundle extras){    notificationmanager mnotificationmanager = (notificationmanager) getSystemService(Context.NOTIFICATION_SERVICE);    String appname = getAppname(this);    Intent notificationIntent = new Intent(this, PushHandlerActivity.class);    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_top | Intent.FLAG_ACTIVITY_CLEAR_top);    notificationIntent.putExtra("pushBundle", extras);    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);    int defaults = Notification.DEFAulT_ALL;    if (extras.getString("defaults") != null) {        try {            defaults = Integer.parseInt(extras.getString("defaults"));        } catch (NumberFormatException e) {}    }    NotificationCompat.Builder mBuilder =            new NotificationCompat.Builder(context)                .setDefaults(defaults)                .setSmallicon(getResourceID(context, "pushicon", "drawable", context.getPackagename()))                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), getResourceID(context, "icon", "drawable", context.getPackagename())))                .setWhen(System.currentTimeMillis())                .setContentTitle(extras.getString("Title"))                .setTicker(extras.getString("Title"))                .setContentIntent(contentIntent)                .setautoCancel(true);    String message = extras.getString("message");    if (message != null) {        mBuilder.setContentText(message);    } else {        mBuilder.setContentText("<missing message content>");    }    String msgcnt = extras.getString("msgcnt");    if (msgcnt != null) {        mBuilder.setNumber(Integer.parseInt(msgcnt));    }    int notID = 0;    try {        notID = Integer.parseInt(extras.getString("notID"));    }    catch(NumberFormatException e) {        Log.e(TAG, "Number format exception - Error parsing Notification ID: " + e.getMessage());    }    catch(Exception e) {        Log.e(TAG, "Number format exception - Error parsing Notification ID" + e.getMessage());    }    mnotificationmanager.notify((String) appname, notID, mBuilder.build());}

现在,您需要做的就是将名为“pushicon”的图像放在可绘制的文件夹平台/ androID / res / drawable / pushicon.png中
(我为大图标使用图像“图标”)

如果这很麻烦,我为此做了一个git repo
https://github.com/zxshinxz/PushPlugin.git

cordova插件添加https://github.com/zxshinxz/PushPlugin.git

希望其他程序员不要经历我经历的痛苦.

总结

以上是内存溢出为你收集整理的android – 当应用程序在后台时,Cordova本地通知不起作用全部内容,希望文章能够帮你解决android – 当应用程序在后台时,Cordova本地通知不起作用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1095968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存