remoteMessage.getNotification()中的错误.getBody()

时间:2016-06-02 06:54:42

标签: android firebase firebase-cloud-messaging

我在我的应用程序中实施了Firebase Cloud Messaging,在使用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 个答案:

答案 0 :(得分:25)

尝试在$ 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设备发送消息,请使用数据消息。

检查Documentation for Advanced Messaging Options以供参考。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我正在使用Node后端,其中我的示例推送(来自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});
  })

在Android方面:

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

NullPointerException是由于在服务器端使用getNotification().getBody()而不是getData().get("score")时使用Data Payload而不是Notification Payload造成的:

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

答案 3 :(得分:-2)

if (remoteMessage.getNotification() != null) {
   sendNotification(remoteMessage.getNotification().getBody());
}