我正在使用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本地通知不起作用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)