0

Я хочу отправить уведомление с данными со стороны сервера и отобразить эти данные в действии по своему выбору. До сих пор мне удалось отправить уведомление с сервера и отобразить их на любую деятельность по моему выбору.Firebase отправляет уведомление с использованием значения пары ключей из сервера API

То, что я не получаю

  1. Как включить данные в уведомлении?
  2. Как получить их в результате деятельности?

Я пробовал так следовать инструкциям, но я только нашел, что они отправляют уведомление с данными из консоли Firebase.

// для серверной

<?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); 
    ?> 

// получить Служебное сообщение

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); 
    } 

// сообщение обработки в деятельности

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); 
    } 
} 

ответ

1

В вашем PHP код, у вас есть

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

Это приведет к полезной нагрузке, как это:

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

Вы только отправку notification -Только полезной нагрузки. Поэтому, чтобы ответить на # 1, чтобы добавить данные в ваше уведомление, вы должны просто использовать параметр data, как если бы вы использовали параметр notification. Как так:

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

Тогда просто добавить его в $fields:

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

Для # 2, у вас уже есть код, чтобы получать data сообщение, но, как упоминалось выше, вы посылали notification - только сообщение, поэтому он не сможет уловить что угодно. Просто убедитесь, что вы указываете правильный ключ:

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

Если вы были просто в надежде получить детали от notification сообщения, вы должны использовать RemoteMessage.getNotification(). Затем отправьте данные в вашу предпочтительную деятельность. Просто убедитесь, что вы понимаете, как обрабатывать отправленные вами сообщения, в зависимости от полезной нагрузки.

Для получения более подробной информации см. Handling Messages in Android.

+0

спасибо вам, что так много @AL для спасения моей жизни с этим невероятным объяснением .. продолжайте это ... –

+0

Добро пожаловать. Удачи с вашим приложением. :) –