8

我在我的应用程序中实现了 Firebase 云消息传递,并且在使用 Firebase 控制台时,我在 Android 和 iOS 中的应用程序会收到我的通知。但是因为我想每天推送通知,所以我创建了一个 cron 作业来在我的服务器端执行此操作。我注意到每次我触发我的 cron 我的应用程序崩溃

在我的 iOS 客户端中,它没有收到任何通知。

在我的 android 客户端中,它显示一个错误:

java.lang.String com.google.firebase.messaging.RemoteMessage$Notification.getBody()' on a null object reference

它在我FirebaseMessagingService这里是我的代码

public class MyFirebaseMessagingService  extends FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    Log.d(TAG, "From: " + remoteMessage.getFrom());
    Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());

    sendNotification(remoteMessage.getNotification().getBody());
} 

在我的服务器端

function sendNotificationFCM($apiKey, $registrationIDs, $messageText,$id) {


$headers = array(
    'Content-Type:application/json',
    'Authorization:key=' . $apiKey
);

$message = array(
    'registration_ids' => $registrationIDs,
    'data' => array(
            "message" => $messageText,
            "id" => $id,
    ),
);


$ch = curl_init();

curl_setopt_array($ch, array(
    CURLOPT_URL => 'https://fcm.googleapis.com/fcm/send',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => json_encode($message)
));

$response = curl_exec($ch);
curl_close($ch);

return $response;
}

我想知道为什么我有一个 NPE,我该如何解决它?

4

4 回答 4

29

尝试在 $message 上添加通知对象。您的 POST 请求的正文必须类似于:

{
    "to" : "aUniqueKey",
    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
}

您的remoteMessage.getNotification()退货null是因为您的 POST 请求的正文不包含通知对象。

当您希望 FCM 代表您的客户端应用处理显示通知时,请使用通知。当您希望您的应用程序在您的 Android 客户端应用程序上处理显示或处理消息时,或者如果您希望在存在直接 FCM 连接时向 iOS 设备发送消息,请使用数据消息。

检查高级消息传递选项的文档以供参考。

于 2016-06-02T07:13:59.133 回答
1
if (remoteMessage.getNotification() != null) {
   sendNotification(remoteMessage.getNotification().getBody());
}
于 2016-11-05T01:59:19.873 回答
1
function sendNotificationFCM($apiKey, $registrationIDs, $messageText,$id) {



    $headers = array(
        'Content-Type:application/json',
        'Authorization:key=' . $apiKey
    );

    $message = array(
        'registration_ids' => $registrationIDs,
        'data' => array(
                "message" => $messageText,
                "id" => $id,
        ),
     'notification' => array(
                "body" => "body of notification",
                "title" => "title for notification",
        )
    );


    $ch = curl_init();

    curl_setopt_array($ch, array(
        CURLOPT_URL => 'https://fcm.googleapis.com/fcm/send',
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS => json_encode($message)
    ));

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
    }
于 2019-01-13T07:58:44.543 回答
0

我遇到了同样的问题,并通过一些实验找到了解决方案。

我正在使用 Node 后端,我的 Sample Push(取自 Google Firebase)如下所示:

const message = {
    data: {score: '850', time: '2:45'},
    tokens: nTokenArray
}


admin.messaging().sendMulticast(message)
  .then((response) => {
    if (response.failureCount > 0) {
      const failedTokens = [];
      response.responses.forEach((resp, idx) => {
        if (!resp.success) {
          console.log('resperrorresperrorresperrorresperror', resp.error);
          failedTokens.push(registrationTokens[idx]);
        }
      });
      console.log('List of tokens that caused failures: ' + failedTokens);
    }
  })
  .catch(fcmError => {
    console.log({'FCM Errors': fcmError});
  })

在安卓端:

Log.d(TAG, "BodyScore: " + remoteMessage.getData().get("score"));

NullPointerException是由于您使用getNotification().getBody()而不是在服务器端getData().get("score")使用而不是:Data PayloadNotification Payload

const message = {
    data: {score: '850', time: '2:45'},
    tokens: nTokenArray
}
于 2019-07-24T07:37:45.720 回答