FCM iOS:推送通知抛出无效参数



我正在尝试使用适用于iOS的Cloud Functions和FCM实现推送通知,但我一直被抛出此错误:

2018-05-21T13:04:00.087Z我发送推送通知:发送时出错 消息:{ 错误:请求包含无效参数。 at FirebaseMessagingError.Error (native( at FirebaseMessagingError.FirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:39:28( at FirebaseMessagingError.PrefixedFirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:85:28( at new FirebaseMessagingError (/user_code/node_modules/firebase-admin/lib/utils/error.js:241:16( at Function.FirebaseMessagingError.fromServerError (/user_code/node_modules/firebase-admin/lib/utils/error.js:271:16( 在/user_code/node_modules/firebase-admin/lib/messaging/messaging-api-request.js:149:50 at process._tickDomainCallback (internal/process/next_tick.js:135:7( 错误信息: { 代码: "消息传递/无效参数", 消息:"请求包含无效参数"},代码前缀:"消息传递" }

我在云函数中的实现如下:

exports.sendPushNotifications = functions.database.ref('/conversations/{userUid}/').onWrite((snap, context) => {
const userUid = context.params.userUid
console.log("Triggered user ", userUid)
return admin.database().ref('/fcmToken/' + userUid).once('value', snapshot => {
const values = snapshot.val()
const fcmToken = values.fcmToken
var message = {
"token": fcmToken,
"notification": {
"body": "New message"
},
"apns": {
"headers": {
"apns-priority": "5"
},
"payload": {
"aps": {
"alert": {
"body": "New message"
},
"badge": "1",
"sound": "default"
}
}
}
};
return admin.messaging().send(message)
.then((response) => {
return console.log('Successfully sent message:', response);
})
.catch((error) => {
return console.log('Error sending message:', error);
});
})
})

令人沮丧的是,当我删除整个"apns"节点时,代码实际上可以工作,即我可以接收推送通知。我想这意味着我的设置都正确完成。一旦我包含了"apns",它就开始抛出上述错误。我还参考了这三个帖子,这个,这个和这个,并确保我仔细遵循了代码和说明。由于某些原因,我无法让它工作。

我还尝试删除"notification"节点,因为文档确实提到在针对所有平台时仅使用通用键。由于我现在只针对iOS,我想我应该删除"notification"键。但它也会再次抛出相同的错误。

好吧,所以这是一个菜鸟错误。如果我只针对 iOS,则不应使用通用键是正确的。除此之外,徽章应该是Int而不是String

这段代码有效:

var message = {
"token": fcmToken,
"apns": {
"headers": {
"apns-priority": "5"
},
"payload": {
"aps": {
"alert": {
"body": "New message"
},
"badge": 1,
"sound": "default"
}
}
}
}

希望它能帮助任何面临同样问题的人。

只是为了补充这个答案。如果您同时使用 IOS 和 android,同时同时为两者提供自定义声音,则以下代码将跨平台工作并避免此问题。

const payload = {
token,
notification: {
title: `title text`,
body: `body text`,
},
android: {
// android
priority: "high", // legacy HTTP protocol (this can also be set to 10)
notification: {
channel_id: "call1",
priority: "high", // HTTP v1 protocol
notification_priority: "PRIORITY_MAX",
sound: "sound",
default_sound: true,
visibility: "PUBLIC",
},
},
apns: {
// apple
headers: { "apns-priority": "10" },
payload: {
aps: {
// If present with notification: {...}, this will create errors
// "alert": {
//   "title": `title text`,
//   "body": `body text`,
// },
badge: 1,
sound: {
critical: 1,
name: "sound.aiff",
volume: 1,
},
category: "call1",
},
},
},

相关内容

  • 没有找到相关文章