Firebaseのプッシュ通知をAndroidに送信する方法
Published: 2024-03-12 22:13:40

モバイルアプリケーションを構築するとき、アラートやプッシュ通知でユーザーに通知する必要の**ない**ユースケースを考えるのは難しい。

先に進む前に、AndoridとiOSの両方でプッシュ通知専用の[デモと](https://www.pubnub.com/demos/push/) [チュートリアルが](https://www.pubnub.com/tutorials/mobile-push-notifications/)あります。

例えば、以下のシナリオを考えてみましょう：あなたは、[試合中に重要なニュースをユーザーに提供](https://www.pubnub.com/solutions/live-audience-engagement/)するリアルタイムのスポーツアプリケーションを開発しています。 アプリの重要な機能は、お気に入りのチームが得点するとすぐにユーザーに信頼性の高いモバイルプッシュ通知を送信することです。

各モバイルオペレーティングシステムは、ネイティブアプリケーションのプッシュ通知に独自のソリューションを提供しているため、アプリに統合するのが難しい場合があります。Androidでは、ネイティブアプリケーションがプッシュ通知に使用するメカニズムは[Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/)（FCM）通知です。[PubNubはFCMを一歩](https://pubnub.com/docs/messages/push/send)進め、Firebase Cloud Messaging通知の使用をPubNubリアルタイム通信プラットフォームに統合しました。

アプリがフォアグラウンドにあるとき、PubNubのチャネルはリアルタイムのデータストリームを提供する素晴らしい仕事をします。アプリがバックグラウンドにある場合、ユーザーが携帯電話をロックしている場合、そして特にユーザーがWiFiやLTE経由でインターネット接続に断続的にアクセスできる場合に厄介なケースが発生します。 このような厄介なケースに対処するための最も簡単な解決策は、Firebaseプッシュ通知を実装することです。

FCMを使用してAndroidにFirebaseプッシュ通知を送信する方法の概要
----------------------------------------

FCMはGoogleが提供する無料サービスで、ユーザーはFirebaseプッシュ通知を無料で確実に配信することができます。

[FCMを使ってアプリに2種類のメッセージを送ることが](https://support.pubnub.com/hc/en-us/articles/360051495472-Why-are-my-FCM-push-notifications-not-working-)できます：

-   **通知メッセージ**は、"ディスプレイメッセージ "と呼ばれることもあります。これらはFCM SDKによって自動的に処理されます。
-   **データメッセージ**は、クライアントアプリによって処理されます。
-   通知メッセージには、ユーザーから見えるキーの定義済みセットが含まれ、オプションのデータペイロードを含めることができます。
-   データメッセージには、ユーザー定義のカスタムキーと値のペアのみが含まれます。
-   両方のメッセージタイプの最大ペイロードは4KBです。

データ・メッセージ、通知メッセージ、またはその両方を送信することができますが、データ・メッセージのみを送信することは重要です。通知メッセージはFCMによって自動的に処理され、通知ペイロードが表示されます。

クライアントアプリの代わりにFirebaseに通知を表示させたい場合は通知メッセージを使用し、クライアントアプリでメッセージを処理したい場合はデータメッセージを使用します。オプションのデータペイロードを含む通知メッセージを送信すると、FCMが通知ペイロードの表示を処理し、クライアントアプリがデータペイロードを処理します。

FCMシステムは3者を考慮します：

-   クライアントアプリケーション。
-   GoogleのFCMサーバー（バックエンド）
-   サードパーティのプッシュサーバー

ユーザーがアプリケーションをインストールすると、FCMを有効にするためにアプリケーションを登録する必要があります。以下は、通知を送信するためのFCMワークフローです：

-   サードパーティのプッシュサーバーがGoogleのFCMサーバーにプッシュ通知を送信します。**これはPubNubが置き換え、簡素化できる部分です。**
-   これらのサーバーは登録されているすべてのモバイルアプリケーションにメッセージを中継します。
-   メッセージはオフラインのデバイスのために保存されます。
-   デバイスがオンラインに戻るとすぐに、FCMサーバーはキューに入れられたメッセージをリレーします。
-   メッセージはユーザーのデバイスで受信され、プラットフォーム固有の実装に従って表示されます。

PubNubを使ってAndroidにFirebaseプッシュ通知を送信する方法
---------------------------------------

PubNubリアルタイムメッセージングを使用している場合、すでにすべてのデバイスとリアルタイムで通信しています。しかし、Androidネイティブ体験のためにプッシュ通知を送信したい場合、FCMは大きな味方です。[![Mobile Push Notification Powered By PubNub](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf1/eceb4bfec526edd82b8c9324bfd21c81/poweredbypubnub_325.gif "Mobile Push Notification Powered By PubNub")](https://pubnub.com/products/mobile-push-notifications/)

もしあなたのアプリケーションが複数のプラットフォーム向けであれば、PubNubはApple Push Notification Service (APNs)とFirebaseをすぐにサポートするので、あなたの生活はより簡単になります。**まだ**複数のプラットフォームをサポートしていない場合でも、FCMのPubNubサポートを使用すると、Firebase通知だけでなくPubNubデータストリーム用の単一のライブラリセットを使用することで、コードを合理化できます。

PubNubはFCMと簡単に統合できる。PubNubチャネルは、これらの通知をGoogleのFCMサーバに送信するサードパーティサーバを置き換えます。登録されたどのエンドポイントでも、接続されたデバイスにプッシュ通知を送信させることができます。

これにより、アプリケーションは特定のチャネルに登録されたデバイスにプッシュ通知を短時間で送信できるようになります。これはGoogleのネイティブAndroid Notification APIとPubNubのリアルタイムデータストリームネットワークを組み合わせたものです。リアルタイムプッシュ通知はどのAndroidデバイスでもネイティブに理解できます。あなたのアプリケーションにすでにFCMがあり、PubNubの使用を検討している場合、あなたのアプリについてほとんど何かを変更する必要はありません、ほとんどの場合、コードを削除します！

スポーツニュースアプリのシナリオに戻ると、スポーツ評論家が自分の携帯電話からリアルタイムでスコアを送信し、他の視聴者のデバイスにプッシュ通知をトリガーすることができます。PubNubを使えば簡単です。PubNubによって自動スケーリングが管理されるため、運用するサーバーを追加する必要はありません！

Firebase Cloud Messaging (FCM)はGoogle Cloud Messaging (GCM)のリブランディングであり、PubNubで扱うのに機能的な違いはありません。GCMを参照する場合は代わりにFCMを使用する必要があります。

PubNubでFirebaseプッシュ通知を始める
-------------------------

完成したFirebaseプッシュ通知プロジェクトをダウンロードしたいですか？[https://github.com/PubNubDevelopers/Android-Push-Notifications](https://github.com/PubNubDevelopers/Android-Push-Notifications)

このチュートリアルでは、新しいAndroidアプリを作成し、firebaseプッシュ通知を設定し、PubNubモバイルプッシュ通知を有効にし、モバイルプッシュ通知を受信するために[PubNub Android SDKを](https://pubnub.com/docs/sdks/java/android/)設定します。まず、常に無料の [PubNubアカウントに](https://admin.pubnub.com/signup/?devrel_gh=android-push-notifications)サインアップする必要があります。サインアップしたら、新しいアプリを作成し、[PubNub管理ダッシュボードから](https://pubnub.com//admin.pubnub.com/signup)固有のPubNubキーを取得します。後で使えるように **Publishキーと** **Subscribe**キーを記録しておきましょう。

新しいAndroidアプリを作成する
------------------

FCMとPubNubで使用したいアプリがすでにある場合は、このセクションをスキップしてください。

[Java SE Development Kit（JDK 8またはnever](https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)）をインストールする。

[Android Studioをダウンロードしてインストール](https://developer.android.com/studio/index.html)します。

Android Studioへようこそ」ウィンドウで、「新しいAndroid Studioプロジェクトを開始する」をクリックする。

Application Name（アプリケーション名）、Company Domain（会社ドメイン）を設定し、プロジェクトの場所を変更することもできます。KotlinまたはFlutterアプリを作成する場合は、該当するチェックボックスをオンにします。パッケージ名は後で必要になるのでメモしておこう。他のオプションはそのままにしておく。Next "をクリックする。

[![Create New Android App](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf2/39e6d4ccae36799d6775028e5532dd8e/newapp-1024x749.png "Create New Android App")](https://developer.android.com/studio/index.html)

最小SDKを "API23: Android 6.0 (Mashmallow) "に設定します。次へ」をクリックします。

Empty Activity "を選択します。次へ」をクリックします。デフォルト値のまま、"Finish "をクリックします。

Firebase Cloud Messaging を追加してリアルタイム通知を構築する
-------------------------------------------

[Firebase](https://firebase.google.com/) アカウントを作成またはログインします。

[Firebase コンソールで](https://console.firebase.google.com/)"Add project" をクリックし、Firebase プロジェクトを作成します。

[![Add Project to Firebase](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf3/b51dd4a3613381c59feacb5e4d70911e/addproject.png "Add Project to Firebase")](https://console.firebase.google.com/)

プロジェクト名と場所を設定します。

[![Add a project to firebase ](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf4/9cb74ae2fc49d8e5626e2412f709aa3b/addaproject-907x1024.png "Add a project to firebase ")](https://console.firebase.google.com/)

その後、Androidアプリにfirebaseを追加します。

[![Add Firebase to App](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf5/45a880cdef449d6da23a28731da50105/addfirebasetoapp.png "Add Firebase to App")](https://console.firebase.google.com/)

アプリのパッケージ名とニックネームを入力します。アプリのパッケージ名は "android/app/src/main/java/com/\[YourAppName\]/MainApplication.java "の一番上にあります。SHA-1は省略してください（このチュートリアルでは必要ありません）。Register app "をクリックします。

google-services.jsonファイルをAndroidアプリモジュールのルートディレクトリにダウンロードします。Firebase SDKは追加しないでください。[Firebaseコンソールを](https://console.firebase.google.com/)スキップして、Firebase SDKとPubNub SDKをアプリに追加するためのこのチュートリアルの手順を続行します。

[![Download Config File For Android App](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf6/0f473a41a0b842d0a5c2f6c99788a495/download-config-file-for-android-app.png "Download Config File For Android App")](https://console.firebase.google.com/)

[PubNub管理ダッシュボードに](https://pubnub.com//admin.pubnub.com/signup?devrel_gh=android-push-notifications)移動し、アプリを選択し、キーセットを選択します。

Mobile Push Notifications "までスクロールダウンし、[Push Notificationsアドオンを有効に](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-)し（まだ有効になっていない場合）、[Firebaseコンソールで](https://console.firebase.google.com/)作成したアプリのAPIキーを入力します。APIキー（FirebaseコンソールではServer keyと表示される）は、左サイドバーの "Project Overview "に移動し、アプリのメトリクスの右上にあるkebobメニューボタン（**"⋮"**）をクリックし、"Settings "をクリックし、"Cloud Messaging "タブを選択することで見つけることができます。

firebaseモバイルプッシュ通知用にFCMとPubNubを設定する
-----------------------------------

プロジェクトレベルのbuild.gradle（<project>/build.gradle）ファイルを編集し、以下の行を追加します：

```js
buildscript {
  dependencies {
    // Add this line
    classpath 'com.google.gms:google-services:4.0.1'
  }
}
```

これを追加すると、プロジェクトの同期を促す黄色いメッセージが表示されます。今は無視してください。

アプリレベルのbuild.gradle（<project>/<app-module>/build.gradle）ファイルを編集し、以下を追加する：

```js
dependencies {
  // Add this line.
  implementation 'com.google.firebase:firebase-core:16.0.1'
  // Firebase Messaging library for sending push notifications. Add this line.
  implementation 'com.google.firebase:firebase-messaging:17.3.3'
  // PubNub Android SDK. Add this line.
  implementation group: 'com.pubnub', name: 'pubnub-gson', version: '4.20.0'
}
...
// Add to the bottom of the file
apply plugin: 'com.google.gms.google-services'
```

Android Studioに表示されるバーの "Sync now "をクリックする。

[![Android Studio Sync Message](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf7/66be78ce887d2c92161fa5fbb11f2554/android_studio_sync.png "Android Studio Sync Message")](https://console.firebase.google.com/)

MainActivity.javaファイルを編集してPubNub Android SDKを初期化します。また、プッシュ通知を表示するには、Android APIレベル26以上の通知チャネルを作成する必要があります。

```js
package com.pubnub.hellopush;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import com.pubnub.api.PNConfiguration;
import com.pubnub.api.PubNub;
public class MainActivity extends AppCompatActivity {
    public static PubNub pubnub; // PubNub instance
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initPubnub();
        createChannel();
    }
    // Creates PubNub instance with your PubNub credentials. https://admin.pubnub.com/signup
    // This instance will be used when we need to create connection to PubNub.
    private void initPubnub() {
        PNConfiguration pnConfiguration = new PNConfiguration();
        pnConfiguration.setPublishKey("YOUR_PUB_KEY_HERE");
        pnConfiguration.setSubscribeKey("YOUR_SUB_KEY_HERE");
        pnConfiguration.setSecure(true);
        pubnub = new PubNub(pnConfiguration);
    }
    // Creates notification channel.
    private void createChannel() {
        // Notification channel should only be created for devices running Android API level 26+. 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel chan1 = new NotificationChannel(
                    "default",
                    "default",
                    NotificationManager.IMPORTANCE_NONE);
            chan1.setLightColor(Color.TRANSPARENT);
            chan1.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
            notificationManager.createNotificationChannel(chan1);
        }
    }
}
```

[PubNub管理ダッシュボードから](https://pubnub.com//admin.pubnub.com/signup)固有のPubNubキーを取得します。 YOUR\_PUB\_KEY\_HERE」と「YOUR\_SUB\_KEY\_HERE」を[PubNub管理ダッシュボードの](https://admin.pubnub.com/login)キーに置き換えます。

デバイストークンを取得するサービスと、トークンを登録サーバー（PubNub）に送信するメソッドを追加する必要があります。PubNub Android SDKを使用して、登録トークンにチャネルを関連付けます。フォアグラウンドでデータメッセージを処理したり、通知メッセージを表示できるようにするには、FirebaseMessagingServiceを継承したサービスも追加する必要があります。

プロジェクトエクスプローラで、"app > java > \[パッケージ名\]" ディレクトリを展開します。次に右クリックし、"New > Java Class "を選択します。クラス名を "MyFirebaseMessageService.Java "とします。

```js
package com.pubnub.hellopush;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import com.pubnub.api.callbacks.PNCallback;
import com.pubnub.api.enums.PNPushType;
import com.pubnub.api.models.consumer.PNStatus;
import com.pubnub.api.models.consumer.push.PNPushAddChannelResult;
import java.util.Arrays;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "FirebaseService";
    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Log.d(TAG,"NEW_TOKEN: "+token);
        sendRegistrationToPubNub(token);
    }
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // If the application is in the foreground handle or display both data and notification FCM messages here.
        // Here is where you can display your own notifications built from a received FCM message.
        super.onMessageReceived(remoteMessage);
        Log.d(TAG, "From: " + remoteMessage.getFrom());
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        }
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }
        // displayNotification(remoteMessage.getNotification().getBody());
    }
    private void sendRegistrationToPubNub(String token) {
        // Configure PubNub mobile push notifications.
        MainActivity.pubnub.addPushNotificationsOnChannels()
            .pushType(PNPushType.GCM)
            .channels(Arrays.asList("HelloPush", "TestPushChannel"))
            .deviceId(token)
            .async(new PNCallback<PNPushAddChannelResult>() {
                @Override
                public void onResponse(PNPushAddChannelResult result, PNStatus status) {
                    Log.d("PUBNUB", "-->PNStatus.getStatusCode = " + status.getStatusCode());
                }
            });
    }
}
```

このクラスをAndroidManifest.xmlファイルに追加します。

```js
<service android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
```

AndroidManifest.xmlファイルの`<application>`タグの前に、これらのパーミッションを追加します。

```js
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
```

### PubNubからモバイルプッシュ通知を送信する

AndroidデバイスまたはAndroidエミュレータでアプリをビルドして実行します。

PubNubでモバイルプッシュ通知を送信するには、デバイスが追加されたチャネルまたはチャネルにメッセージを発行します。重要なことは、**デバイスがそのチャンネルの通知を受信するためにチャンネルを購読する必要は**ないということです。デバイスはプッシュ通知用のチャンネルに登録するだけで、そのデバイスタイプ用のプッシュ通知キーがあるメッセージのプッシュ通知を受け取ることができます。

[![PubNub Debug Client](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf8/a8b147f50bf2dd0d6ae393f422a17e4d/debugclient.png "PubNub Debug Client")](https://pubnub.com//admin.pubnub.com/signup)

-   関連するFCMデバイスは`pn_gcm`キー内のデータのみを受信します。
-   ネイティブPubNub購読者は通知キーを含むオブジェクトリテラル全体を受信します。

このチュートリアルでは、デバイスを "Notifications "チャネルに登録しました。そのチャネルに`pn_gcm`キーで送信されたメッセージは、登録されたデバイスにモバイルプッシュ通知として送信されます。

モバイルプッシュ通知をテストする最も簡単な方法は、[PubNub管理ダッシュボード](https://pubnub.com//admin.pubnub.com/signup?devrel_gh=android-push-notifications)内のPubNubデバッグコンソールから送信することです。

[PubNub管理ダッシュボードに](https://pubnub.com//admin.pubnub.com/signup?devrel_gh=android-push-notifications)移動し、アプリを選択し、キーセットを選択します。

Debug Console "をクリックし、"Default Channel "を`Notificationsに`設定してクライアントを作成します。

作成したクライアントを使用して、`pn_gcm`キーを含むメッセージを送信することで、デバイスに通知を送信できます。

`notification`キーを使用してAndroidプッシュ通知を送信します：

```js
{"pn_gcm":{"notification":{"body":"Hello World."}}}
```

![Hello World Android Push Notification](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jf0/2c03580d2163ac7ca6c86e1b85104d00/helloworld_short.gif "Hello World Android Push Notification")モバイルプッシュ通知の送信に問題がある場合は、[トラブルシューティングガイドを](https://support.pubnub.com/hc/en-us/articles/360051495432-How-can-I-troubleshoot-my-push-notification-issues-)参照してください。

#### 目次

[FCMを使用してAndroidにFirebaseプッシュ通知を送信する方法の概要](#h-0)[PubNubを使用してAndroidにFirebaseプッシュ通知を送信](#h-1)する[方法](#h-0)[PubNubを使用してFirebaseプッシュ通知を開始](#h-2)する[新しいAndroidアプリを](#h-3)[作成](#h-2)する[Firebaseクラウドメッセージングを追加してリアルタイム通知を構築](#h-4)する[Firebaseモバイルプッシュ通知用にFCMとPubNubを](#h-5)[設定](#h-4)する[PubNubからモバイルプッシュ通知を](#h-6)[送信](#h-5)する

PubNubはどのようにお役に立ちますか？
=====================

この記事は[PubNub.com](https://www.pubnub.com/blog/sending-android-mobile-push-notifications-firebase-cloud-messaging-pubnub/)に掲載されたものです。

PubNubのプラットフォームは、開発者がWebアプリ、モバイルアプリ、IoTデバイス向けにリアルタイムのインタラクティブ機能を構築、配信、管理できるように支援します。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs)、ユースケースや[SDKに](https://www.pubnub.com/docs)関係なく、あなたを立ち上げ、実行することができます。