Memo

メモ > 技術 > サービス: AmazonSNS > Android: アプリにPHPからPushを送信

Android: アプリにPHPからPushを送信
主に以下の記事を参考に進める。 PHP/LaravelでFCMpush通知を実装した件 #PHP - Qiita https://qiita.com/takapon21/items/47a72472541650fe3b1a 以下のとおり、Composerを使えるようにする。(PHP7.4以上が必要。)
$ cd /path/to/firebase $ composer Composer version 2.4.4 2022-10-27 14:39:29
以下のとおり、必要ライブラリをインストールする。(バージョン指定は無しでいいかもしれない。)
$ composer require google/apiclient:^2.15.0 23 package suggestions were added by new dependencies, use `composer suggest` to see details. Generating autoload files 6 packages you are using are looking for funding. Use the `composer fund` command to find out more! No security vulnerability advisories found
続いて、Pushを送信するためのPHPプログラムを作成する。 pushtest1-aeb26-c00a0b10addc.json の情報をもとにして、以下のプログラムを作成する。(ファイルの文字コードは UTF-8N にする。)
<?php require_once 'vendor/autoload.php'; $googleClient = new Google_client; $googleClient->useApplicationDefaultCredentials(); // 認証情報 $googleClient->setAuthConfig([ 'type' => 'service_account', 'project_id' => 'pushtest1-aeb26', 'private_key_id' => 'c00a0b10ad00000000000000000000baebe01a4f', 'private_key' => "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnoXNCLluQ4ikO\nY7mxImNS9ft4LFWCXDUqkPajWgMYwJzyLd〜中略〜hx0RWLhN9\n7mZwLUZfLvTKeCalOeDx61eCn4cnHRhpIukGzV4NdF1KwD+v3Jpo2Ot74/pGwSWl\nKUYqj6EYTMsXropj5TFXGg0=\n-----END PRIVATE KEY-----\n", 'client_email' => 'firebase-adminsdk-ik32h@pushtest1-aeb26.iam.gserviceaccount.com', 'client_id' => '101260000000000064216', 'auth_uri' => 'https://accounts.google.com/o/oauth2/auth', 'token_uri' => 'https://oauth2.googleapis.com/token', 'auth_provider_x509_cert_url' => 'https://www.googleapis.com/oauth2/v1/certs', 'client_x509_cert_url' => 'https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-ik32h%40pushtest1-aeb26.iam.gserviceaccount.com', ]); // FCMにアクセスするためのスコープ $googleClient->addScope('https://www.googleapis.com/auth/firebase.messaging'); // 認証されたHTTPクライアントを取得 $httpClient = $googleClient->authorize(); // 送信対象と送信内容を作成 $project = 'https://fcm.googleapis.com/v1/projects/pushtest1-aeb26/messages:send'; $tokens = [ 'envzgXQ9Tm0000000000-K:APA91bFp66znOyBVMEkFCBRXhh-ssW2iQeDnXXKDGy-Ey-cN-T9FlaXFk0eKHlvfeYtoOYQjhqFN3WayxCtFwhZnOm48Mx99LIiXD2x7YQwZ8wwYw-X756tTgRAB1QvGDbdZBcp7_x69', ]; $title = 'プッシュ通知のテスト'; $body = 'これはプッシュ通知のテストです。'; foreach ($tokens as $token) { try { // FCMにPOSTリクエストを送信 $response = $httpClient->post($project, [ 'json' => [ 'message' => [ 'token' => $token, 'notification' => [ 'title' => $title, 'body' => $body, ], 'apns' => [ 'payload' => [ 'aps' => [ 'alert' => [ 'title' => $title, 'body' => $body ] ] ] ], "android" => [ "priority" => "high", "notification" => [ "sound" => "default", ] ], ] ] ]); // 応答の確認 if ($response->getStatusCode() == 200) { echo "送信成功: Token = {$token}\n"; } else { echo "送信失敗: Token = {$token}, HTTP ステータスコード = " . $response->getStatusCode() . "\n"; } } catch (\GuzzleHttp\Exception\RequestException $e) { // 通信エラーなどリクエスト送信時のエラー if ($e->hasResponse()) { $errorMessage = $e->getResponse()->getBody()->getContents(); echo "送信失敗: Token = {$token}, エラーメッセージ = {$errorMessage}\n"; } else { echo "送信失敗: Token = {$token}, ネットワークエラーまたはその他のエラー\n"; } } catch (\Exception $e) { // その他のエラー echo "送信失敗: Token = {$token}, エラーメッセージ = " . $e->getMessage() . "\n"; } } echo "Complete\n";
以下のとおり実行して、本番アプリにプッシュ通知を送信できることを確認できた。
$ php firebase.php
これなら、数日経ってもアクセストークンが失効されることは無かった。 一度に複数端末へ送信したい場合、上記のように送信先を配列で定義して、ループで順に送信するといい。 もしくは、FCMのトピックを使って一斉送信するといい。(未検証。) なおPHP7環境だと、以下のエラーになるので注意。
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.3.19. in /path/to/firebase/vendor/composer/platform_check.php on line 24
この場合、PHPを8にアップデートするか、別途PHP8.1をインストールして実行するといい。
$ /path/to/php81/php firebase.php
■トラブル事例1 Composer実行時に以下のエラーになった場合、
Problem 1 - Root composer.json requires google/apiclient 2.15.0 -> satisfiable by google/apiclient[v2.15.0]. - google/apiclient v2.15.0 requires php ^7.4|^8.0 -> your php version (7.3.19) does not satisfy that requirement.
一例だがWindows環境では、以下のようにPHP8.1を参照できるようにするといい。 C:\localhost\home\test\public_html\firebase\composer.bat
@ECHO OFF C:\php81\php.exe "%~dp0composer.phar" %*
またPHP7.3環境では、「composer require google/apiclient」とバージョン指定なしならインストールできることを確認できた。 プッシュ通知の送信もできた。 ■トラブル事例2 Composer実行時に以下のエラーになった場合、
The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the 'disable-tls' option to true.
以下のページを参考にphp.iniを調整する。 composerのSSLのエラーを解決する https://digirakuda.org/blog/2018/06/04/post-251/ ■トラブル事例3 プッシュ通知送信時に以下のエラーになった場合、
PHP Warning: openssl_sign(): Supplied key param cannot be coerced into a private key in /path/to/firebase/vendor/firebase/php-jwt/src/JWT.php on line 254 Warning: openssl_sign(): Supplied key param cannot be coerced into a private key in /path/to/firebase/vendor/firebase/php-jwt/src/JWT.php on line 254 PHP Fatal error: Uncaught DomainException: OpenSSL unable to sign data in /path/to/firebase/vendor/firebase/php-jwt/src/JWT.php:256
鍵の指定が正しくできているか確認する。 鍵データには「\n」が含まれるので、正しく改行と解釈させるために、ダブルクォートでくくって指定する。 【Laravel/PHP】openssl_sign(): supplied key param cannot be coerced into a private key の 対応方法 https://engineer-jose-blog.com/%E3%80%90php%E3%80%91openssl_sign-supplied-key-param-cannot-be-coerce... ■AmazonSNSを使う準備 通知の動作を確認できたら、MyFirebaseMessagingService.kt にある以下の処理を修正しておく。(AmazonSNSからのメッセージを受け取る準備。) ★この修正を行なった後でも、問題無く通知を受け取れるみたい?
showNotification("通知タイトル", "通知メッセージ") ↓ showNotification("PushTest1", remoteMessage.data["default"])
※ひととおり試してから、上記の調整を行ったうえでプッシュ通知を再送信すると、普通にメッセージが表示された?気のせい? Firebase側で良い感じに調整されたのか、別のアプリに届いたなど何かの勘違いか。 何度か試していると、「通知タイトル」「通知メッセージ」になったり、また「テストのタイトル」「テストのテキスト」に戻ったりするような? ※そもそも「FirebaseからPushを送信した場合、このキーで送られてくる」はあるはずなので、改めて調査したい。 後述の「AmazonSNS: PHPプログラムの作成」にある「補足」も参照。

Advertisement