0

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

现在chrome://extensions/将该应用程序列为“已启用”,并带有“检查视图:背景页面(非活动) ”。Chrome 任务管理器不会将该应用列为当前正在运行。

如果在chrome://extensions/选项卡上,我单击“ Push Messaging Sample”应用程序的“ background page (Inactive) ”链接,则检查视图会显示在单独的 Chrome 窗口中,并且 Chrome 任务管理器中会出现一个新条目:“后台页面:推送消息示例”。只要检查视图 Chrome 窗口打开,事件页面“background.js”就不会被卸载。并且当消息被发送到推送消息服务时,会出现一个带有消息文本的弹出窗口。

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

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

4

2 回答 2

3

示例应用程序不会显示来自“后台页面处于非活动状态”状态的通知,因为当后台页面被唤醒时,chrome.pushMessaging.onMessage 的事件处理程序未设置。

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

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

背景.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() 在每次激活后台页面时执行,无论是用户启动应用程序还是应用程序在后台启动以响应传入的推送消息。

于 2014-04-18T20:00:12.460 回答
1

这个问题/答案解释了缺少的内容:

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

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

// Register with the Push Messaging system for the Push Message.
chrome.pushMessaging.onMessage.addListener(messageCallback);
于 2014-04-18T18:31:40.090 回答