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

Posted

技术标签:

【中文标题】FCM iOS:推送通知抛出无效参数【英文标题】:FCM iOS: Push notifications throw invalid argument 【发布时间】:2018-10-31 04:02:36 【问题描述】:

我正在尝试使用 Cloud Functions 和 FCM for ios 实现 pushNotifications,但我一直抛出此错误:

2018-05-21T13:04:00.087Z 我发送推送通知:发送错误 消息: 错误:请求包含无效参数。 在 FirebaseMessagingError.Error (本机) 在 FirebaseMessagingError.FirebaseError [作为构造函数] (/user_code/node_modules/firebase-admin/lib/utils/error.js:39:28) 在 FirebaseMessagingError.PrefixedFirebaseError [作为构造函数] (/user_code/node_modules/firebase-admin/lib/utils/error.js:85:28) 在新的 FirebaseMessagingError (/user_code/node_modules/firebase-admin/lib/utils/error.js:241:16) 在 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 在 process._tickDomainCallback (internal/process/next_tick.js:135:7) errorInfo: 代码: '消息/无效参数', 消息:“请求包含无效参数。” , codePrefix: '消息'

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

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",它就会开始抛出上述错误。我还参考了这三个帖子,this、this 和 this,并确保我已仔细遵循代码和说明。由于某些原因,我无法让它工作。

我还尝试删除 "notification" 节点,因为文档确实提到在针对所有平台时只使用公共键。由于我现在只针对 iOS,我想我应该删除 "notification" 键。但同样它也会引发同样的错误。

【问题讨论】:

【参考方案1】:

好的,这是一个新手错误。如果我只针对 iOS,不应该使用公共键是正确的。除此之外,徽章应该是Int 而不是String

此代码有效:

var message = 
    "token": fcmToken,

    "apns": 
        "headers": 
            "apns-priority": "5"
        ,
        "payload": 
            "aps": 
                "alert": 
                    "body": "New message"
                ,
                "badge": 1,
                "sound": "default"
            
        
    

希望对遇到同样问题的人有所帮助。

【讨论】:

你在开玩笑,apns 有效负载对象有一个 aps 对象。感谢@Koh,终于得到了正确的结构:)【参考方案2】:

只是为了补充这个答案。如果您同时使用 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",
                    ,
                  ,
                ,

【讨论】:

以上是关于FCM iOS:推送通知抛出无效参数的主要内容,如果未能解决你的问题,请参考以下文章

通过 FCM 发送推送通知时何时使用 iOS 设备令牌?

如何使用 FCM 在 ios 推送通知中播放自定义通知声音

IONIC FCM推送通知ios,无法接收

使用 FCM 推送通知 IOS

无法接收 FCM 推送通知 IOS - 目标 C

无法接收 iOS 的 FCM 推送通知