3
0

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 5 years have passed since last update.

HMSのプッシュ通知の実装説明(Android側)

Last updated at Posted at 2020-09-27

HMSのプッシュ通知の概要

プッシュ通知を一言で説明すると、サーバー側(たとえば企業側)がクライアント側(たとえばユーザー側)に通知を送るためのサービスです。
(実際、相手のプッシュトークンさえ分かれば、クライアント側からHMSのプッシュサーバー経由で相手のクライアントへプッシュ通知を送ることもできるのですが、話がややこしくなるので、ここではあくまでサーバー側からクライアント側へ送るプッシュ通知にのみ焦点を当てます。)

トークン

プッシュ通知を利用するのに、まず理解しなければならないのはトークンという概念です。プッシュ通知には2種類のトークンがあります。

  • プッシュトークン(Push Token)
  • アクセストークン(Access Token)

プッシュトークン

クライアントを特定するためのユニークな番号です。クライアント側がサーバー側にプッシュトークン発行を要求し、サーバー側がプッシュトークンをクライアント側に返します。また、サーバー側がクライアント側にプッシュ通知を送るときに、プッシュトークンを使ってクライアントを特定し、プッシュ通知を送ります。プッシュトークンはクライアント側もサーバー側も使います。

アクセストークン

サーバー側がクライアント側にプッシュ通知を送るために必要な鍵です。この鍵を持って、特定なプッシュトークン(クライアント)向けにプッシュ通知を送ります。アクセストークンはサーバー側のみ使います。

プッシュ通知の動作の流れ

オフィシャルサイトの説明によると、プッシュ通知の流れは次の図に示すようになります。
HMSプッシュ通知説明

STEP 1:
クライアントがHmsInstanceIdのgetToken()を呼び出し、プッシュサーバーにプッシュトークンを要求します。

STEP 2:
プッシュサーバーがクライアントにプッシュトークンを返します。

STEP 3:
クライアントが自分のプッシュトークンを自分のサービスのサーバー(アプリサーバー)に送ります。

STEP 4:
アプリサーバーがプッシュサーバーにプッシュ通知を送ります。
(ここではさらに2ステップに分けることができますが、次章(HMSのプッシュ通知の実装説明(サーバー側))で詳細を説明します)

STEP 5:
プッシュサーバーがアプリサーバーから受け取ったプッシュ通知をクライアントに転送します。

STEP 6:
クライアントがプッシュ通知を受け取った結果をプッシュサーバーに知らせます。

STEP 7:
プッシュサーバーをその結果をアプリサーバーに転送します。

実装について

実装が必要なステップは4つしかありません。Android側に3ステップとサーバー側に1ステップです。

ステップ 実装場所 関わるトークン
STEP 1 Android プッシュトークン
STEP 2 Android プッシュトークン
STEP 3 Android プッシュトークン
STEP 4 サーバー アクセストークン、プッシュトークン
STEP 5 プッシュトークン
STEP 6
STEP 7

Android側の実装

AppGallery Connectでプッシュサービスを開通

  1. AppGallery Connectに入って、[My projects]を選びます。
  2. リストから対象アプリに切り替えます。
  3. [Growing] -> [Push Kit]に入って、Push Kitを有効にします。
    HMSプッシュ通知開通

HMS SDKの導入

  1. agconnect-services.jsonをプロジェクト内に配置します。
  2. プロジェクトのbuild.gradleにSDKを追加します。
  3. モジュールのbuild.gradleにSDKを追加します。
  4. AndroidManifest.xmlにサービスを追加します。
AndroidManifest.xml
<service
    android:name=".DemoHmsMessageService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.huawei.push.action.MESSAGING_EVENT"/>
    </intent-filter>
</service>

詳細はこちらのオフィシャルサイトをご参照ください。
https://developer.huawei.com/consumer/jp/doc/development/HMSCore-Guides/android-integrating-sdk-0000001050040084

ソースコード

ステップ1~ステップ3のソースコードは次のようになります。

GetTokenClass.kt
Single.create<String>{ emitter ->
    // ステップ1+ステップ2
    val token = HmsInstanceId.getInstance(context).getToken(appId, "HCM")

    // 空のトークンが返ってくる可能性があるので、しっかりチェックしましょう
    if (token.isNotEmpty()) {
        emitter.onSuccess(token)
    } else {
        emitter.onError(Exception("Token is empty"))
    }
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ token ->
    // ステップ3:トークンをサーバーに送ります。
    // サーバーにトークンを送らないと、サーバーがこちらにプッシュ通知が送れません。
},{
    // エラー処理
})

オフィシャルサイトによると、getTokenを呼び出しても、空のトークンが返ってくる可能性があるので、HmsMessageServiceを継承し、onNewTokenをオーバーライドしなければなりません。

YourHmsMessageService.kt
class MainService: HmsMessageService() {
    // ステップ2
    override fun onNewToken(token: String?) {
        // ステップ3:トークンをサーバーに送ります。
        // サーバーにトークンを送らないと、サーバーがこちらにプッシュ通知が送れません。
    }
}

サーバー側の実装

こちらのページをご覧ください。
https://qiita.com/Rei_2020/items/a35ce101599e651ba3ac

まとめ

プッシュ通知の実装が難しそうに見えますが、実際にやってみたら案外簡単です。トークンの概念をしっかり理解すれば、全体像がすぐ把握できると思います。

参考

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?