0

Je souhaite envoyer une notification avec les données du côté serveur et afficher ces données dans l'activité de mon choix. Jusqu'à présent, j'ai réussi à envoyer une notification du serveur et les afficher à toute activité de mon choix.Firebase envoie une notification avec la valeur de paire de clés de l'API du serveur

Ce que je ne comprends pas est

  1. Comment inclure des données dans la notification?
  2. Comment les recevoir dans une activité?

J'ai essayé de suivre les guides, mais je n'ai trouvé que ceux qui envoient une notification avec les données de la console Firebase.

// pour le côté serveur

<?php 
    require "init.php"; 
    $message =$_POST['message']; 
    $title=$_POST['title']; 
//firebase server url 
    $path_to_fcm='https://fcm.googleapis.com/fcm/send'; 
    // Here is the server_key 
    $server_key="#########"; 
    $token="#########"; 
    $headers= array(
    'Authorization:key='.$server_key, 
    'Content-Type:application/json' 
      ); 
       // here use $tokens as the replace $key 
$fields= array('to'=>$token, 
'notification'=>array('title'=>$title,'body'=>$message, 
    'click_action'=>'com.fredycom.tundevufirebasemysql_TARGET_NOTIFICATION' 
)); 
    $payload= json_encode($fields); 
    $curl_session= curl_init(); 
    curl_setopt($curl_session,CURLOPT_URL,$path_to_fcm); 
    curl_setopt($curl_session,CURLOPT_POST,true); 
    curl_setopt($curl_session,CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($curl_session,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($curl_session,CURLOPT_SSL_VERIFYPEER,false); 
    curl_setopt($curl_session,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V4); 
    curl_setopt($curl_session,CURLOPT_POSTFIELDS,$payload); 
     $result =curl_exec($curl_session);  
     curl_close($curl_session); 
    mysqli_close($con); 
    ?> 

// reçoivent un message de service

public void onMessageReceived(RemoteMessage remoteMessage) { 
    // HANDLE THE FIREBASE NOTIFICATION DATA RECEIVED WHEN APP RUN IN THE FOREGROUND 

    if(remoteMessage.getData().size()>0){ 
     String title= remoteMessage.getData().get("title"); 
     String message= remoteMessage.getData().get("message"); 
     // now we send the data to the main activity 
     Intent intent= new Intent("com.fredycom.myreartime_FCM_MESSAGE"); 
     intent.putExtra("title",title); 
     intent.putExtra("message",message); 
     LocalBroadcastManager localBroadcastManager= LocalBroadcastManager.getInstance(this); 
     localBroadcastManager.sendBroadcast(intent); 
    } 

// message de traitement dans une activité

public class MainActivity extends AppCompatActivity { 
    TextView title, message; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

     // REGISTER BROADCAT RECEIVER 
     LocalBroadcastManager.getInstance(this).registerReceiver(mHandler, new IntentFilter("com.fredycom.myreartime_FCM_MESSAGE")); 
    setContentView(R.layout.activity_main); 
    title = (TextView) findViewById(R.id.title_content); 
    message = (TextView) findViewById(R.id.message_content); 

    if (getIntent().getExtras() != null) 
    { 
     for (String key : getIntent().getExtras().keySet()) { 
      if (key.equals("title")) 
      { 
       title.setText(getIntent().getExtras().getString(key)); 
      } 
      else if (key.equals("message")) 
      { 
       message.setText(getIntent().getExtras().getString(key)); 
      } 
      } 
      } 
      } 
     // HERE IS THE BROADICAST RECEIVER GET DATA FROM SMS RECIVING SERVICE 
     private BroadcastReceiver mHandler= new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String Mytitle= intent.getStringExtra("title"); 
     title.setText(Mytitle); 
     String Mymessage= intent.getStringExtra("message"); 
     message.setText(Mymessage); 
     } 
     }; 

    protected void onPause(){ 
     super.onPause(); 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(mHandler); 
    } 
} 

Répondre

1

Dans votre code PHP, vous avez

$fields= array('to'=>$token, 
'notification'=>array('title'=>$title,'body'=>$message, 
    'click_action'=>'com.fredycom.tundevufirebasemysql_TARGET_NOTIFICATION' 
)); 

Cela se traduirait par une charge utile comme ceci:

{ 
    "to": "#######", 
    "notification" : { 
    "title": "title", 
    "body" : "message", 
    "click_action" : "com.fredycom.tundevufirebasemysql_TARGET_NOTIFICATION" 
    } 
} 

Vous n'envoyez une charge utile notification -seulement. Donc, pour répondre # 1, afin d'ajouter des données dans votre notification, vous devez simplement utiliser le paramètre data comme vous le feriez avec le paramètre notification. Comme si:

$datamsg = array 
(
    'key' => 'value', 
    'key2' => 'value2', 
    'key3' => 'value3', 
); 

Ensuite, ajoutez simplement dans votre $fields:

$fields = array 
(
    'registration_ids' => $registrationIds, 
    'data'   => $datamsg 
); 

Pour # 2, vous avez déjà le code pour recevoir un message data, mais comme mentionné ci-dessus, vous envoyaient notification - seul message, donc il ne sera pas en mesure de attraper quoi que ce soit. Assurez-vous que vous êtes en spécifiant la bonne clé:

String value = remoteMessage.getData().get("key"); 
String value2 = remoteMessage.getData().get("key2"); 
String value3 = remoteMessage.getData().get("key3"); 

Si vous simplement l'espoir d'obtenir les détails du message de notification, vous devez utiliser RemoteMessage.getNotification(). Puis envoyez les données à votre activité préférée. Assurez-vous de bien comprendre comment gérer les messages que vous avez envoyés, en fonction de la charge utile. Pour plus de détails, voir le Handling Messages in Android.

+0

merci beaucoup @AL pour avoir sauvé ma vie avec cette explication incroyable .. continuez comme ça ... –

+0

De rien. Bonne chance avec votre application. :) –