見出し画像

【Android】Firebase Cloud Messaging V1(FCM HTTP v1 API)への移行対応

2024年6月20日より「Firebase Cloud Messaging レガシー(FCM HTTP API, Legacy HTTP API)」は廃止となり、新規プロジェクトではV1でしか利用できなくなりました。
また、アプリのアップデートの際には V1 へ移行しないとエラーになりプッシュ通知が使えなくなっています。
ちなみに、2024年8月末時点に、レガシーを組み込んでリリース済の既存アプリで、Android Studiod に USB 接続したテスト端末で動作確認したところ、$request->send() でのレスポンスが DeprecatedApi エラーになりました。

ということで、レガシーからV1への移行について説明させていただきます。
主な対応としては、以下が必要になります。
━━━━━━━━━━━━━━━━━━━━━━━━━
・Firebase での秘密鍵の発行とプロジェクトIDの取得
・秘密鍵によるアクセストークンの取得
・送信リクエストのペイロードの変更
・送信リクエストのエンドポイントの変更
━━━━━━━━━━━━━━━━━━━━━━━━━


レガシーとV1の違い

Firebase Cloud Messaging レガシー

●固定URLに固定のサーバーキーを指定してプッシュ通知を送信する。
●単一の topic のみ指定可能。
●複数の token を指定して一括送信可能。

Firebase Cloud Messaging V1

●プロジェクト毎のURLに、サービスアカウント用の秘密鍵を使って取得した一時的に有効なアクセストークン指定してプッシュ通知を送信する。
●複数の topic を指定可能。
●複数の token を指定しての一括送信(マルチキャスト)は不可。
(レガシーで registration_ids に最大1000デバイス分までのデバイストークンを指定して送信していたやり方が使えなくなっています!

Firebase の設定

Firebase は Google Cloud の管理画面と連携していてどちらでも設定可能なようですが、Firebase 側で解説します。

Firebase(https://console.firebase.google.com/)にアクセスします。
→[登録済のプロジェクト]→ anroidアイコン → 設定アイコン
→[Cloud Messaging]タブに移動すると、レガシーを使っているプロジェクトの場合、「Cloud Messaging API(レガシー)」が有効の状態になっているはずです。

以下により V1 への移行に必要なプロジェクトIDと秘密鍵を取得します。

プロジェクトID

→[全般]タブ →[プロジェクトID]よりプロジェクトIDを取得。
→ 例:sampleapp-xxxxx

秘密鍵の生成

→[サービスアカウント]タブ→[新しい秘密鍵を生成]
→ 例:sampleapp-xxxxx-firebase-adminsdk-xxxxx-xxxxx.json

アプリ側の実装

MainActivity

topic を使う場合、onCreate でトピックを設定します。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        :
        FirebaseMessaging.getInstance().subscribeToTopic("topic_all");  // 任意のトピック名 

Android 13 以降の端末の場合、新たにパーミション許可遷移を設けないとプッシュ通知が送信できなくなりました。
AndroidManifest.xml に android.permission.POST_NOTIFICATIONS を追加 → requestPermissions により許可ダイアログ表示 → ユーザーによる許可が必要になるのでご注意ください。

サーバ側の実装

googleapis/google-api-php-client ライブラリでの実装について説明します。

google/apiclient のインストール(またはアップデート)

cd /var/www/html/プロジェクトルート
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php composer.phar composer --version
php -r "unlink('composer-setup.php');"

# google-api-php-client をローカルインストール
php composer.phar require google/apiclient

PHP実装

<?php

require_once 'vendor/autoload.php';

// プロジェクトID
$ANDROID_PROJECT_ID = 'sampleapp-xxxxx';
// 秘密鍵
$ANDROID_PUSH_SECRET_KEY_PATH = '/var/www/html/project/sampleapp-xxxxx-firebase-adminsdk-xxxxx-xxxxx.json';

$client = new Google_Client();
$client->useApplicationDefaultCredentials();

try {
    $client->setAuthConfig($ANDROID_PUSH_SECRET_KEY_PATH);
} catch (Exception $e){
    error_log($e->getMessage());
    exit;
}

$client->addScope('https://www.googleapis.com/auth/firebase.messaging');
$httpClient = $client->authorize();

// アプリから取得した端末登録トークンをセット
$targetToken = 'dby9FZTLSma-Pyj07ZuhSA:APA91bEeyuiNQglMqBuOrnX9.......';

try {
    $params = [
        'message' => [
            // 'topic' => 'topic_all',  // トピックを使う場合はアンコメント
            'token' => $targetToken,    // 登録トークン指定する場合(トピックを使う場合はコメントアウト)
            // data にはアプリに応じた任意のキーをセット
            // Foreground 時にも通知を出したい場合は notification ではなく data でセットする!
            "data" => ['title'      => 'アプリからのお知らせ',
                       'body'       => '新商品がリリースされました....'
            ],
        ],
    ];
    $projectId = $ANDROID_PROJECT_ID;
    $response = $httpClient->post("https://fcm.googleapis.com/v1/projects/{$projectId}/messages:send",
        ['json' => $params]
    );
    if ($response->getStatusCode() !== 200) {
        // 失敗時処理
    } else {
        // 成功時処理
    }
} catch (Exception $e){
    error_log($e->getMessage());
    exit;
}

※ペイロード(通知文)フォーマットの参考サイト
https://firebase.google.com/docs/cloud-messaging/xmpp-server-ref?hl=ja
https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ja

※マルチキャストの移行について
マルチキャストで構成していた場合の実装をどう移行するのかについては調べきれていません。トピックで代替すればいいのかもしれませんが、詳しくやり方が分かり次第、追記します。

#Firebase
#Firebase_Cloud_Messaging_V1
#Firebase_Cloud_Messaging_レガシー
#秘密鍵
#Google_Client
#google /apiclient
#setAuthConfig
#useApplicationDefaultCredentials
#topic
#notification
#registration_ids
#マルチキャスト

この記事が気に入ったらサポートをしてみませんか?