如何使用Python创建服务器以使用GCM向Android设备发送推送通知
介绍
推送通知让您的 Android 应用程序通知用户事件,即使用户没有使用您的应用程序。 本教程的目标是向您的应用程序发送一个简单的推送通知。 我们将在服务器上使用 Ubuntu 14.04 和 Python 2.7,并使用 Google Cloud Messaging 作为推送通知服务。
我们将使用术语 server 来指代使用 DigitalOcean 启动的实例。 我们将使用 GCM 来指代 Google 的服务器,它位于 Android 设备和您的服务器之间。
先决条件
在开始本教程之前,您将需要这些东西:
- 一个Android应用; 参见 developer.android.com
- 一个Ubuntu 14.04 Droplet
- 您的 Droplet 的 IP 地址
关于推送通知
Google 提供的 GCM 连接服务器从第三方应用程序服务器(例如您的 Droplet)获取消息,并将这些消息发送到设备上运行的支持 GCM 的 Android 应用程序(客户端应用程序)。 目前,Google 为 HTTP 和 XMPP 提供连接服务器。
换句话说,您需要自己的服务器与 Google 的服务器通信才能发送通知。 您的服务器将消息发送到 GCM(Google 云消息传递)连接服务器,然后连接服务器将消息排队并存储,然后在设备在线时将其发送到 Android 设备。
第一步——创建一个 Google API 项目
我们需要创建一个 Google API 项目来为我们的应用启用 GCM。
访问 Google 开发者控制台。
如果您从未在那里创建过开发者帐户,则可能需要填写一些详细信息。
单击创建项目。
输入项目名称,然后单击创建。
等待几秒钟以创建新项目。 然后,在项目页面的左上角查看您的项目ID和项目编号。
记下 项目编号 。 您将在您的 Android 应用程序客户端中使用它。
第二步 - 为您的项目启用 GCM
确保您的项目仍然在 Google Developers Console 中被选中。
在左侧边栏中,选择 API 和身份验证 .
选择 API。
在显示的 API 列表中,将 Google Cloud Messaging for Android 切换到 ON。 接受服务条款。
Google Cloud Messaging for Android 现在应该在此项目的启用 API 列表中。
在左侧边栏中,选择 API 和身份验证 .
选择 凭据。
在公共API访问下,点击新建密钥。
选择服务器密钥。
输入您的服务器的 IP 地址。
单击创建。
复制 API KEY。 稍后您需要在服务器上输入此内容。
第三步——链接安卓应用
为了测试通知,我们需要将我们的 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 项目中的 Project Number。
每次设备向 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
将以下信息添加到文件中。 替换 red 中标记的变量。 解释如下。
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 Cloud Messaging 的 Python 客户端gcm
:从 Google API 项目中添加您的 API KEY; 确保您的服务器的 IP 地址在允许的 IP 中reg_id
:从您的 Android 应用程序中添加您的 regid
第六步——发送推送通知
运行以下命令向您的应用发送测试通知:
sudo python ~/test_push.py
等待大约 10 秒钟。 您应该会在您的 Android 设备上收到通知。
故障排除。
如果通知在大约 10 秒后没有出现在您的设备上 not,请按照以下步骤操作:
- 您的智能手机/平板电脑是否已连接到互联网?
- 你有正确的项目密钥吗?
- 您是否从应用程序中获得了正确的 regid?
- 是否为 Google API 服务器密钥添加了服务器的 IP 地址?
- 服务器是否连接到互联网?
如果您仍然没有收到通知,则可能是该应用程序。 检查 logcat 是否有一些错误。
从这往哪儿走
完成此简单测试后,您可能希望将通知发送给所有用户。 请记住,您必须以 1000 个为一组发送它们。 此外,如果 CGM 以“无效 ID”响应,您必须将其从数据库中删除。
您可以调整本教程中的示例以使用您自己的 Android 应用程序。