Intereting Posts
Поиск многомерных массивов PHP (поиск по определенному значению) MAMP / Symfony: MAMP переопределяет параметр date.timezone от php.ini, Symfony не работает zf2 Создание простого сервиса и доступ к нему через viewhelper Как отправить этот XML-файл с помощью SOAP и PHP Выделите ключевые слова в абзаце Преобразовать недействительный json в действительный json Выпадающий список без кнопки отправки. как? Отображение Php Array приводит к таблице Html Cassandra + PHP + Thrift + извлекает плохую производительность нескольких строк Как построить вложенные ответы в приложении, основанном на Apigility, с использованием модели на основе ZfcBase-DbMapper? Замените слова, найденные в строке, выделенным словом, сохраняя их случай как найденный Сообщение о предупреждении PHP загрузка файла в куски с помощью html5 Максимальное количество допустимых, no max_file_uploads в php.ini Преобразование php curl в GAE urlfetch для iTunes InApp verifyReceipt

Firebase Cloud Messaging, проблемы с получением уведомлений

Я пытаюсь написать приложение для получения уведомлений через Firebase Cloud Messaging. Сначала он работал, когда я пытался отправить сообщение через консоль Firebase, но затем, когда я попытался сделать то же самое с помощью php webservice, в ответ он показал успех, но я не получил сообщение и не получил больше уведомлений через консоль firebase , Пожалуйста помоги

Код моей серверной части:

MainActivity.java

package com.example.mojojojo.firebasenotifications; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.EditText; import com.google.firebase.iid.FirebaseInstanceId; public class MainActivity extends AppCompatActivity { private EditText etToken; private SharedPreferences sp; private SharedPreferences.Editor edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etToken=(EditText)findViewById(R.id.etToken); sp=getSharedPreferences("pref",MODE_PRIVATE); edit=sp.edit(); etToken.setText(FirebaseInstanceId.getInstance().getToken()); BroadcastReceiver tokenReceiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String token=intent.getExtras().getString("token"); if(token!=null){ etToken.setText(token); } } }; registerReceiver(tokenReceiver,new IntentFilter("TOKEN_GENERATED")); } } 

Служба обмена сообщениями

 package com.example.mojojojo.firebasenotifications; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; public class MessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); String msg=remoteMessage.getNotification().getBody(); sendNotification(msg); Log.i("/>/>",msg); } 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("FCM Message") .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 , notificationBuilder.build()); } } 

Служба токенов

 package com.example.mojojojo.firebasenotifications; import android.app.Service; import android.content.Intent; import android.content.SharedPreferences; import android.os.IBinder; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; public class TokenService extends FirebaseInstanceIdService { private SharedPreferences sp; private SharedPreferences.Editor edit; @Override public void onTokenRefresh() { super.onTokenRefresh(); sp=getSharedPreferences("pref",MODE_PRIVATE); edit=sp.edit(); String token= FirebaseInstanceId.getInstance().getToken(); edit.putString("token",token); Intent tokenIntent=new Intent("TOKEN_GENERATED"); tokenIntent.putExtra("token",token); sendBroadcast(tokenIntent); } } 

манифест

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mojojojo.firebasenotifications"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MessagingService" android:enabled="false" android:exported="false" > <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name=".TokenService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> </application> </manifest> 

и мой php-код выглядит следующим образом (я удалил серверный ключ в коде)

 <?php define( 'API_ACCESS_KEY', 'YOUR-API-ACCESS-KEY-GOES-HERE' ); $registrationIds = array( $_GET['id'] ); // prep the bundle $msg = array ( 'message' => 'hi', 'title' => 'This is a title. title', 'subtitle' => 'This is a subtitle. subtitle', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . 'xxxxxxxxxxxxxxxxxxxxx', 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' ); curl_setopt( $ch,CURLOPT_POST, true ); curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) ); $result = curl_exec($ch ); curl_close( $ch ); echo $result; ?> 

Этот php-код, наконец, работал для меня.

 <?php function send_notification ($tokens) { $url = 'https://fcm.googleapis.com/fcm/send'; $priority="high"; $notification= array('title' => 'Some title','body' => 'hi' ); $fields = array( 'registration_ids' => $tokens, 'notification' => $notification ); $headers = array( 'Authorization:key=xxxxxxxxxxxxx', 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); // echo json_encode($fields); $result = curl_exec($ch); echo curl_error($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } curl_close($ch); return $result; } $tokens = array('RECEIVER-TOKEN-1' ,'RECEIVER_TOKEN-2'); $message_status = send_notification($tokens); echo $message_status; ?> 

PS: Я сейчас жестко закодировал токены приемника (для целей тестирования)

Вы не отправили то, что получите в результате сообщения после того, как вы выполните echo $result . Итак, теперь, пройдя свой код, я обнаружил:

String msg=remoteMessage.getNotification().getBody();

Эта строка вызывает проблемы. Вы должны использовать его следующим образом:

 remoteMessage.getData().get("message") remoteMessage.getData().get("title") remoteMessage.getData().get("subtitle") 

и так далее..

Для дальнейшего оформления мы используем:

remoteMessage.getNotification().getBody() когда у нас есть объект notification в JSON, который мы отправили на сервер fcm. Что в вашем случае не существует, вместо этого у вас есть объект data и для этого мы используем:

remoteMessage.getData().get("key_name")

попробуй это:

 <?php function send_notification ($tokens, $message) { $url = 'https://fcm.googleapis.com/fcm/send'; $fields = array( 'registration_ids' => $tokens, 'data' => $message ); $headers = array( 'Authorization:key = YOUR_KEY ', 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } curl_close($ch); return $result; } $conn = mysqli_connect("localhost","root","","fcm"); $sql = " Select Token From users"; $result = mysqli_query($conn,$sql); $tokens = array(); if(mysqli_num_rows($result) > 0 ){ while ($row = mysqli_fetch_assoc($result)) { $tokens[] = $row["Token"]; } } mysqli_close($conn); $message = array("message" => " FCM PUSH NOTIFICATION TEST MESSAGE"); $message_status = send_notification($tokens, $message); echo $message_status; ?> 
  <?php function send_notification ($tokens, $message) { $url = 'https://fcm.googleapis.com/fcm/send'; $fields = array( 'registration_ids' => $tokens, 'data' => $message ); $headers = array( 'Authorization:key = your token ', 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } curl_close($ch); return $result; } //Checking post request if($_SERVER['REQUEST_METHOD']=='POST'){ //Connection to database $conn = mysqli_connect("localhost","root","","bbdd"); //Geting email and message from the request $email = $_POST['Email']; $msg = $_POST['message']; //Getting the firebase id of the person selected to send notification $sql = "SELECT * FROM users WHERE email = '$email'"; $result = mysqli_query($conn,$sql); $tokens = array(); if(mysqli_num_rows($result) > 0 ){ while ($row = mysqli_fetch_assoc($result)) { $tokens[] = $row["Token"]; } } mysqli_close($conn); $message = array("message" =>"$msg"); $message_status = send_notification($tokens, $message); echo $message_status; //redirecting back to the sendnotification page header('Location: sendPushNotification.php?success'); }else{ header('Location: sendPushNotification.php'); } ?> 

одному пользователю

Это сработало для меня … конечная точка FCM, возможно, не такая надежная. Попробуй это

  $url = 'https://gcm-http.googleapis.com/gcm/send'; 

Просто это ничего не меняет. Также эта конечная точка будет продолжать жить, Google не планирует осуждать GCM, как указано в их видеороликах разработчиков.

Еще одна вещь .. есть задержка, или вы не получаете сообщение вообще. Если есть задержка, которая может быть связана с проблемой тайм-аута TCP. Попробуйте это и дайте мне знать. Удачи !!