8

以下のようにFirebase通知を自分のwebserviceから送信します。アプリケーションがフォアグラウンドとバックグラウンドで動作しているとき アンドロイドアプリが最近のトレイから削除されたときにFirebase(FCM)通知が届かない

$url = 'https://fcm.googleapis.com/fcm/send'; 
     $fields = array(
      'registration_ids' => $tokens, 
      'data' => $message 
      ); 
     $headers = array(
      'Authorization:key = SERVER_KEY ', 
      'Content-Type: application/json' 
      ); 

1.Notifications

は何の問題もなく来ている、しかし、私は通知が来ていないその後、最近のトレイからアプリを削除した場合、私はこの本のためのすべてのソリューション処理するために持っている必要がありますか? (Whatsup通知が設定からこのアプリケーションを停止したとしてもすべてのシナリオを表示しています)

私は "onMessageReceived"からこれらのメッセージ、ボディコンテンツを私のアクティビティ/フラグメントに渡す方法を通知しましたか?

3.すべてのトークンを配列に追加する代わりに、すべてに通知を送信したい場合もあります。そのようなものを「ALLに送る」のように扱う他の方法はありますか?

public class MyFirebaseMessagingService extends FirebaseMessagingService { 
    private static final String TAG = "MsgService"; 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Log.d(TAG, "From: " + remoteMessage.getFrom()); 
     Log.d(TAG, "Data Payload : " + remoteMessage.getData()); 
     sendNotification(remoteMessage.getData().get("message")); 
    } 
    private void sendNotification(String messageBody) { 
     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 
       PendingIntent.FLAG_ONE_SHOT); 
     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentTitle("Firebase Push Notification") 
       .setContentText(messageBody) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 
     NotificationManager notificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(0, notificationBuilder.build()); 
    } 
} 

失敗したデバイス:(最近のトレイから削除した後、通知が来されていません)

  • MI Redmi注2(5.0.2ロリポップ)
  • Huawei社の名誉5C(5.1.1ロリポップ)

成功デバイス:(最近のトレイから削除した後に通知が来る)

  • HTCワンX(4.2ジェリービーン)
  • サムスン銀河壮大プライム(4.4キットカット)
+0

これはOSバージョン(Lollipop vs Jelly Beanなど)の問題ではないと思われますが、Google Playサービスが受信者から解雇されたアプリを覚醒させるかどうかはもっと問題になります。一部のメーカーはこの動作を調整します。私は、FCMチームが期待どおりに動作していないデバイスをより深く見ることができるように、firebaseサポートの問題を提言することをお勧めします。 https://firebase.google.com/support/ –

+0

私もデータメッセージで同じ問題を抱えています。そして、私が知る限り、Androidのどのバージョンでも動作していません。私はマシュマロとロリポップでテストしました。 – rGun

+1

lava Irish x1 –

答えて

5

アプリケーションが問題なくフォアグラウンドとバックグラウンドにあるとき1.Notificationsが来ている、しかし、もし最近のトレイからアプリを削除してから 通知が届かないので、これを処理する必要があります これは何ですか?代わりに、あなたがデータを送信している、あなたは通知を送信していないとして、あなたはremoteMessage.getNotification().getBody()にnullポインタ例外を取得する必要がありますあなたのコードを1として

(ワツァップ通知は、すべてのシナリオを示しているようにも私 力は設定から​​このアプリを停止しました)あなたのカール要求からのペイロード。私の個人的な経験によれば、あなたが言及した問題は特にAndroid Kitkat以下のデバイスに見られます。 Lollipop以上でFirebaseのプッシュは正常に動作しているようです。

2.「onMessageReceived」から、これらのメッセージ、本文コンテンツをアクティビティ/フラグメントに渡す方法を通知しましたか?

onMessageReceived()からブロードキャストを発行し、自分のアクティビティにBraodcast Receiverを登録し、ブロードキャストの意図でデータを送信することができます。コード例:私は代わりに、アレイへのすべてのトークンを追加するので、すべてに通知を送信したい場合3.In

活動

private BroadcastReceiver receiver; 

@Overrride 
public void onCreate(Bundle savedInstanceState){ 

    // your oncreate code 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction("SOME_ACTION"); 

    receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String message = intent.getStringExtra("message"); 
    } 
    }; 
    registerReceiver(receiver, filter); 
} 

@Override 
protected void onDestroy() { 
    if (receiver != null) { 
    unregisterReceiver(receiver); 
    receiver = null 
    } 
    super.onDestroy(); 
} 

FirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService { 
    private static final String TAG = "MsgService"; 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Log.d(TAG, "From: " + remoteMessage.getFrom()); 
     Log.d(TAG, "Notification Message Body: " + remoteMessage.getData()); 

     Intent intent=new Intent(); 
     intent.setAction("SOME_ACTION"); 
     intent.putExtra("message", remoteMessage.getNotification().getBody()); 
     sendBroadcast(intent); 
    } 
} 

。 「すべてに送信」のような処理を行う他の方法 そのようなものはありますか?

白いアイコンの問題のように処理するための独自の問題を抱えているFirebaseコンソールを使用して、そしてあなたの通知のカスタムのparamsをリッピングされ、Firebase APIでこれを行うための唯一の方法「をALLに送信」のようなものは何もありません。

+0

質問3:各ユーザーを「トピック」に登録すると、「すべて送信」することは可能でしょうか? –

+0

@Hisham私はちょうどテスト済みのデバイスで自分の投稿を編集しました。私のケースでは、最近のトレイから削除されたアプリの後に、** Lollipopのデバイス通知が**アプリケーションが削除されても、これについての手掛かり?また、 'sendNotification(remoteMessage.getData()。get(" message "));' – Chandrahasan

1

私はまさにMi PhoneとHuaweiの電話でもFCMに問題がありました! FCMやアプリの問題ではなく、デバイスレベルで問題であることが判明しました。

これらは、通知を無効にする、または目覚ましをロックするデバイスレベルのアプリケーション設定を備えているため、メッセージが到着したときにonMessageReceived()は起動されません。設定を変更した後(主に通知を許可する&私のアプリのバッテリ最適化を無効にする)、すべて正常に機能します!

Firebase cloud messaging not received when app in backgroundを参照してください。

-1

この問題にはバックエンドの実装が必要です。 私はこの欠点をどのように克服するかについて話し合ってみましょう。

アクティビティのライフサイクルを認識しています。そこで、私はクライアントトークンの登録を解除するバックエンドからサービスを呼び出します。 ターゲットクライアントのトークンが登録解除されているため、すべての着信メッセージが配信待ちの状態になります。

私はアプリケーションを取り戻す際に、クライアントを登録するバックエンドサービスを呼び出します。 バックエンドが、新しいデバイスのクライアントトークンを使用してキューからメッセージを送信し始めます。

関連する問題