随时通知用户

一天内用户使用多种设备,他们希望随时得到通知,但是又不会干扰他们正在进行的工作。

您可以使用 Google 云消息服务(GCM)以及丰富的通知 API 随时通知用户,并让他们决定什么时候适合重新与您的应用交互。

Notifications in system user tray

GCM 和丰富的通知示例
gcm-notifications 示例演示了 GCM 与丰富的通知 API 之间的简单集成。

用户工作流程概述

为了随时通知用户,您需要某种方式将新信息推送至用户,即使所有的应用窗口都已经关闭或最小化。如下是一个很简单的电子邮件应用中用户工作流程的概述(真正的电子邮件应用会复杂得多),之后是实现细节:

  1. 在 GCM 中注册您的应用。
  2. 您的应用监听服务器上新的电子邮件数据。
  3. 您的服务器将新的电子邮件数据发送至用户的应用。
  4. Google 云消息服务唤醒用户的应用,告诉它有新的电子邮件消息。
  5. 应用分析服务器的数据,创建通知。
  6. 用户在系统托盘中看到通知。

这样的工作流程是一种实现方式。您可以选择直接从服务器向用户推送消息,而不使用丰富的通知;您也可以向用户发送通知,而不使用来自 GCM 的数据。然而,这两种 API 是很好的搭档:GCM 可以在服务器端有新数据可用时唤醒应用,丰富的通知将信息展现给用户。

在 GCM 中注册

在 GCM 中注册您的应用或扩展程序,获取注册标识符,用于发送消息:


function registerCallback(registrationId) {
  if (chrome.runtime.lastError) {
    // 如果注册失败,处理错误,并在一段时间后重试。
    return;
  }

  // 这就是您的注册标识符。
  // 通常您将它发送给服务器,接下来使用它发送消息。
  console.log(registrationId);
}

监听新数据

来自服务器的消息通过 gcm.onMessage 事件传递,您的应用或扩展程序必须在事件页面中注册处理程序接收该事件,这样才能唤醒您的应用或扩展程序。


// 设置 GCM 消息事件的监听器。
chrome.gcm.onMessage.addListener(messageReceived);

启用 GCM
如果要在您的应用或扩展程序中使用 GCM,您首先需要启用它

向应用发送消息

使用 gcm-notifications 示例生成一条 curl 命令,向服务器发送消息:

curl -H "Content-Type:application/x-www-form-urlencoded;charset=UTF-8" -H "Authorization: key=YOUR_APP_KEY" -d "registration_id=YOUR_REGISTRATION_ID" -d data.YOUR_MESSAGE_KEY=YOUR_MESSAGE_VALUE https://android.googleapis.com/gcm/send

GCM 服务器会将消息转发给所有运行着应用或扩展程序的 Chrome 实例,只要它们具有其中某一个注册标识符。只要 Chrome 浏览器还在运行,即使扩展程序或应用不在运行,应用或扩展程序的事件页面也会唤醒,以便传递消息。

创建通知

messageReceived 事件处理程序进入您的事件页面(请参见上面的监听新数据部分)。GCM 服务发送消息时,事件处理程序创建通知:

  function messageReceived(message) {
    // message 对象包含 data 属性,它由键值对构成。
  
    // 返回通知中使用的新通知标识符。
    function getNotificationId() {
      var id = Math.floor(Math.random() * 9007199254740992) + 1; 
      // 保存最新的通知标识符,这样后台网页关闭后事件处理程序
      // 仍然能访问通知。
      chrome.storage.local.set({'id': id});
      return id.toString();
    }
  
    // 将所有键值对连接起来,形成显示的字符串。
    var messageString = "";
    for (var key in message.data) {
      if (messageString != "")
        messageString += ", "
      messageString += key + ":" + message.data[key];
    }
  
    // 弹出通知显示 GCM 消息。
    chrome.notifications.create(getNotificationId(), {
      title: '新邮件',
      iconUrl: 'mail_128.png',
      type: 'basic',
      message: messageString
    }, creationCallback);
  }