ウェブサイト検索

Pythonを使用してAndroidデバイスにGCMでプッシュ通知を送信するサーバーを作成する方法


紹介

プッシュ通知は、ユーザーがアプリを使用していないときでも、イベントについてAndroidアプリケーションがユーザーに通知できるようにします。このチュートリアルの目的は、アプリにシンプルなプッシュ通知を送信することです。サーバーにはUbuntu 14.04とPython 2.7を使用し、プッシュ通知サービスにはGoogle Cloud Messagingを使用します。

私たちは サーバー という用語を、DigitalOceanで立ち上げられたインスタンスを指すために使用します。GCM は、Androidデバイスとあなたのサーバーの間にあるGoogleのサーバーを指すために使用します。

前提条件

チュートリアルを始める前にこれらのものが必要です:

  • Androidアプリケーション; developer.android.comを参照してください
  • Ubuntu 14.04 ドロップレット
  • あなたのドロップレットのIPアドレス

プッシュ通知について

Googleが提供するGCM接続サーバーは、あなたのDropletのようなサードパーティアプリケーションサーバーからメッセージを受け取り、これらのメッセージをデバイス上で動作しているGCM対応のAndroidアプリケーション(クライアントアプリ)に送信します。現在、GoogleはHTTPおよびXMPP用の接続サーバーを提供しています。

言い換えれば、通知を送信するためには、自分のサーバーが必要です。そのサーバーは、Googleのサーバーと通信するためのものであり、サーバーはGCM(Google Cloud Messaging)接続サーバーにメッセージを送ります。その接続サーバーはメッセージをキューに入れて保存し、デバイスがオンラインのときにAndroidデバイスに送信します。

ステップ1 — Google APIプロジェクトを作成する

私たちはアプリのためにGCMを有効にするGoogle APIプロジェクトを作成する必要があります。

Google Developers Consoleを訪れてください。

もしそこで開発者アカウントを作成したことがない場合は、いくつかの詳細を入力する必要があるかもしれません。

プロジェクトを作成をクリックしてください。

プロジェクト名を入力し、次に作成をクリックしてください。

新しいプロジェクトが作成されるまで数秒待ってください。その後、プロジェクトページの左上にあるプロジェクトIDとプロジェクト番号を表示します。

プロジェクト番号をメモしておいてください。これをあなたのAndroidアプリクライアントで使用します。

ステップ2 - プロジェクトのためにGCMを有効にする

Google Developers Consoleでプロジェクトがまだ選択されていることを確認してください。

左のサイドバーで、APIと認証を選択します。

APIを選択してください。

表示されたAPIのリストで、Android用Google Cloud MessagingのトグルをONに切り替えます。サービス利用規約に同意してください。

Android用Google Cloud Messagingは、このプロジェクトの有効化されたAPIのリストに今あるべきです。

左のサイドバーで、APIと認証を選択します。

資格を選択してください。

「公共APIアクセス」の下で、「新しいキーを作成」をクリックします。

サーバーキーを選択してください。

サーバーのIPアドレスを入力してください。

作成をクリックします。

APIキーをコピーしてください。後でサーバーに入力する必要があります。

ステップ3 — Androidアプリをリンクする

通知をテストするために、私たちは作成したGoogle APIプロジェクトにAndroidアプリをリンクする必要があります。

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/==========================﹕ =======================================

ステップ4 — ドロップレットを展開する

Ubuntu 14.04 サーバーを新たに展開します。これは私たちのサードパーティアプリケーションサーバーとして必要です。

GoogleのGCM接続サーバーは、サードパーティのアプリケーションサーバー(私たちのDroplet)からメッセージを受け取り、Androidデバイス上のアプリケーションに送信します。GoogleはHTTPとCCS(XMPP)のための接続サーバーを提供していますが、今回はこのチュートリアルのためにHTTPに焦点を当てています。HTTPサーバーはダウンストリーム専用です:クラウドからデバイスへ。これは、サーバーからデバイスにのみメッセージを送信できることを意味します。

私たちのサーバーの役割:

  • クライアントとコミュニケーションを取る
  • GCMサーバーに適切にフォーマットされたリクエストを発信します。
  • 要求を処理し、必要に応じて再送信し、指数バックオフを使用します。
  • APIキーとクライアント登録IDを保存します。APIキーは、メッセージを送信するPOSTリクエストのヘッダーに含まれています。
  • 各メッセージを一意に識別するためのメッセージIDを生成します。メッセージIDは送信者IDごとに一意である必要があります。

クライアントは、デバイスの登録IDを送信してあなたのサーバーと通信し、それを保存して通知を送信する際に使用します。管理について心配しないでください。非常に簡単で、GCMは無効な登録IDの場合にエラーメッセージを提供することであなたを助けます。

ステップ5 - 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("GOOGLE_API_KEY")
data = {'the_message': 'You have x new friends', 'param2': 'value2'}

reg_id = 'APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UxxxqpL4EUXTWOm0RXE5CrpMk'

gcm.plaintext_request(registration_id=reg_id, data=data)

説明:

  • このコードは、Android用のGoogle Cloud MessagingのPythonクライアントをインポートします。
  • gcm: Google APIプロジェクトからのAPI KEYを追加してください; サーバーのIPアドレスが許可されたIPに含まれていることを確認してください
  • reg_id: あなたのAndroidアプリケーションからregidを追加してください

ステップ6 — プッシュ通知を送信する

このコマンドを実行して、アプリにテスト通知を送信します:

sudo python ~/test_push.py

約10秒待ってください。あなたのAndroidデバイスに通知が届くはずです。

トラブルシューティング。

通知が約10秒後にデバイスに表示されない場合、次の手順に従ってください:

  • あなたのスマートフォン/タブレットはインターネットに接続されていますか?
  • 正しいプロジェクトキーはありますか?
  • アプリから正しいレジッドを持っていますか?
  • あなたのサーバーのIPアドレスはGoogle APIサーバーキーに追加されていますか?
  • サーバーはインターネットに接続されていますか?

通知がまだ届かない場合、おそらくアプリに問題があります。エラーログを確認してください。

ここからどこへ行くか

この簡単なテストを終えたら、すべてのユーザーに通知を送信したくなるでしょう。通知は1000件ずつ送信する必要があることを忘れないでください。また、CGMが「無効なID」と応答した場合は、それをデータベースから削除しなければなりません。

このチュートリアルの例を自分のAndroidアプリケーションで動作するように適応できます。

関連記事: