質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

1551閲覧

Laravel5.1 Androidへのプッシュ通知で400 Bad Requestが出る。

maedamin

総合スコア13

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/08/08 12:53

編集2019/08/12 11:07

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の方にも問合せをしておりますが、そちらはまだ返答無い状況です。

これですが、ライブラリを更新したら、「同期状態」ではエラーは出なくなりました。(プッシュはまだ飛ばない)
現象が変わらないと言うのは「非同期」通知の場合です。
なので、複合要因。
切り分けて、調査します。
まずは、同期状態でプッシュが飛ぶかどうか。(非同期の問題の要因は、おそらくキューワーカーリスタートすれば解決するかと)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

普段はSNSでプッシュするのでGCMの都合はよくわかりませんが

400 Bad Request, invalid message

と言われているという事であれば、APIへのリクエストが正常に行われていない
具体的には、messageが不正、正しくない、nullとか空の可能性がある
または、API自体が仕様変更されたため、パラメータが不足しているという事ではないでしょうか

Sly\NotificationPusher\Exception\PushException

という事なので
https://github.com/Ph3nol/NotificationPusher
Github上でIssue立てた方が早いきがしないでもないです。

(結局は同じプログラムが呼ばれている。)

これについては、非同期(Worker)でやる場合は、Modelが一旦シリアライズされるので
全く同一条件という事ではないかと思います
(今まで何回かデシリアライズでこけた事が何度か、idだけ保存してModelは再度Findしたほうが懸命っぽい)

投稿2019/08/08 13:38

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maedamin

2019/08/08 13:51

mikkameさま、ありがとうございます。 そのまま読むと確かにmessage不正、ですが、iOSでは問題なく受け取れています。 そうなるとAPI自体の仕様変更ですか。。。
mikkame

2019/08/08 14:29 編集

iOSはAPNSでAndroidはGCMです。 APIの行き着く先が違います。ですので可能性としては十分考えられます
maedamin

2019/08/08 15:07

ありがとうございます。 調べてみると、GCMは廃止?本来はFCMに移行していなければならないとあります。 https://www.atmarkit.co.jp/ait/articles/1804/13/news051.html 単純にGCM側で受けていないと言うことなのでしょうか? (いずれにしろ、FCMにしないとダメのように見えます。)
mikkame

2019/08/08 15:12

GCMに詳しいわけではありませんが 現状のエラーや状況をみると、GCM側で受け付けていないような印象です。 2018年の記事の1年後なのですでに廃止されているのでは・・・?
maedamin

2019/08/08 15:35

はい、それであれば、エラーに納得感(?)があります。 ありがとうございます。 おかげさまでかなりわかってきたので、もう少し調べてみます。
maedamin

2019/08/12 04:55

FCM対応のためライブラリをすべて新しいものに更新しましたが、現象は変わらないようです。
guest

0

自己解決

この件、そもそもはプッシュを飛ばしたいので完全に解決はしていませんが、少なくとも400エラーは出なくなったのでクローズします。
→昨日まではそうでしたが、先ほどテストしてみたら、無事にプッシュが飛びました。
(反映するまで時間がかかるということか?)

解決方法としては、関連するライブラリの全更新。
この場合は、
composer update --with-dependencies davibennun/laravel-push-notification
などを実施し、関連する依存ライブラリの更新を行いました。

同期状態でのプッシュテストではとりあえずエラーは消えています。(ただしプッシュは飛んでいません。)

また、非同期の場合は、どうやらキューワーカーのキャッシュの問題があるようなので、一度キューをリスタートし、変更プログラムをリロードする必要があるようです。
こちらも
php artisan queue:restart
で非同期も無事に動くことを確認できました。

投稿2019/08/13 00:54

編集2019/08/13 01:52
maedamin

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問