2

我正在嘗試編寫應用程序以通過Firebase雲消息傳遞接收通知。最初,當我嘗試通過Firebase控制檯發送消息時,但當我嘗試使用php webservice執行相同操作時,作爲響應,它顯示成功,但我沒有收到消息,也無法通過Firebase控制檯獲得更多通知。請幫助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; 
?> 
+0

你什麼時候回聲'$ result'你得到任何錯誤? –

+0

不是。它顯示成功,但是當我嘗試將通知發送到我的設備但我沒有收到通知時 –

回答

4

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

P.S:我硬編碼接收的令牌截至目前(用於測試目的)

+0

感謝您的支持,效果很好。雖然由於某種原因,如果我試圖在'Authorization:key ='這樣的變量中追加密鑰。 $鍵,它不會工作。 – Eric

+1

我這樣做,但仍然沒有收到任何通知 –

1

您還沒有發佈什麼你在echo $result後得到結果消息。所以現在你的代碼去後,我發現:

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

此行是造成問題。你應該使用這樣的:

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

等..

爲了進一步清除,我們使用:

remoteMessage.getNotification().getBody()當我們在把我們送到FCM服務器的JSON對象notification 。而你的情況是不存在的,而不是你有data對象和我們使用:

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

+0

這不是我最關心的問題(和問題)。我的問題是,我嘗試了兩次編寫代碼。對於我試圖編寫的兩個應用程序,我最初都是使用Firebase控制檯獲取通知,然後嘗試執行php webservice,獲得成功但未收到通知,然後我停止從Firebase控制檯收到通知。 –

+0

嘗試在'onMessageReceived()'中記錄任何東西? –

+0

是的,我做過。 Log.i( 「/> />」,MSG); –

1

試試這個:

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

?> 
+1

它適合你嗎?另外,如果我希望通過POST請求傳遞**一個**註冊令牌,而不是從表中獲取數據值,那麼我該怎麼做呢? –

+0

是的,它爲我工作。是的,要通過郵寄請求傳遞一個註冊令牌,你會稍微改變代碼。明天,我會向你展示代碼。 – FireUser

+0

@PinakiAcharya如果你只想傳遞一個註冊令牌,你可以使用'to => your_token'而不是'registration_ids'。 –

0
<?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'); 
} 



?> 

一個用戶

0

這個工作對我來說...... FCM端點可能並不那麼可靠。試試這個

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

只是這不改變任何東西。另外這個端點將繼續存在,谷歌沒有計劃如他們的開發者視頻中提到的那樣廢棄GCM。

還有一件事..有沒有延遲,或者你根本沒有收到消息。如果由於TCP超時問題而導致延遲。試試這個,讓我知道。祝你好運 !!