| Index: chrome/common/extensions/docs/templates/articles/cloudMessaging.html
|
| diff --git a/chrome/common/extensions/docs/templates/articles/cloudMessaging.html b/chrome/common/extensions/docs/templates/articles/cloudMessaging.html
|
| index a50500fc9902ded75f801191830711b405396406..90ab9aa7b41cc89597f333eccbd1ad9d59259e43 100644
|
| --- a/chrome/common/extensions/docs/templates/articles/cloudMessaging.html
|
| +++ b/chrome/common/extensions/docs/templates/articles/cloudMessaging.html
|
| @@ -1,383 +1,345 @@
|
| -<meta name="doc-family" content="apps">
|
| -<h1 id="gcm">Google Cloud Messaging</h1>
|
| -
|
| -<p>Google Cloud Messaging (GCM) is a service for both Android-powered device and
|
| -Chrome instances to send and receive message data from servers.
|
| -The <a href="gcm">chrome.gcm API</a> allows the Chrome apps or extensions
|
| -to access the GCM service for the signed-in Chrome users.
|
| -The service works even if an app or extension isn't currently running.
|
| -For example, calendar updates could be pushed
|
| -to users even when their calendar app isn't open. </p>
|
| -
|
| -<p>To use both API and service, you must agree to the <a href="https://developers.google.com/terms/">Google APIs Terms of
|
| -Service</a> and <a href="https://developers.google.com/cloud/terms/">Google Cloud Platform Terms
|
| -of Service</a>.</p>
|
| -
|
| -<p>This document describes how to set up and use GCM. For additional information
|
| -see the reference documentation for the <a href="gcm">GCM Chrome API</a> and
|
| -the <a href="http://developer.android.com/google/gcm/index.html">GCM Service</a>. To get
|
| -help with GCM or to give us feedback, please see
|
| -<a href="#feedback">Feedback</a>.</p>
|
| -
|
| -<p class="note"><strong>API Samples</strong>: Want to play with the code? Check out the
|
| -<a href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/gcm-notifications">gcm-notifications</a>
|
| -sample.</p>
|
| -
|
| -<h2 id="enable_gcm">Enable GCM</h2>
|
| -
|
| -<p>To use GCM for your app or extension, do the following:</p>
|
| -
|
| -<ol>
|
| -<li>Upload your app or extension client to the <a href="https://developers.google.com/chrome/web-store/docs/publish">Chrome Web
|
| -Store</a>.</li>
|
| -<li>A user installs your app or extension.</li>
|
| -<li>Your app or extension client requests a registration ID using $(ref:gcm.register)
|
| -function and sends this ID to your server together with information
|
| -identifying the user. For more details, please see <a href="#obtain_registration_id">Obtain registration
|
| -ID</a>.</li>
|
| -</ol>
|
| -
|
| -<h2 id="receive_a_message">Receive a message</h2>
|
| -
|
| -<p>At a glance, receiving a message works like this:</p>
|
| -
|
| -<ol>
|
| -<li>Your app or extension client should register a handler to receive the
|
| -$(ref:gcm.onMessage) event.</li>
|
| -<li>When your server sends a message to the user, it specifies all of the
|
| -registration IDs that are related to that user and passes the message to the
|
| -GCM service.</li>
|
| -<li>GCM servers route the message to all instances of Chrome running apps or
|
| -extensions with one of the registration IDs.</li>
|
| -<li>When the message arrives on the client, Chrome starts the app or extension,
|
| -if it is not already running, and calls the registered handler to process the
|
| -message.</li>
|
| -</ol>
|
| -
|
| -<p>For more details, please see <a href="#receive_messages">Receive messages</a>.</p>
|
| -
|
| -<h2 id="send_a_message">Send a message</h2>
|
| -
|
| -<p>At a glance, sending a message works like this:</p>
|
| -
|
| -<ol>
|
| -<li>Your app or extension generates a unique message ID, so that it is possible
|
| -to find out which message failed to be queued or delivered.</li>
|
| -<li>Your app or extension calls $(ref:gcm.send) function with an object containing
|
| -message ID, destination ID that identifies the server, and data that consist
|
| -of a list of key value pairs. In this step you can also provide an optional
|
| -time-to-live for the message.</li>
|
| -<li>The callback passed to $(ref:gcm.send) function will be called to notify the
|
| -result. Your app or extension should check $(ref:runtime.lastError) to find out if
|
| -the message has been successfully queued for delivery. Please refer to <a href="#error_reference">Error
|
| -reference</a> for possible error codes that could be
|
| -returned.</li>
|
| -<li>In cases that the queued message could not be delivered to the GCM server,
|
| -like network error, a $(ref:gcm.onSendError) event will be fired. Your app or
|
| -extension can listen to this event and react to it, e.g. by trying to resend
|
| -the message. Please refer to <a href="#error_reference">Error reference</a> for
|
| -possible error codes that could be returned.</li>
|
| -</ol>
|
| -
|
| -<p>For more details, please see <a href="#send_messages">Send messages</a>.</p>
|
| -
|
| -<p class="note"><strong>Display messages in rich notifications format:</strong><br>
|
| -GCM and rich notifications API are a natural fit;
|
| -Use GCM to send and receive message data; use rich notifications to display
|
| -the data in the user's system tray
|
| -(see <a href="inform_users">Keep Users Informed</a>).</p>
|
| -
|
| -<h2 id="set_up_project">Set up project</h2>
|
| -
|
| -<h3 id="create_google_api_project">Create Google API project</h3>
|
| -
|
| -<ol>
|
| -<li>Login to the <a href="https://cloud.google.com/console/project">Google Developers
|
| -Console</a> using the same Google Account that you will use to upload your app or extension.</li>
|
| -<li>If you haven't created an API project yet, click <strong>Create Project</strong>.</li>
|
| -<li>Supply a project name and click <strong>Create</strong>.</li>
|
| -<li>Once the project has been created, a page appears that displays your project
|
| -number. For example, <strong>Project Number: 670330094152</strong>.</li>
|
| -<li>Copy down your project number. You will use it later on as the GCM sender ID.</li>
|
| -</ol>
|
| -
|
| -<h3 id="enable_the_gcm_service">Enable the GCM service</h3>
|
| -
|
| -<ol>
|
| -<li>In the sidebar on the left, select <strong>APIs & auth</strong>.</li>
|
| -<li>In the displayed list of APIs, turn the <strong>Google Cloud Messaging for
|
| -Android</strong> toggle to ON.</li>
|
| -</ol>
|
| -
|
| -<h2 id="set_up_chrome_app_or_extension">Set up Chrome App or Extension</h2>
|
| -
|
| -<h3 id="add_permission_to_manifest">Add permission to manifest</h3>
|
| -
|
| -<p>To use the gcm service, you must declare the <code>gcm</code> permission in
|
| -<code>manifest.json</code>.</p>
|
| -
|
| -<pre data-filename="manifest.json"><code>
|
| -"permissions": [
|
| - "gcm", "storage", ...
|
| -]
|
| -</code></pre>
|
| -
|
| -<p>Please note that the <code>storage</code> permission is also provided here because the
|
| -sample codes below needs to persist some data via the
|
| -<a href="storage">chrome.storage</a> API.</p>
|
| -
|
| -<h2 id="write_chrome_app_or_extension">Write Chrome App or Extension</h2>
|
| -
|
| -<h3 id="obtain_registration_id">Obtain registration ID</h3>
|
| -
|
| -<p>Your app or extension needs to register with GCM servers before it can receive
|
| -messages. When an app or extension registers, it receives a registration ID.
|
| -This is achieved by calling $(ref:gcm.register) and specifying a list of senders
|
| -identified by project numbers from Google Developers Console. Your app or
|
| -extension should pass a callback function to verify that the registration was
|
| -successful. If successful, the received registration ID should be sent back to
|
| -your application server in a secure way, for example, via https. Otherwise, your
|
| -app or extension should handle the error identified by
|
| -<code>chrome.runtime.lastError</code> and retry later.</p>
|
| -
|
| -<p>If your app or extension wishes to receive messages from the different senders,
|
| -it can call $(ref:gcm.register) again with the new sender list and the new
|
| -registration ID will be returned.</p>
|
| -
|
| -<pre data-filename="background.js"><code>
|
| -function registerCallback(registrationId) {
|
| - if (chrome.runtime.lastError) {
|
| - // When the registration fails, handle the error and retry the
|
| - // registration later.
|
| - return;
|
| - }
|
| -
|
| - // Send the registration ID to your application server.
|
| - sendRegistrationId(function(succeed) {
|
| - // Once the registration ID is received by your server,
|
| - // set the flag such that register will not be invoked
|
| - // next time when the app starts up.
|
| - if (succeed)
|
| - chrome.storage.local.set({registered: true});
|
| - });
|
| -}
|
| -
|
| -function sendRegistrationId(callback) {
|
| - // Send the registration ID to your application server
|
| - // in a secure way.
|
| -}
|
| -
|
| -chrome.runtime.onStartup.addListener(function() {
|
| - chrome.storage.local.get("registered", function(result) {
|
| - // If already registered, bail out.
|
| - if (result["registered"])
|
| - return;
|
| -
|
| - // Up to 100 senders are allowed.
|
| - var senderIds = ["Your-Sender-ID"];
|
| - chrome.gcm.register(senderIds, registerCallback);
|
| - });
|
| -});
|
| -</code></pre>
|
| -
|
| -<p>If your app or extension is installed in different profiles and/or in different
|
| -Chrome instances, each of them will receive a different registration ID.</p>
|
| -
|
| -<p>Your app or extension could call $(ref:gcm.unregister) to revoke the registration ID.
|
| -The unregistration should only be done in rare cases, such as if your app or
|
| -extension does not want to receive further messages, or the registration ID is
|
| -suspected to be compromised.</p>
|
| -
|
| -<pre data-filename="background.js"><code>
|
| -function unregisterCallback() {
|
| - if (chrome.runtime.lastError) {
|
| - // When the unregistration fails, handle the error and retry
|
| - // the unregistration later.
|
| - return;
|
| - }
|
| -}
|
| -
|
| -chrome.gcm.unregister(unregisterCallback);
|
| -</code></pre>
|
| -
|
| -<p>Your app or extension is automatically unregistered from the GCM service when a
|
| -user uninstalls it.</p>
|
| -
|
| -<h3 id="receive_messages">Receive messages</h3>
|
| -
|
| -<p>When your server sends a message to the user, it specifies all of the
|
| -registration IDs that are related to that user and passes the message to the GCM
|
| -service. GCM servers route the message to all instances of Chrome running apps
|
| -or extensions with one of the registration IDs. If your app or extension has
|
| -been installed in more than one profiles in a single Chrome instance, all of
|
| -them can receive messages independently based on their unique registration IDs.</p>
|
| -
|
| -<p>Messages from the server are delivered via the $(ref:gcm.onMessage) event. Your app
|
| -or extension must register a handler to receive this event.</p>
|
| -
|
| -<pre data-filename="background.js"><code>
|
| -chrome.gcm.onMessage.addListener(function(message) {
|
| - // A message is an object with a data property that
|
| - // consists of key-value pairs.
|
| -});
|
| -</code></pre>
|
| -
|
| -<p>As long as Chrome is running, even if the extension or app is not running, it is
|
| -woken up to deliver a message.</p>
|
| -
|
| -<h3 id="send_messages">Send messages</h3>
|
| -
|
| -<p>To send messages upstream, your app or extension should call $(ref:gcm.send) with an
|
| -object containing:</p>
|
| -
|
| -<ul>
|
| -<li>Message ID that identifies the message when it fails to be queued or
|
| -delivered. The message ID can be any kind of string. However, it is
|
| -recommended to stay unique across the lifetime of your app or extension, even
|
| -after it restarts. If you use the same message ID, there may be a chance that
|
| -the previous message gets overridden. If an auto-increment counter is used to
|
| -create the message ID, your app or extension should persist the counter value
|
| -via <a href="storage">chrome.storage</a> API and restore it when the app
|
| -reloads.</li>
|
| -<li>Destination ID that identifies the server. This is the project number from the
|
| -Google Developers Console plus the suffix "@gcm.googleapis.com".</li>
|
| -<li>Data that consist of a list of string-to-string key value pairs (up to 4KB
|
| -total).</li>
|
| -<li>Time-to-live (TTL, optional). This property value must be a duration from 0 to
|
| -2,419,200 seconds (4 weeks) and it corresponds to the maximum period of time
|
| -for which GCM will store and try to deliver the message. If this property is
|
| -not set, it is default to the maximum value. When a TTL is set to 0, GCM will
|
| -try to deliver the message immediately. If the immediate effort fails, the
|
| -message will be discarded.</li>
|
| -</ul>
|
| -
|
| -<p>When the callback passed in $(ref:gcm.send) is called without runtime error, it does
|
| -not mean that the message was already delivered to the GCM server. Rather, it
|
| -means that it was queued for delivery. If the message fails to reach the
|
| -destination within the specified TTL period, for example due to network error,
|
| -the $(ref:gcm.onSendError) will be fired.</p>
|
| -
|
| -<pre data-filename="background.js"><code>
|
| -// Substitute your own sender ID here. This is the project
|
| -// number you got from the Google Developers Console.
|
| -var senderId = "Your-Sender-ID";
|
| -
|
| -// Make the message ID unique across the lifetime of your app.
|
| -// One way to achieve this is to use the auto-increment counter
|
| -// that is persisted to local storage.
|
| -
|
| -// Message ID is saved to and restored from local storage.
|
| -var messageId = 0;
|
| -chrome.storage.local.get("messageId", function(result) {
|
| - if (chrome.runtime.lastError)
|
| - return;
|
| - messageId = parseInt(result["messageId"]);
|
| - if (isNaN(messageId))
|
| - messageId = 0;
|
| -});
|
| -
|
| -// Sets up an event listener for send error.
|
| -chrome.gcm.onSendError.addListener(sendError);
|
| -
|
| -// Returns a new ID to identify the message.
|
| -function getMessageId() {
|
| - messageId++;
|
| - chrome.storage.local.set({messageId: messageId});
|
| - return messageId.toString();
|
| -}
|
| -
|
| -function sendMessage() {
|
| - var message = {
|
| - messageId: getMessageId(),
|
| - destinationId: senderId + "@gcm.googleapis.com",
|
| - timeToLive: 86400, // 1 day
|
| - data: {
|
| - "key1": "value1",
|
| - "key2": "value2"
|
| - }
|
| - };
|
| - chrome.gcm.send(message, function(messageId) {
|
| - if (chrome.runtime.lastError) {
|
| - // Some error occurred. Fail gracefully or try to send
|
| - // again.
|
| - return;
|
| - }
|
| -
|
| - // The message has been accepted for delivery. If the message
|
| - // can not reach the destination, onSendError event will be
|
| - // fired.
|
| - });
|
| -}
|
| -
|
| -function sendError(error) {
|
| - console.log("Message " + error.messageId +
|
| - " failed to be sent: " + error.errorMessage);
|
| -}
|
| -</code></pre>
|
| -
|
| -<h3 id="messages_deleted_event">Messages deleted event</h3>
|
| -
|
| -<p>GCM will store up to 100 non-collapsible messages. After that, all messages are
|
| -discarded from GCM, and an event $(ref:gcm.onMessagesDeleted) will be fired, which
|
| -tells the client that it falls behind. Your app or extension should respond by
|
| -syncing with your application server to recover the discarded messages.</p>
|
| -
|
| -<pre data-filename="background.js"><code>
|
| -chrome.gcm.onMessagesDeleted.addListener(messagesDeleted);
|
| -
|
| -function messagesDeleted() {
|
| - // All messages have been discarded from GCM. Sync with
|
| - // your application server to recover from the situation.
|
| -}
|
| -</code></pre>
|
| -
|
| -<h3 id="collapsible_messages">Collapsible messages</h3>
|
| -
|
| -<p>GCM messages are often a tickle, telling the app or extension to contact the
|
| -server for fresh data. In GCM, it's possible to create collapsible messages for
|
| -this situation, wherein new messages replace older ones. When a collapse key is
|
| -provided and multiple messages are queued up in the GCM servers for the same
|
| -user, only the last one with any given collapse key is delivered to your app or
|
| -extension. As a result the <code>message</code> object passed to the $(ref:gcm.onMessage) event
|
| -will contain a <code>collapseKey</code>field. For more details about sending collapsible
|
| -messages, please refer to <a href="http://developer.android.com/google/gcm/adv.html#collapsible">GCM Advance
|
| -Topics</a>.</p>
|
| -
|
| -<h2 id="publish_your_app">Publish your app</h2>
|
| -
|
| -<p>To use the GCM service, you must publish your app in the <a href="https://developers.google.com/chrome/web-store/docs/publish">Chrome Web
|
| -Store</a>.</p>
|
| -
|
| -<h2 id="error_reference">Error reference</h2>
|
| -
|
| -<p>An error could occur when a gcm API function is called. Your app or extension
|
| -should check $(ref:runtime.lastError) for more information in your callback. The
|
| -error code will also be passed as a parameter to $(ref:gcm.onSendError) event.</p>
|
| -
|
| -<p>Here's a brief summary of the gcm errors:</p>
|
| -
|
| -<ul>
|
| -<li><strong>Function was called with invalid parameters</strong>: this could happen when gcm
|
| -functions are called with bad parameters.</li>
|
| -<li><strong>Profile was not signed in</strong>: this could happen when gcm functions are called
|
| -from a profile that was not signed in.</li>
|
| -<li><strong>Asynchronous operation is pending</strong>: this could happen when certain gcm
|
| -function is called again without waiting for the callback passed in previous
|
| -function to be called.</li>
|
| -<li><strong>Network error occurred</strong>: this could happen when GCM server fails to reach
|
| -due to network problem, like losing Internet connection.</li>
|
| -<li><strong>Server error occurred</strong>: this could happen when GCM server fails to reach
|
| -due to server problem, like server busy.</li>
|
| -<li><strong>Time-to-live exceeded</strong>: this could happen when a message could not be
|
| -delivered within the specific time-to-live period.</li>
|
| -<li><strong>Unknown error occurred</strong>: this could happen due to any other internal
|
| -errors.</li>
|
| -</ul>
|
| -
|
| -<h2 id="feedback">Feedback</h2>
|
| -
|
| -<p>You can provide feedback about Google Cloud Messaging and the
|
| -<a href="gcm">chrome.gcm API</a> through
|
| -the Google Group <a href="https://groups.google.com/forum/#!forum/gcm-for-chrome-feedback">GCM for Chrome
|
| -Feedback</a>.
|
| -Use this group to ask for help, file bug reports, and request features.</p>
|
| +<meta name="doc-family" content="apps">
|
| +<h1 id="gcm">Google Cloud Messaging</h1>
|
| +
|
| +<p>Google Cloud Messaging (GCM) is a service for both Android-powered devices and
|
| +Chrome instances to send and receive message data from servers. The
|
| +<a href="gcm.html">chrome.gcm</a> API allows the Chrome apps or extensions to access
|
| +the GCM service for the signed-in Chrome users. The service works even if an app
|
| +or extension isn't currently running. For example, calendar updates could be
|
| +pushed to users even when their calendar app isn't open. </p>
|
| +
|
| +<p>To use both API and service, you must agree to the <a href="https://developers.google.com/terms/">Google APIs Terms of
|
| +Service</a> and <a href="https://developers.google.com/cloud/terms/">Google Cloud Platform Terms
|
| +of Service</a>.</p>
|
| +
|
| +<p>This document describes how to set up and use GCM. For additional information
|
| +see the reference documentation for the <a href="gcm.html">chrome.gcm</a> API and
|
| +the <a href="http://developer.android.com/google/gcm/index.html">GCM Service</a>. To get
|
| +help with GCM or to give us feedback, please see
|
| +<a href="#feedback">Feedback</a>.</p>
|
| +
|
| +<p class="note"><strong>API Samples</strong>: Want to play with the code? Check out the
|
| +<a href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/gcm-notifications">gcm-notifications</a>
|
| +sample.</p>
|
| +
|
| +<h2 id="set_up_project">Set up project</h2>
|
| +
|
| +<h3 id="create_google_api_project">Create Google API project</h3>
|
| +
|
| +<ol>
|
| +<li>Login to the <a href="https://cloud.google.com/console/project">Google Developers
|
| +Console</a> using the same Google
|
| +Account that you will use to upload your app or extension.</li>
|
| +<li>If you haven't created an API project yet, click <strong>Create Project</strong>.</li>
|
| +<li>Supply a project name and click <strong>Create</strong>.</li>
|
| +<li>Once the project has been created, a page appears that displays your project
|
| +number. For example, <strong>Project Number: 670330094152</strong>.</li>
|
| +<li>Copy down your project number. You will use it later on as the GCM sender ID.</li>
|
| +</ol>
|
| +
|
| +<h3 id="enable_the_gcm_service">Enable the GCM service</h3>
|
| +
|
| +<ol>
|
| +<li>In the sidebar on the left, select <strong>APIs</strong> under <strong>APIs & auth</strong>.</li>
|
| +<li>In the displayed list of APIs, turn the <strong>Google Cloud Messaging for
|
| +Android</strong> toggle to ON.</li>
|
| +</ol>
|
| +
|
| +<h2 id="set_up_chrome_app_or_extension">Set up Chrome App or Extension</h2>
|
| +
|
| +<h3 id="add_permission_to_manifest">Add permission to manifest</h3>
|
| +
|
| +<p>To use the gcm service, you must declare the <code>gcm</code> permission in
|
| +<code>manifest.json</code>.</p>
|
| +
|
| +<pre data-filename="manifest.json"><code>
|
| +"permissions": [
|
| + "gcm", ... // Other permissions, like "storage"
|
| +]
|
| +</code></pre>
|
| +
|
| +<p>Please note that running sample code below requires the <code>storage</code> permission as
|
| +well in order to persist some data via the <a href="storage.html">chrome.storage</a>
|
| +API.</p>
|
| +
|
| +<h2 id="write_chrome_app_or_extension">Write Chrome App or Extension</h2>
|
| +
|
| +<h3 id="obtain_gcm_registration_id">Obtain GCM registration ID</h3>
|
| +
|
| +<p>Your app or extension needs to register with GCM servers before it can receive
|
| +messages. This is achieved by calling $(ref:gcm.register) and passing a list of
|
| +senders identified by project numbers from <a href="https://cloud.google.com/console/project">Google Developers
|
| +Console</a>. Your app or extension should
|
| +pass a callback function to verify if the registration succeeded or not, by
|
| +checking whether the error is set on <code>chrome.runtime.lastError</code> property. If the
|
| +registration is successful, an app or extension receives a registration ID,
|
| +which should be sent back to your application server in a secure way, for
|
| +example, via https. Otherwise, your app or extension should handle the error
|
| +identified by <code>chrome.runtime.lastError</code> and retry later.</p>
|
| +
|
| +<p>If your app or extension wishes to receive messages from the different senders,
|
| +it can call $(ref:gcm.register) again with the new sender list and the new
|
| +registration ID will be returned.</p>
|
| +
|
| +<pre data-filename="background.js"><code>
|
| +function registerCallback(registrationId) {
|
| + if (chrome.runtime.lastError) {
|
| + // When the registration fails, handle the error and retry the
|
| + // registration later.
|
| + return;
|
| + }
|
| +
|
| + // Send the registration ID to your application server.
|
| + sendRegistrationId(function(succeed) {
|
| + // Once the registration ID is received by your server,
|
| + // set the flag such that register will not be invoked
|
| + // next time when the app starts up.
|
| + if (succeed)
|
| + chrome.storage.local.set({registered: true});
|
| + });
|
| +}
|
| +
|
| +function sendRegistrationId(callback) {
|
| + // Send the registration ID to your application server
|
| + // in a secure way.
|
| +}
|
| +
|
| +chrome.runtime.onStartup.addListener(function() {
|
| + chrome.storage.local.get("registered", function(result) {
|
| + // If already registered, bail out.
|
| + if (result["registered"])
|
| + return;
|
| +
|
| + // Up to 100 senders are allowed.
|
| + var senderIds = ["Your-Sender-ID"];
|
| + chrome.gcm.register(senderIds, registerCallback);
|
| + });
|
| +});
|
| +</code></pre>
|
| +
|
| +<p>If your app or extension is installed in different profiles and/or in different
|
| +Chrome instances, each of them will receive a different registration ID.</p>
|
| +
|
| +<p>Your app or extension could call $(ref:gcm.unregister) to revoke the registration ID.
|
| +The unregistration should only be done in rare cases, such as if your app or
|
| +extension does not want to receive further messages, or the registration ID is
|
| +suspected to be compromised.</p>
|
| +
|
| +<pre data-filename="background.js"><code>
|
| +function unregisterCallback() {
|
| + if (chrome.runtime.lastError) {
|
| + // When the unregistration fails, handle the error and retry
|
| + // the unregistration later.
|
| + return;
|
| + }
|
| +}
|
| +
|
| +chrome.gcm.unregister(unregisterCallback);
|
| +</code></pre>
|
| +
|
| +<p>Your app or extension is automatically unregistered from the GCM service when a
|
| +user uninstalls it.</p>
|
| +
|
| +<h3 id="receive_messages">Receive messages</h3>
|
| +
|
| +<p>When your server wants to send a message to the user, it needs to connect to a
|
| +GCM connection server in one of two ways as described in the Android
|
| +<a href="http://developer.android.com/google/gcm/server.html">Implementing GCM Server</a>
|
| +document. The message specifies all of the registration IDs that are related to
|
| +that user. When the GCM server receives the message, it routes the message to
|
| +all instances of Chrome running apps or extensions with one of the registration
|
| +IDs. If your app or extension has been installed in more than one profiles in a
|
| +single Chrome instance, all of them can receive messages independently based on
|
| +their unique registration IDs.</p>
|
| +
|
| +<p>Messages from the server are delivered via the $(ref:gcm.onMessage) event. Your app
|
| +or extension must register a handler to receive this event.</p>
|
| +
|
| +<pre data-filename="background.js"><code>
|
| +chrome.gcm.onMessage.addListener(function(message) {
|
| + // A message is an object with a data property that
|
| + // consists of key-value pairs.
|
| +});
|
| +</code></pre>
|
| +
|
| +<p>As long as Chrome is running, even if the extension or app is not running, it is
|
| +woken up to deliver a message.</p>
|
| +
|
| +<h3 id="send_messages">Send messages</h3>
|
| +
|
| +<p>In addition to delivering push messages from your server to the client, the GCM
|
| +supports sending upstream messages from the client to your server. Your server
|
| +should be set up to connect to GCM Cloud Connection Server as described in the
|
| +Android <a href="http://developer.android.com/google/gcm/ccs.html">GCM Cloud Connection
|
| +Server</a> document.</p>
|
| +
|
| +<p>To send messages upstream, your app or extension should call $(ref:gcm.send) with an
|
| +object containing:</p>
|
| +
|
| +<ul>
|
| +<li>Message ID that identifies the message when it fails to be queued or
|
| +delivered. The message ID can be any kind of string. However, it is
|
| +recommended to stay unique across the lifetime of your app or extension, even
|
| +after it restarts. If you use the same message ID, there may be a chance that
|
| +the previous message gets overridden. If an auto-increment counter is used to
|
| +create the message ID, your app or extension should persist the counter value
|
| +via <a href="storage.html">chrome.storage</a> API and restore it when the app
|
| +reloads.</li>
|
| +<li>Destination ID that identifies the server. This is the project number from the
|
| +<a href="https://cloud.google.com/console/project">Google Developers Console</a> plus the
|
| +suffix "@gcm.googleapis.com".</li>
|
| +<li>Data that consist of a list of string-to-string key value pairs (up to 4KB
|
| +total).</li>
|
| +<li>Time-to-live (TTL, optional). This property value must be a duration from 0 to
|
| +86,400 seconds (1 day) and it corresponds to the maximum period of time for
|
| +which GCM will store and try to deliver the message. If this property is not
|
| +set, it is default to the maximum value. When a TTL is set to 0, GCM will try
|
| +to deliver the message immediately. If the immediate effort fails, the message
|
| +will be discarded.</li>
|
| +</ul>
|
| +
|
| +<p>When the callback passed in $(ref:gcm.send) is called without runtime error, it does
|
| +not mean that the message was already delivered to the GCM server. Rather, it
|
| +means that it was queued for delivery. Your app or extension should check and
|
| +handle <code>chrome.runtime.lastError</code>. Please refer to <a href="#error_reference">Error
|
| +reference</a> for possible error codes that could be
|
| +returned.</p>
|
| +
|
| +<p>If the message fails to reach the destination within the specified TTL period,
|
| +for example due to network error, the $(ref:gcm.onSendError) will be fired. Your app
|
| +or extension can listen to this event and react to it, e.g. by trying to resend
|
| +the message. Please refer to <a href="#error_reference">Error reference</a> for
|
| +possible error codes that could be returned.</p>
|
| +
|
| +<pre data-filename="background.js"><code>
|
| +// Substitute your own sender ID here. This is the project
|
| +// number you got from the Google Developers Console.
|
| +var senderId = "Your-Sender-ID";
|
| +
|
| +// Make the message ID unique across the lifetime of your app.
|
| +// One way to achieve this is to use the auto-increment counter
|
| +// that is persisted to local storage.
|
| +
|
| +// Message ID is saved to and restored from local storage.
|
| +var messageId = 0;
|
| +chrome.storage.local.get("messageId", function(result) {
|
| + if (chrome.runtime.lastError)
|
| + return;
|
| + messageId = parseInt(result["messageId"]);
|
| + if (isNaN(messageId))
|
| + messageId = 0;
|
| +});
|
| +
|
| +// Sets up an event listener for send error.
|
| +chrome.gcm.onSendError.addListener(sendError);
|
| +
|
| +// Returns a new ID to identify the message.
|
| +function getMessageId() {
|
| + messageId++;
|
| + chrome.storage.local.set({messageId: messageId});
|
| + return messageId.toString();
|
| +}
|
| +
|
| +function sendMessage() {
|
| + var message = {
|
| + messageId: getMessageId(),
|
| + destinationId: senderId + "@gcm.googleapis.com",
|
| + timeToLive: 86400, // 1 day
|
| + data: {
|
| + "key1": "value1",
|
| + "key2": "value2"
|
| + }
|
| + };
|
| + chrome.gcm.send(message, function(messageId) {
|
| + if (chrome.runtime.lastError) {
|
| + // Some error occurred. Fail gracefully or try to send
|
| + // again.
|
| + return;
|
| + }
|
| +
|
| + // The message has been accepted for delivery. If the message
|
| + // can not reach the destination, onSendError event will be
|
| + // fired.
|
| + });
|
| +}
|
| +
|
| +function sendError(error) {
|
| + console.log("Message " + error.messageId +
|
| + " failed to be sent: " + error.errorMessage);
|
| +</code></pre>
|
| +
|
| +<blockquote>
|
| + <p>}</p>
|
| +</blockquote>
|
| +
|
| +<h2 id="advanced_topics">Advanced Topics</h2>
|
| +
|
| +<h3 id="messages_deleted_event">Messages deleted event</h3>
|
| +
|
| +<p>GCM will store up to 100 non-collapsible messages that are sent from your server
|
| +to your client. After that, all messages are discarded from GCM, and an event
|
| +$(ref:gcm.onMessagesDeleted) will be fired, which tells the client that it falls
|
| +behind. Your app or extension should respond by syncing with your application
|
| +server to recover the discarded messages.</p>
|
| +
|
| +<pre data-filename="background.js"><code>
|
| +chrome.gcm.onMessagesDeleted.addListener(messagesDeleted);
|
| +
|
| +function messagesDeleted() {
|
| + // All messages have been discarded from GCM. Sync with
|
| + // your application server to recover from the situation.
|
| +}
|
| +</code></pre>
|
| +
|
| +<h3 id="collapsible_messages">Collapsible messages</h3>
|
| +
|
| +<p>GCM messages are often a tickle, telling the app or extension to contact the
|
| +server for fresh data. In GCM, it's possible to create collapsible messages for
|
| +this situation, wherein new messages replace older ones. When a collapse key is
|
| +provided and multiple messages are queued up in the GCM servers for the same
|
| +user, only the last one with any given collapse key is delivered to your app or
|
| +extension. As a result the <code>message</code> object passed to the $(ref:gcm.onMessage) event
|
| +will contain a <code>collapseKey</code>field. For more details about sending collapsible
|
| +messages, please refer to the Android <a href="http://developer.android.com/google/gcm/adv.html#collapsible">GCM Advanced
|
| +Topics</a> document.</p>
|
| +
|
| +<h3 id="implement_gcm_server">Implement GCM Server</h3>
|
| +
|
| +<p>Currently GCM provides two connection servers: <a href="http://developer.android.com/google/gcm/http.html">GCM HTTP Connection
|
| +Server</a> and <a href="http://developer.android.com/google/gcm/ccs.html">GCM Cloud
|
| +Connection Server (XMPP)</a>. You
|
| +can use them separately or in tandem. Please refer to the Android <a href="http://developer.android.com/google/gcm/server.html">Implementing
|
| +GCM Server</a> for details.</p>
|
| +
|
| +<h2 id="error_reference">Error reference</h2>
|
| +
|
| +<p>An error could occur when a gcm API function is called. Your app or extension
|
| +should check <code>chrome.runtime.lastError</code> for more information in your callback.
|
| +The error code will also be passed as a parameter to $(ref:gcm.onSendError) event.</p>
|
| +
|
| +<p>Here's a brief summary of the gcm errors:</p>
|
| +
|
| +<ul>
|
| +<li><strong>Function was called with invalid parameters</strong>: this could happen when gcm
|
| +functions are called with bad parameters.</li>
|
| +<li><strong>Profile was not signed in</strong>: this could happen when gcm functions are called
|
| +from a profile that was not signed in.</li>
|
| +<li><strong>Asynchronous operation is pending</strong>: this could happen when certain gcm
|
| +function is called again without waiting for the callback passed in previous
|
| +function to be called.</li>
|
| +<li><strong>Network error occurred</strong>: this could happen when GCM server fails to reach
|
| +due to network problem, like losing Internet connection.</li>
|
| +<li><strong>Server error occurred</strong>: this could happen when GCM server fails to reach
|
| +due to server problem, like server busy.</li>
|
| +<li><strong>Time-to-live exceeded</strong>: this could happen when a message could not be
|
| +delivered within the specific time-to-live period.</li>
|
| +<li><strong>Unknown error occurred</strong>: this could happen due to any other internal
|
| +errors.</li>
|
| +</ul>
|
| +
|
| +<h2 id="feedback">Feedback</h2>
|
| +
|
| +<p>You can provide feedback about Google Cloud Messaging and the
|
| +<a href="gcm.html">chrome.gcm</a> API through the Google Group <a href="https://groups.google.com/forum/#!forum/gcm-for-chrome-feedback">GCM for Chrome
|
| +Feedback</a>. Use
|
| +this group to ask for help, file bug reports, and request features.</p>
|
|
|