Google Cloud Messaging for Chrome - 收到的消息不会显示为弹出窗口

时间:2014-04-17 05:28:16

标签: google-chrome google-cloud-messaging google-chrome-app chrome-gcm

我下载了Google push-sample-app code,从清单中删除了密钥,将应用程序上传到Chrome网上应用店,然后通过网上应用店将其安装在Chrome中。

现在 chrome:// extensions / 将应用列为"已启用",使用" 检查视图:后台页面(非活动) &#34 ;. Chrome任务管理器不会将应用列出为当前正在运行。

如果在 chrome:// extensions / 标签中,我点击" 后台页面(非活动)"链接"推送消息传递样本"应用程序,然后检查视图显示在单独的Chrome窗口中,Chrome任务管理器中会显示一个新条目:" 背景页面:推送消息传递示例"。只要检查视图Chrome窗口打开,就会显示一个事件页面" background.js"没有卸载。当消息发送到推送消息服务时,会出现一个带有消息文本的弹出窗口。

如果我关闭了检查视图Chrome窗口,并向推送消息服务发送消息,则Chrome任务管理器会显示一个事件页面" background.js"加载,然后在几秒钟内卸载从任务管理器中消失。但是,不会显示带有消息的弹出窗口。

如何在不运行任何额外的Chrome窗口的情况下更改此应用以显示弹出消息?

2 个答案:

答案 0 :(得分:3)

示例应用程序未显示来自&#34的通知;后台页面处于非活动状态" state因为当后台页面被唤醒时,没有设置chrome.pushMessaging.onMessage的事件处理程序。

当用户通过单击其图标启动应用程序时,将触发chrome.app.runtime.onLaunched()事件。但是当由于某些传入事件(如推送消息或警报)而激活后台页面时,onLaunched不会被触发 - 相反,只执行初始脚本',即函数之外的JS代码。后台页面的初始脚本必须注册事件监听器,因此在初始加载后Chrome知道要调用哪个处理程序。示例应用程序仅在onLaunched中注册onMessage处理程序,而不是从初始脚本注册。

很容易修复'示例应用程序 - 只需将setupPush()的调用从onLaunched()处理程序移动到background.js文件的最后:

background.js:

....
// When a Push Message arrives, show it as a text notification (toast)
function showPushMessage(payload, subChannel) {
  var notification = window.webkitNotifications.createNotification(
      'icon.png', 'Push Message',
      "Push message for you! " +
      payload +" [" + subChannel + "]");
  notification.show();
}

setupPush();  // <-- this executes every time page loads, not only in onLaunched

这将导致每次激活后台页面时都会执行setupPush(),无论用户是否启动了应用程序,或者应用程序是在后台启动以响应传入的推送消息。

答案 1 :(得分:1)

question / answer解释了遗漏的内容:

  

&#34;因为侦听器本身只存在于事件页面的上下文中,所以每次加载事件页面时都必须使用addListener;只有在runtime.onInstalled本身是这样做是不够的。&#34;

要修复push-sample-app,只需添加 background.js

// Register with the Push Messaging system for the Push Message.
chrome.pushMessaging.onMessage.addListener(messageCallback);