6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonサーバからAndroidにpush通知する

Last updated at Posted at 2020-05-06

記事の趣旨

前の記事でとりあえずpush通知のひな形は作れたと思うので,今度はその通知をFirebaseコンソールではなく,自分のサーバを起点として発出してみようという記事.

サーバはAWS上に立てたCentOS7を使用する.使用言語は何でも良いと思うがとりあえずPython3.7を選択.Pythonおよびpipは既にインストールされている前提とする.

1. 通知メッセージの送信手順

通知だけでなく,そこで送った情報をトリガとしてクライアント側に色々やらせたいところだが,まずはその辺りは抜きにして,シンプルに通知だけを送ることを目指す.

1.1 Firebase Admin SDKの追加

Firebase Admin SDKとは,サーバとFirebaseとの対話を仲介してくれるツールという理解で良いと思う.今回は使用言語としてPythonを選択しているので,Firebase Admin Python SDKをインストールすることになる.これをこちらの手順に則って実行する.pipが入っているのなら,以下の1コマンドを実行するだけで良い.今回はバージョン4.2.0がインストールされた.

pip install firebase-admin

1.2 送信リクエストの承認

リファレンスはこちらだが,注釈として「送信リクエストの承認が必要」である旨が記載されているので,先にこちらの手順を確認する.

いくつかのパターンが記載されているが,今回はAWSに立てたサーバからリクエストを発出するので,Firebase プロジェクトからサービス アカウントの JSON ファイルをダウンロードするに該当する.手順的には上記ページの認証情報を手動で提供するが該当する.

特に詰まるところは無いと思う,ファイルをダウンロードして環境変数をセットするだけ.今回はAdmin SDKを用いるので,「認証情報を使用してアクセス トークンを作成する」以降の手順は実施しなくて良い.

1.3 お試し送信

改めてこちらに戻る.送信用のサンプルを流用してお試し送信を実施.コードは以下のとおり.

import firebase_admin
from firebase_admin import messaging

default_app = firebase_admin.initialize_app()

# This registration token comes from the client FCM SDKs.
registration_token = 'デバイストークン'

myNotification = messaging.Notification(title='Test', body='Hello, FCM from My Phthon Server!')

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    token=registration_token,
    notification=myNotification
)

# Send a message to the device corresponding to the provided
# registration token.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

基本的にサンプルスクリプトそのままだが,主に以下を変更している.

  • 「SDKを初期化せよ」というエラーメッセージ対応のためにこちらの初期化処理をコピペ.
  • デバイストークンを何かしらの形でサーバ側に渡す必要があるので,今回は愚直に以下で対応.
    • クライアント側にeditTextビューを用意しておき,そこにトークンを貼付しておく
    • それをコピペしてテキストファイルを作成
    • テキストファイルをサーバ側へ持ってきて,コード上の'デバイストークン'の部分に直書き
  • サンプルのままだと何も表示されず寂しいので,notificationを追加.
    • 「インスタンスとして渡せ」と怒られるので,myNotificationにインスタンスを代入して渡す形とした.
  • dataは今回全く使用していないが,害はない認識なのでとりあえず放置.

なお,firebase_admin.messagingの仕様はこちらにまとめられているので適宜参照すること.

このpythonスクリプトを実行したところ,ちょっと間を置いて,無事図1のようなpush通知がAndroid端末に届いた.

notification2.png
図1:サーバから発出されたPush通知

とりあえずこれで自作サーバ側からキックする処理は実装できたことになる.

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?