我目前正在开发适用于Android和iOS的Phonegap 3.0应用程序。我添加了PushPlugin几乎所有东西在android上运行正常,除了两件事:
1。 当我收到推送通知并且我的应用当前不在前台时,该消息会显示在我的通知栏中。单击通知后,应用程序将启动,通知消息将显示两次。显示的消息是带有通知数据的简单javascript警报,我在“onNotificationGCM”消息事件中添加了该消息。
此事件在通知栏中添加通知时第一次触发,第二次点击通知并启动我的应用时触发。因此,我的消息的警报功能被调用两次,并显示2个警报。
以下是我的代码中的简短代码段:
onNotificationGCM: function (e) {
switch( e.event )
{
case 'registered':
if ( e.regid.length > 0 )
{
console.log('Regid ' + e.regid);
}
break;
case 'message':
// this is the actual push notification. its format depends on the data model from the push server
console.log('Entered message');
alert('message = '+e.message);
break;
}
}
所以我的问题是,如何防止出现这种情况,我的通知只会在打开应用时显示一次?
2。 我也有这个问题,已经在github repo中发布了一个问题:Issue
一旦我退出应用程序(而不是设置中的“管理应用程序”菜单),我就无法收到任何推送通知。我尝试在启动时启动我的应用程序,但这不起作用。但是当我启动应用程序时,会显示所有通知。
也许有人已经知道了一些解决方法。
我也注意到,PushPlugin使用了不推荐使用的GCM方法。有谁知道这可能是原因,为什么即使应用程序没有运行也不会显示通知?
答案 0 :(得分:1)
好的,所以我自己想出了自己的第一点。我不再使用警报功能,而是使用了使用通知插件的cordova.exec()
函数。在此,如果单击警报按钮,我引用了一个回调函数。之后我添加了一个小标志,表示是否已经看到并点击了警报。只要标志显示,消息尚未确认,则不会显示其他通知。并且,当应用程序在后台时,通知仅显示一次。以下是简短的代码段:
var confirmedGcmNotification = true;
...
onNotificationGCM: function (e) {
switch( e.event )
{
case 'message':
// this is the actual push notification. its format depends on the data model from the push server
console.log('Entered message');
if ( e.foreground )
{
// When app is already open
cordova.exec(null, null, 'Notification', 'alert', [e.message, 'Notification', 'OK']);
}
else
{ // otherwise we were launched because the user touched a notification in the notification tray.
if ( e.coldstart )
{
console.log('coldstart entered');
cordova.exec(null, null, 'Notification', 'alert', [e.message, 'Notification', 'OK']);
}
else
{
console.log('Background entered');
if(confirmedGcmNotification) {
confirmedGcmNotification = false;
cordova.exec(PushSupport.gcmNotificationBackgroundAlert, null, 'Notification', 'alert', [e.message, 'Notification', 'OK']);
}
}
}
break;
}
},
gcmNotificationBackgroundAlert: function() {
confirmedGcmNotification = true;
},
第二点有点不同。我还没有解决方案,但是我检查了android日志并注意到,当应用程序关闭并发出新的通知时,应用程序会收到通知,但插件处理错误并且不会显示它。也许很快就会有解决方案。