いつもお世話になっております。
早速ですが表題の件でご教授頂きたく本件を投稿しました。
基本情報
先ずは基本情報から説明させていただくと、
Push通知を送信するのに使用しているツールは、FirebseCloudMessenging(以降FCMとする)を使用して送信しております。
FirebaseAdminSDKで送信していてNode.jsを通して送信しております。
その他諸々の設定はすべて出来ており、通知もIOS・Android届いている状況です。
ただ表題に書いてある通り、届かない場合があります。
といってもこういうパターンで送ると届かないとかではなく、急に届かなくなったりと不規則な動きをしています。
送れなかったパターンを再度1~2時間後に送信してみると、治ってたりしているので具体的にどういった送信が届いていないのか説明ができません。
やったこと
Push通知が送れない場合こういったケースがあると紹介しているサイトをたくさん見てみましたが、該当するケースがありませんでした。
自分が調べて届かないケースをまとめてみました。(文字数が越えてしまったので代表的なやつを記入しています)
「Dozeモードだと届かない」
「メッセージには有効期限がある」
「省エネモードだと届かない」
「重要度設定を低めにすると届かない」
「チャンネルが登録されていない」
「トピックが正しく設定されていない」
「最大文字数(4KB)を超えている」
「バックグランド・フォアグランドでは設定が必要」
「指定バックオフで送れなかった場合は再度送信するロジックを導入する」
チャンネルやトピックスに関しては普通に通知を受け取れているので、関係ないかと思っています。
以前フォアグランドは届くがバックグランドでは通知が届かない問題があり、質問している記事があるので載せておきます。
URL:https://teratail.com/questions/261240
上のURLで書いてあるようにデータペイロードのみで送信しています。
以上が基本情報です。
プログラム
Nodeでやっている処理は以下になります。
Node.js
1 2…省略 3 4/*************************************** 5* 個別トークン配信 6**************************************/ 7async function send_push_notice_single(parameter_data, set_fcm, DB_obj,) { 8 9 10 return new Promise((resolve,reject) => { 11 var topic = parameter_data['topic']; 12 var condition = "'Android' in topics || 'info_topic' in topics"; 13 14 //デフォルト値 15 16 user_id = "0"; 17 18 } 19 20 //送られてきたURLをデコードする 21 let decodeURI = decodeURIComponent(parameter_data['url']); 22 decodeURI = decodeURIComponent(decodeURI); 23 decodeURI = decodeURIComponent(decodeURI); 24 25 let decodeImage = decodeURIComponent(parameter_data['image']); 26 decodeImage = decodeURIComponent(decodeImage); 27 decodeImage = decodeURIComponent(decodeImage); 28 29 //トークン送信 30 var message = { 31 data : { 32 title : parameter_data['title'], 33 message : parameter_data['message'], 34 url : decodeURI, 35 uid : user_id, 36 type : parameter_data['type'], 37 image : decodeImage, 38 android_channel_id: parameter_data['channel'] 39 }, 40 token: parameter_data['token'] 41 }; 42 43 console.log(message); 44 45 var response_data = ''; 46 47 // Send a message to devices subscribed to the provided topic. 48 set_fcm.messaging().send(message) 49 .then((response) => { 50 // Response is a message ID string. 51 console.log('Successfully sent message:', response); 52 53 response_data = { 54 code : 'Successfully sent message', 55 log : { 56 send_type : 'single', 57 error_info : response, 58 push_data : message 59 } 60 }; 61 resolve(response_data); 62 }) 63 .catch((error) => { 64 console.log('Error sending message:', error); 65 66 response_data = { 67 code : error['errorInfo']['code'], 68 log : { 69 send_type : 'single', 70 error_info : error['errorInfo'], 71 push_data : message 72 } 73 }; 74 resolve(response_data); 75 76 // resolve(true); 77 78 }); 79 });
Android側
java
1public class MyFirebaseMessagingService extends FirebaseMessagingService { 2 3 private static final String TAG = "MyFirebaseMsgService"; 4 5 @Override 6 public void onNewToken(String token) { 7 …省略 8 } 9 10 @Override 11 public void onMessageReceived(RemoteMessage remoteMessage) { 12 13 if (remoteMessage != null) { 14 15 long id = 0; 16 String type = remoteMessage.getData().get("type"); 17 String title = remoteMessage.getData().get("title"); 18 String message = remoteMessage.getData().get("message"); 19 String url; 20 String uid; 21 String image; 22 23 24 if(remoteMessage.getData().get("type") != null){ 25 type = remoteMessage.getData().get("type"); 26 }else{ 27 Log.d(TAG,"type何も入っていません"); 28 type = ""; 29 } 30 31 //会員機能なのか非会員機能なのかを分ける処理 32 if(remoteMessage.getData().get("uid") != null && remoteMessage.getData().get("uid") != ""){ 33 uid = remoteMessage.getData().get("uid"); 34 }else{ 35 Log.d(TAG,"uid何も入っていません"); 36 uid = "0"; 37 } 38 39 //飛ばしたいリンクがあれば登録する処理 40 if(remoteMessage.getData().get("url") != null){ 41 url = remoteMessage.getData().get("url"); 42 }else{ 43 Log.d(TAG,"url何も入っていません"); 44 url = ""; 45 } 46 47 //画像があれば登録する処理 48 if(remoteMessage.getData().get("image") != null){ 49 image = remoteMessage.getData().get("image"); 50 }else{ 51 Log.d(TAG,"image何も入っていません"); 52 image = ""; 53 } 54 55 //チャンネル 56 String channel = remoteMessage.getData().get("android_channel_id"); 57 58 //タイトルのないPush通知など存在しないはずだに 59 if (title != null || message != null) { 60 Log.d(TAG,"プッシュ通知が届きました。"); 61 // 通知メッセージを処理 62 Log.d(TAG, "これですね →" + remoteMessage.getData().toString()); 63 64 if(!type.equals("oubo") && !type.equals("scout")) { 65 66 //プッシュ通知をデータベースに入れ込み 67 PushList pushList = new PushList(); 68 pushList.type = type; 69 pushList.title = title; 70 pushList.message = message; 71 pushList.receive_time = dateTime; 72 pushList.url = url; 73 pushList.batch = 1; 74 pushList.uid = Integer.parseInt(uid); 75 pushList.image = image; 76 77 //ユーザーデータベースを宣言 78 UserDatabase db = Room.databaseBuilder(getApplication().getApplicationContext(), UserDatabase.class, myClass.TABLE_NAME).addMigrations(MIGRATION_1_2).addMigrations(MIGRATION_2_3).addMigrations(MIGRATION_3_4).addMigrations(MIGRATION_4_5).build(); 79 80 //追加したレコードIDを戻り値として設定 81 id = db.pushListDao().insert(pushList); 82 } 83 84 } 85 86 //Push通知表示用メソッド呼び出し 87 //補足:URLクラスを呼び出すとtry/chatchしないといかんのだ 88 try { 89 sendNotification(id,title,message,channel,url,image); 90 } catch (IOException e) { 91 e.printStackTrace(); 92 } 93 } 94 95 /** 96 * フォアグランドでもPush通知を受け取る 97 */ 98 private void sendNotification(Long id,String title, String body, String channel, String url, String image) throws IOException { 99 100 //タップされたときの遷移画面設定 101 Intent intent = new Intent(this, MainActivity.class); 102 intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 103 intent.putExtra("PushReceive",url); 104 intent.putExtra("PushRecodeId",id.intValue()); 105 106 //senderIDを指定するために乱数を使用 107 randamId = UUID.randomUUID().hashCode(); 108 109 //一度のみ 110 PendingIntent pendingIntent = PendingIntent.getActivity(this, randamId, intent,PendingIntent.FLAG_UPDATE_CURRENT); 111 112 Bitmap bitmap = null; 113 114 Log.d(TAG,"画像生成失敗"); 115 //デフォルトスタイル適用 116 BigTextPushStyle(title,body,channel,bitmap,pendingIntent); 117 118 119 } 120 121 //大きい画像を表示させるときのスタイル 122 private void LaurgePicturePushStyle(String title, String body, String channel, Bitmap bitmap, PendingIntent pendingIntent){ 123 124 Notification bigPictureStyle = new NotificationCompat.Builder(this,channel) 125 .setSmallIcon(R.drawable.pushicon) 126 .setContentTitle(title) 127 .setContentText(body) 128 .setLargeIcon(bitmap) 129 .setAutoCancel(true) 130 .setContentIntent(pendingIntent) 131 .setPriority(NotificationCompat.PRIORITY_HIGH) 132 .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap) 133 ).build(); 134 135 //マネージャーさん呼び出し 136 NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 137 //Push通知を表示 138 notificationManager.notify(randamId, bigPictureStyle); 139 } 140 141 //長文用 142 private void BigTextPushStyle(String title, String body, String channel, Bitmap bitmap, PendingIntent pendingIntent){ 143 144 Notification bigTextStyle = new NotificationCompat.Builder(this,channel) 145 .setSmallIcon(R.drawable.pushicon) 146 .setContentTitle(title) 147 .setContentText(body) 148 .setLargeIcon(bitmap) 149 .setAutoCancel(true) 150 .setContentIntent(pendingIntent) 151 .setPriority(NotificationCompat.PRIORITY_HIGH) 152 .setStyle(new NotificationCompat.BigTextStyle() 153 ).build(); 154 155 //マネージャーさん呼び出し 156 NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 157 //Push通知を表示 158 notificationManager.notify(randamId, bigTextStyle); 159 160 }
(とりあえずAndroidで表示する文を投稿しましたが、IOSも必要であれば載せます。)
以上のプログラムで送信しています。
PHP側でPush通知を送信できる管理画面を作成していて実際に送信した内容をconsole.logで表示してみていますが、エラーはめったに表示されません。
エラーがあったとしてもトークンがありませんというエラー以外でていません。
受け取れないパターンについて
受け取れないパターンですが、特に多かったパターンがAndroidアプリを再起動?(タスク切り)してPush通知を送信すると届かないことが多いです。(IOSは特になし)
5通Push通知を30秒ほど間隔をあけて送信し、2通目までは連続で送信して3通目からはアプリを再起動して送信したのですが、3~5通目が届かないことが多いです。
たまにまとめて3通同じ時間に来たり、3通目からまったく通知が届かない場合もあります。
(1~2時間後に同じことをしたら届くこともありました)
長文で理解しずらいかと思いますが、お力添え頂ければ幸いです。
どんな些細な回答でも嬉しいのでぜひ回答ください泣
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。