简介
推送通知可以让您的 Android 应用在用户不使用应用时通知用户发生的事件。本教程的目标是向您的应用发送一个简单的推送通知。我们将在服务器上使用 Ubuntu 14.04 和 Python 2.7,以及 Google Cloud Messaging 作为推送通知服务。
我们将使用术语 服务器 来指代在 DigitalOcean 上创建的实例。我们将使用 GCM 来指代 Google 的服务器,即位于 Android 设备和您的服务器之间的服务器。
先决条件
在开始本教程之前,您需要准备以下内容:
- 一个 Android 应用;请参阅 developer.android.com
- 一个 Ubuntu 14.04 Droplet
- 您的 Droplet 的 IP 地址
关于推送通知
由 Google 提供的 GCM 连接服务器从第三方应用服务器(例如您的 Droplet)接收消息,并将这些消息发送到运行在设备上的支持 GCM 的 Android 应用(客户端应用)。目前,Google 提供了 HTTP 和 XMPP 的连接服务器。
!GCM 连接服务器在第三方服务器和客户端应用之间发送数据。
换句话说,您需要自己的服务器与 Google 的服务器通信,以便发送通知。您的服务器将消息发送到 GCM(Google Cloud Messaging)连接服务器,然后连接服务器将排队并存储消息,然后在设备在线时将其发送到 Android 设备。
步骤一 — 创建 Google API 项目
我们需要创建一个 Google API 项目,以启用我们应用的 GCM。
访问 Google Developers 控制台。
如果您以前没有在那里创建开发者帐户,您可能需要填写一些详细信息。
点击 创建项目。
输入项目名称,然后点击 创建。
!新的 Google API 项目
等待几秒钟,直到新项目被创建。然后,在项目页面的左上角查看您的 项目 ID 和 项目编号。
!项目 ID 和编号
记下 项目编号。您将在 Android 应用客户端中使用它。
步骤二 - 为您的项目启用 GCM
确保您的项目仍然在 Google Developers 控制台中被选中。
在左侧的侧边栏中,选择 API 和身份验证。
选择 API。
在显示的 API 列表中,将 Google 云消息传递(Google Cloud Messaging for Android)的切换按钮设置为 开。接受服务条款。
Google 云消息传递(Google Cloud Messaging for Android) 现在应该在此项目的已启用 API 列表中。
!已启用 Google 云消息传递(Google Cloud Messaging for Android)
在左侧的侧边栏中,选择 API 和身份验证。
选择 凭据。
在 公共 API 访问 下,点击 创建新密钥。
选择 服务器密钥。
输入您服务器的 IP 地址。
!服务器密钥 IP
点击 创建。
复制 API 密钥。您稍后需要在服务器上输入它。
!API 密钥
步骤三 — 链接 Android 应用
为了测试通知,我们需要将我们的 Android 应用链接到我们创建的 Google API 项目。
如果您是 Android 应用开发的新手,您可能希望按照实施 GCM 客户端的官方指南进行操作。
您可以从 gcm 页面获取官方源代码。
请注意,这些源代码不是最新的,因此您需要修改 Gradle 文件:
gcm-client/GcmClient/build.gradle
旧行:
compile "com.google.android.gms:play-services:4.0.+"
更新后的行:
compile "com.google.android.gms:play-services:5.0.89+"
在主活动中,找到这一行:
String SENDER_ID = "YOUR_PROJECT_NUMBER_HERE";
将其替换为您的 Google API 项目的 项目编号。
每次设备注册到 GCM 时,它都会收到一个注册 ID。我们需要这个注册 ID 来测试服务器。为了轻松获取它,只需修改主文件中的这些行:
if (regid.isEmpty()) { registerInBackground(); }else{ Log.e("==========================","========================="); Log.e("regid",regid); Log.e("==========================","========================="); }
运行应用后,查看 logcat 并复制您的 regid 以备后用。它看起来像这样:
======================================= 10-04 17:21:07.102 7550-7550/com.pushnotificationsapp.app E/==========================﹕ APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UJY0KNqpL4EUXTWOm0RxccxpMk 10-04 17:21:07.102 7550-7550/com.pushnotificationsapp.app E/==========================﹕ =======================================
第四步 — 部署一个 Droplet
部署一个全新的 Ubuntu 14.04 服务器。我们需要这个服务器作为我们的第三方应用服务器。
Google 的 GCM 连接服务器接收来自第三方应用服务器(我们的 Droplet)的消息,并将其发送到 Android 设备上的应用程序。虽然 Google 提供了 HTTP 和 CCS(XMPP)的连接服务器,但在本教程中我们专注于 HTTP。HTTP 服务器只能进行下行通信:从云到设备。这意味着你只能从服务器向设备发送消息。
我们的服务器的角色:
- 与你的客户端进行通信
- 向 GCM 服务器发送格式正确的请求
- 处理请求并根据需要重新发送,使用指数级退避
- 存储 API 密钥和客户端注册 ID。API 密钥包含在发送消息的 POST 请求的标头中
- 生成消息 ID 以唯一标识发送的每条消息。消息 ID 应该对每个发送者 ID 是唯一的
客户端将通过发送设备的注册 ID 与你的服务器进行通信,以便你在发送通知时存储并使用它。现在不用担心管理它;这很简单,而且 GCM 会通过在注册 ID 无效的情况下给你提供错误消息来帮助你。
第五步 — 设置 Python GCM 简单服务器
使用 sudo 用户登录到你的服务器。
更新你的软件包列表:
sudo apt-get update
安装 Python 软件包:
sudo apt-get install python-pip python-dev build-essential
安装 python-gcm
。在这里了解更多关于 python-gcm 的信息。
sudo pip install python-gcm
在服务器的某个位置创建一个新的 Python 文件。比如说:
sudo nano ~/test_push.py
将以下信息添加到文件中。替换标记为红色的变量。下面有解释。
from gcm import * gcm = GCM("AIzaSyDejSxmynqJzzBdyrCS-IqMhp0BxiGWL1M") data = {'the_message': 'You have x new friends', 'param2': 'value2'} reg_id = 'APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UxxxqpL4EUXTWOm0RXE5CrpMk' gcm.plaintext_request(registration_id=reg_id, data=data)
解释:
from gcm import *
:这导入了用于 Android 的 Google 云消息传递的 Python 客户端gcm
:添加你的 API 密钥 来自 Google API 项目;确保你的服务器 IP 地址在允许的 IP 中reg_id
:添加你的 regid 来自你的 Android 应用
第六步 — 发送推送通知
运行以下命令向你的应用程序发送一个测试通知:
sudo python ~/test_push.py
等待大约 10 秒。你应该会在你的 Android 设备上收到一个通知。
!推送通知示例
故障排除
如果大约 10 秒后通知没有出现在你的设备上,请按照以下步骤操作:
- 你的智能手机/平板电脑是否连接到互联网?
- 你是否有正确的项目密钥?
- 你是否有来自应用的正确的 regid?
- 你的服务器的 IP 地址是否添加到 Google API 服务器密钥?
- 服务器是否连接到互联网?
如果你仍然没有收到通知,那可能是应用的问题。检查 logcat 是否有一些错误。
下一步该怎么办
一旦你完成了这个简单的测试,你可能会想向所有用户发送通知。记住,你必须以 1000 个为一组发送它们。另外,如果 GCM 响应“无效 ID”,你必须从数据库中删除它。
你可以根据本教程中的示例来适应你自己的 Android 应用。