当应用程序处于后台时,不会调用cordova push plugin回调

时间:2014-06-15 23:11:56

标签: cordova push-notification cordova-plugins phonegap-pushplugin

我有推送插件https://github.com/phonegap-build/PushPlugin.git 配置了cordova 3.5。当应用程序位于前台时,将调用通知插件回调,并且一切都按预期工作。

当应用程序处于非活动状态(在后台)时,会收到通知,我可以在通知栏中看到它们,但不会调用回调函数。我的代码基于push插件中给出的示例。下面是我简化的代码重现问题,

 initialize : function () {
    console.info('NOTIFY  Ready to register for push notification.');
    var pushNotification = window.plugins.pushNotification;
    // Register device with push server
    pushNotification.register(gcmSuccessHandler, gcmErrorHandler, {
          'senderID': GCM_SENDER_ID,
          'ecb': 'onNotificationGCM'
     });

 }

window.onNotificationGCM = function(notification){ 
    //the beep is invoked 3 times only when the app is in foreground
navigator.notification.beep(3);
    console.log('EVENT -> RECEIVED:' + notification.event + '');

}

我已经在这个问题上突破了一天多了。任何帮助表示赞赏。

更新 我终于找到了问题所在。我必须清除dalvik缓存并重新启动手机。到目前为止两次发生在我身上。似乎是android中的一个已知问题,https://github.com/phonegap-build/PushPlugin/issues/35

5 个答案:

答案 0 :(得分:13)

我在Cordova 3.5.0和PushPlugin 2.2.0上遇到了类似的问题:当应用程序处于前台但未在后台运行或未运行时,通知有效。我通过阅读PushPlugin的源代码(文件src / com / plugin / gcm / GCMIntentService.java)找到了解决方案:通知的有效负载必须包含“message”和“msgcnt”键。

答案 1 :(得分:4)

Also if you use PhoneGap make sure you have required attributes included in message. From phonegap push plugin doc:

On Android if you want your on('notification') event handler to be called when your app is in the background, JSON you send from GCM will need to include "content-available": "1".

I use Ruby gem Rpush and spent a lot of time figuring out why 'notification' handler isn't fired when app is on background. Code which finally works looks like this:

n = Rpush::Gcm::Notification.new
n.app = Rpush::Gcm::App.find_by_name("MyApp")
n.registration_ids = [ 'xxxxxxxxx' ]
n.data = { 
  title: "Message Title",
  message: "Message Body",
  sound: "default",
  'content-available' => "1"
}
n.save!

答案 2 :(得分:0)

如果您查看" ecb"的文档。 https://github.com/phonegap-build/PushPlugin#ecb-amazon-fire-os-android-and-ios

Your app may receive a notification while it is active (INLINE). 
If you background the app by hitting the Home button on your device, you may later receive a status bar notification. 
Selecting that notification from the status will bring your app to the front and allow you to process the notification (BACKGROUND).

所以在后台模式中,你的" onNotificationGCM"方法将仅在以下场景中调用:

  1. 如果在警报视图中显示通知,用户选择"查看"选项[适用于iOS平台]
  2. 用户从设备通知托盘中选择通知[适用于iOS和Android]

答案 3 :(得分:0)

对我来说,onNotification函数也没有被调用,即使应用程序在前台也没有。

在互联网上阅读我确保发件人ID是100%正确的,因为即使错误,寄存器功能也会返回成功。

现在你建议清除Dalvik缓存,这似乎需要安装一个root设备或恢复工具(默认情况下我的Galaxy Nexus测试设备没有)。这仍然导致我尝试重命名应用程序,希望它不会使用当前缓存。这很有用。

我解决问题的步骤:

  • 更改id文件
  • 中的小部件config.xml
  • 在应用设置
  • 中从手机中删除应用程序
  • 在我的案例中从the Phonegap build service删除了应用并创建了一个新应用(不确定这是否必要)
  • 重建和部署应用程序

启动并运行onNotification功能开始工作! :)

  

<强>更新

     

同样的事情又开始了,我试图阻止我的设备生根,因为它需要一个完整的擦除,但我的同样的修复第二次没有再次工作。

     

在设备生根并安装恢复工具后,擦除Dalvik缓存确实可以解决问题......

答案 4 :(得分:0)

根据FactualHarmony的第3个回答,我也看了下的源代码 /src/android/com/plugin/gcm/GCMIntentService.java。

你必须有&#34;消息&#34;和&#34; msgcnt&#34;在您的消息中输入密钥,以便在应用程序处于后台时使其正常工作,并且对我有用。

希望这有帮助。