Cordova 推送通知 (PhoneGap PushPlugin) 未触发 ecb 回调 (onNotificationAPN)
Posted
技术标签:
【中文标题】Cordova 推送通知 (PhoneGap PushPlugin) 未触发 ecb 回调 (onNotificationAPN)【英文标题】:Cordova Push Notifications (PhoneGap PushPlugin) not firing ecb callback (onNotificationAPN) 【发布时间】:2014-04-03 23:19:34 【问题描述】:我将 Cordova Push Notifications Plugin 1.3.4 与我的 Cordova/Phonegap 应用程序一起使用。不幸的是,当收到推送通知时,我的 javascript 中的 ecb 回调从未被触发,我无法处理推送通知(即使应用程序在前台运行时也无法处理)。
我正在使用演示中的example code:
pushNotification.register(tokenHandler, errorHandler, "badge": "true", "sound": "true", "alert": "true", "ecb": "onNotificationAPN");
注册成功,但从未触发以下回调:
function onNotificationAPN (event)
if (event.alert)
navigator.notification.alert(event.alert);
【问题讨论】:
【参考方案1】:问题在于您定义回调函数的方式,导致推送插件评估您的回调(即通过[webView stringByEvaluatingJavaScriptFromString
)失败,因为它不会意识到这一点。
如果您将回调函数定义为全局对象,插件将在每次新通知到达时正确触发您的回调:
onNotificationAPN = function(event)
if (event.alert)
navigator.notification.alert(event.alert);
;
;
对于 android,您可以用同样的方式定义您的 onNotificationGCM
回调。
【讨论】:
不确定“解析时间定义”是什么意思。onNotificationAPN
必须在全局范围内定义,因为这是上下文 stringByEvaluatingJavaScriptFromString
评估 javascript in。
是的,这就是我的意思。我喜欢你的表达方式,+1
无论你写什么,实际上都没有意义。我必须破译你所说的,然后@artemave 说 id 必须在全球范围内定义。最后,让我的设备注册。谢谢!
感谢您拯救了我 2 小时的错误搜索并为我解决了这个问题!
我已经为此工作了一整天,非常感谢!【参考方案2】:
Mobiletainment 的回答为我解决了这个问题!我整个下午都在寻找解决方案,尽管是 GCM 回调,但功能是相同的。
我会支持 Mobiletainment,但我是新来的,它不会让我这样做,但是谢谢!
对于任何可能正在寻找 GCM 解决方案(Googleverse 中有很多但没有很多好的答案)的人来说,我的代码终于奏效了:
// handle GCM notifications for Android
onNotificationGCM = function(e)
alert('onGCM');
switch( e.event )
case 'registered':
if ( e.regid.length > 0 )
console.log("Regid " + e.regid);
//Do registration work here...
break;
case 'message':
// this is the actual push notification. its format depends on the data model from the push server
alert('message = '+e.message+' msgcnt = '+e.msgcnt);
break;
case 'error':
alert('GCM error = '+e.msg);
break;
default:
alert('An unknown GCM event has occurred');
break;
【讨论】:
【参考方案3】:如果你使用 azure push..below 是工作代码。(pushplugin for phonegap)
function InitpushNotificaions()
// alert("Notification setup");
try
mobileServiceClient = new WindowsAzure.MobileServiceClient('https://mobbacktest.azure-mobile.net/', 'RvahPxHKoEsGiLdlCYZpHBllvSVQxl66');
pushNotification = window.plugins.pushNotification;
if (device.platform == 'android' || device.platform == 'Android' ||
device.platform == 'amazon-fireos')
// AndroId
pushNotification.register(successHandler, errorHandler, "senderID": "724086851305", "ecb": "onNotification" ); // required!
else
//ios
pushNotification.register(tokenHandler, errorHandler, "badge": "true", "sound": "true", "alert": "true", "ecb": "onNotificationAPN" ); // required!
catch (err)
txt = "There was an error on this page.\n\n";
txt += "Error description: " + err.message + "\n\n";
alert(txt);
// handle APNS notifications for iOS
onNotificationAPN=function (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);
//handle GCM notifications for Android
onNotification = function (e)
// alert("gcm");
switch (e.event)
case 'registered':
if (e.regid.length > 0)
// 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.
// alert('step 1 Azure! ' + e.regid);
if (mobileServiceClient)
// alert('step 2 Azure!');
// Template registration.
var template = " \"data\" : \"message\":\"$(message)\"";
// Register for notifications.
mobileServiceClient.push.gcm.registerTemplate(e.regid,
"myTemplate", template, null)
.done(function ()
// alert('Registered template with Azure!');
).fail(function (error)
//alert('Failed registering with Azure: ' + error);
);
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.
if (e.foreground)
// 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("/res/" + beep.wav);
alert("Message:"+e.message);
my_media.play();
else // otherwise we were launched because the user touched a notification in the notification tray.
if (e.coldstart)
else
break;
case 'error':
break;
default:
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)
alert("Success handler:" + result);
// $("#app-status-ul").append('<li>success:'+ result +'</li>');
function errorHandler(error)
alert("Error handler:" + error);
【讨论】:
以上是关于Cordova 推送通知 (PhoneGap PushPlugin) 未触发 ecb 回调 (onNotificationAPN)的主要内容,如果未能解决你的问题,请参考以下文章
Cordova 推送通知 (PhoneGap PushPlugin) 未触发 ecb 回调 (onNotificationAPN)
当应用程序在Phonegap(cordova)的后台状态下收到推送通知时增加徽章编号,
Firebase 推送通知与 PhoneGap Build 使用 cordova-plugin-fcm
如何让 Parse.com 推送通知在 Cordova/Phonegap Android 应用程序中工作?