Google Cloud Messaging для Chrome - полученное сообщение не отображается как всплывающее окно

Я скачал код push-образца приложения Google, удалил ключ из манифеста, загрузил приложение в Интернет-магазин Chrome, а затем установил его в Интернет-магазине Chrome.

Теперь chrome://extensions/ выводит приложение как "Включено" с "Проверять просмотры: фоновая страница (Неактивно)". Диспетчер задач Chrome не отображает приложение как запущенное в данный момент.

Если на chrome://extensions/ tab я нажимаю ссылку "фоновая страница (неактивно)" для приложения "Push Messaging Sample", то в отдельном окне Chrome отображается представление проверки, а в диспетчере задач Chrome появляется новая запись.: "Фоновая страница: образец push-сообщений". Пока открыто окно Chrome с проверкой, страница события "background.js" не выгружается. И когда сообщение отправляется в службу push-сообщений, появляется всплывающее окно с текстом сообщения.

Если я закрою окно просмотра Chrome с проверкой и отправлю сообщение службе push-сообщений, Chrome Task Manager покажет, что страница события "background.js" загружается, а затем выгружается через несколько секунд, исчезая из диспетчера задач. Однако всплывающее окно с сообщением не появляется.

Как нужно изменить это приложение, чтобы показывать всплывающие сообщения без запуска дополнительных окон Chrome?

2 ответа

Решение

В примере приложения не отображается уведомление о состоянии "фоновая страница неактивна", поскольку при пробуждении фоновой страницы обработчик событий для chrome.pushMessaging.onMessage не настраивается.

Когда пользователь запускает приложение, щелкая его значок, происходит событие chrome.app.runtime.onLaunched(). Но когда фоновая страница активируется из-за какого-то входящего события (например, push-сообщения или тревоги), onLaunched не запускается - вместо этого выполняется только "начальный скрипт", код JS вне функций. Первоначальный сценарий фоновой страницы должен регистрировать прослушиватели событий, чтобы после начальной загрузки Chrome знал, какой обработчик вызывать. Пример приложения регистрирует только обработчик onMessage в onLaunched, но не из исходного скрипта.

Образец приложения легко исправить - просто переместите вызов 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() при каждой активации фоновой страницы, независимо от того, запустил ли пользователь приложение или приложение в фоновом режиме в ответ на входящее push-сообщение.

Этот вопрос / ответ объяснил, чего не хватает:

"Поскольку сами слушатели существуют только в контексте страницы события, вы должны использовать addListener каждый раз, когда страница события загружается; делать это только во время выполнения.onInstalled само по себе недостаточно".

Чтобы исправить push-sample-app, все что нужно, это добавить в background.js:

// Register with the Push Messaging system for the Push Message.
chrome.pushMessaging.onMessage.addListener(messageCallback);
Другие вопросы по тегам