Androidアプリにプッシュ通知を送りたい
この機能ですが、以前は動いていたはずなのですが、最近エラーを吐いていることを見つけました。
同様な処理をiOSに対しても行っていますが、こちらは問題なく動いています。
現在Laravel5.1を使っており、スマホアプリに対してサーバからプッシュ通知を行っています。
以前は動いていたのですが、最近プッシュ通知でエラーが出ていることを発見
Laravelのログでは以下のようなものが出ています。
local.ERROR: exception 'Sly\NotificationPusher\Exception\PushException' with message '400 Bad Request; invalid message' in /mnt/home/apache/..../vendor/sly/notification-pusher/src/Sly/NotificationPusher/Adapter/Gcm.php:72
400 Bad Request, invalid messageとあります。
テスト用に簡単なプッシュAPIプログラムを作り、それがAndroidに対してのみ発生していることまではわかりました。
(iOSでは発生しない。)
POSTMANで実行したときのエラー(一部)は次の通りです。
in Gcm.php line 72 at Gcm->push(object(Push)) in PushManager.php line 67 at PushManager->push() in App.php line 34 at App->send(object(Message)) in General.php line 1302 at General::pushNotifyAndroid('テストプッシュメッセージ', array('title' => 'App', 'type' => 'messageType', 'source' => .....
General.php pushNotifyAndroid
PHP
1 public static function pushNotifyAndroid( $content, $payload, $tokens = array(), $badge, $appName ){ 2 $responses = array(); 3 $deviceList = array(); 4 5 foreach ($tokens as $token ){ 6 $deviceList[] = PushNotification::Device($token); 7 } 8 9 $devices = PushNotification::DeviceCollection($deviceList); 10 11 $message = PushNotification::Message($content,array( 12 'badge' => $badge, 13 'sound' => 'default', 14 'title' => $appName, 15 'largeIcon' => 'large_icon', 16 'smallIcon' => 'small_icon', 17 'payload' => $payload, 18 "content_available" => 1, 19 )); 20 21 $collection = PushNotification::app('appAndroid') 22 ->to($devices) 23 ->send($message); 24 25 foreach ($collection->pushManager as $push) { 26 $response = $push->getAdapter()->getResponse(); 27 $responses[] = $response; 28 } 29 30 return [ 31 'response' => $responses, 32 'push' => $collection 33 ]; 34 }
POSTMANでのエラーのGeneral.php line 1302が上の$collection = PushNotification::app('appAndroid')....
に当たります。
Gcm.php
PHP
1 public function push(PushInterface $push) 2 { 3 $client = $this->getOpenedClient(); 4 $pushedDevices = new DeviceCollection(); 5 $tokens = array_chunk($push->getDevices()->getTokens(), 100); 6 7 foreach ($tokens as $tokensRange) { 8 $message = $this->getServiceMessageFromOrigin($tokensRange, $push->getMessage()); 9 10 try { 11 $this->response = $client->send($message); 12 } catch (ServiceRuntimeException $e) { 13 throw new PushException($e->getMessage()); 14 } 15 16 if ((bool) $this->response->getSuccessCount()) { 17 foreach ($tokensRange as $token) { 18 $pushedDevices->add($push->getDevices()->get($token)); 19 } 20 } 21 } 22 23 return $pushedDevices; 24 } 25
このtryで落ちていると思われます。72行目はcatchでのthrow new....
部分です。
どこで落ちているか迄は追えたのですが、この先の解決方法が見つからず困っています。
これだけの情報では解決は難しいと思っています。調査先なども含めて教えていただけると幸いです。
(なにぶんLaravelなどについては初心者ですので、よろしくお願いいたします。)
### その他情報など
以前は問題なく動いていましたが、途中で次のような作業を行っています。
・プッシュ通知の非同期化
このため、一度Laravelのキャッシュをクリアしました。
.envの書き換えも実行
非同期化については成功しています。
環境的な大きな変化としてはこれが思い当たります。
今回の不具合の確認では同期、非同期どちらでも同様な問題が起きていることを確認しています。
(結局は同じプログラムが呼ばれている。)
繰り返しになりますが、iOSでは問題なく稼働しています。
その後の調査
前回回答をいただいてから、さらに調査を行いました。
この件、GCM→FCM問題と考え、関連するライブラリのアップデート、エンドポイントの確認(fcmを向いているかどうか)を行いましたが、現象は変わらないようです。
400 Bad request が出ていますが、invalid messageというエラーも出ています。
exception 'Sly\NotificationPusher\Exception\PushException' with message '400 Bad Request; invalid message' in /mnt/home/apache/..../vendor/sly/notification-pusher/src/Sly/NotificationPusher/Adapter/Gcm.php:72
これを読むと、送信時のパラメータなどがおかしいので、リクエスト自体がおかしいと言うようにも読めます。
調べていくと、アプリ側はGCMのままでもプッシュ受信は可能とのことなので、やはり送信時の何かがおかしいと言うことになります。
元のライブラリのGitHubの方にも問合せをしておりますが、そちらはまだ返答無い状況です。
これですが、ライブラリを更新したら、「同期状態」ではエラーは出なくなりました。(プッシュはまだ飛ばない)
現象が変わらないと言うのは「非同期」通知の場合です。
なので、複合要因。
切り分けて、調査します。
まずは、同期状態でプッシュが飛ぶかどうか。(非同期の問題の要因は、おそらくキューワーカーリスタートすれば解決するかと)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/08 13:51
2019/08/08 14:29 編集
2019/08/08 15:07
2019/08/08 15:12
2019/08/08 15:35
2019/08/12 04:55