我在我的应用程序中实施了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,我该如何解决?
答案 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设备发送消息,请使用数据消息。
答案 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());
}