【问题标题】:Firebase FCM silent push notifications for iOS适用于 iOS 的 Firebase FCM 静默推送通知
【发布时间】:2017-04-09 23:55:33
【问题描述】:

我在 iOS 上遇到了静默通知问题。

当我的应用程序处于后台时,我没有收到 FCM 发送的静默通知。但如果我尝试直接发送到 APNS,则成功接收到通知。

这是发送到 FCM 的 JSON:

{ 
"to" : "<token>",
"priority": "high",
"content_available": true,
"data" : {
  "<key>" : "<string>",
  "<key2>" : "<string>"
}

}

这是直接发送到 APNS 的 JSON:

{
  "aps": {
    "content-available": 1
  },
  "<key>": "<string>",
  "<key>": "<string>"
}

我已经尝试删除“priority”键,因为我看到有人说如果“content_available”已经设置,我不应该设置优先级。没用。

  1. 我在 XCode > Capabilities 中启用了“推送通知”。
  2. 我在 XCode > 功能的后台模式中选中了“远程通知”。
  3. 当应用程序在前台时,有时当应用程序在后台时,FCM 通知工作正常。

【问题讨论】:

    标签: ios firebase notifications apple-push-notifications firebase-cloud-messaging


    【解决方案1】:

    去掉"notification"键值对,添加"content_available": true

    看起来像这样

    { 
        "to" : "...",
        "priority": "high",
        "content_available": true,
        "data" : {
          ....
        }
    }
    

    这应该使其成为静默 APNS,您需要使用相应的 APNS 委托方法进行处理。

    您需要通过委托来处理此问题 有关详细信息,请参阅此 firebase 文档:https://firebase.google.com/docs/cloud-messaging/concept-options

    【讨论】:

      【解决方案2】:

      我找到了解决方法。我在“通知”字段中为“声音”设置了一个空值,即使应用程序在后台,也会发送无声通知。

      { 
          "to" : "...",
          "priority": "high",
          "notification": {
              "sound": ""
          },
          "data" : {
            ....
          }
      }
      

      我的预感是 Apple 不允许具有“高”优先级的静默通知,并且以某种方式 "notification": {"sound": ""} 欺骗 APNS,认为此通知不是静默通知。

      【讨论】:

      • 设置好通知对象后,就变成了普通的推送通知。这根本不是静默推送通知。
      • 如何通过 FCM 消息控制台发送静默通知?
      【解决方案3】:

      如果你使用的是云功能,我发现很多资料,甚至在官方文档中已经过时,或者与打字稿接口不同。

      这终于对我有用了。而不是设置alert: "",只需将其排除在外,它是可选的。对于自定义属性,您可以添加到 message.apns.payload。 fcmToken 应该是用户设备上的令牌。

        const message: TokenMessage = {
          token: fcmToken,
          apns: {
            headers: {
              "apns-priority": "5",
            },
            payload: {
              aps: {
                contentAvailable: true,
              },
              my_custom_parameter: true,
            },
          },
        };
      
        admin
          .messaging()
          .send(message)
          .then(() => {
            // do something.
          })
          .catch((error) => {
            functions.logger.error(
              "Error sending push notification: " + error.toString()
            );
            // Do something.
          });
      };
      

      【讨论】:

        【解决方案4】:

        我正在使用 nodejs 处理 Firebase 静默推送通知。当我尝试下面的代码时,它工作正常。当我添加 "priority": "high" 和 "content_available": true 时,它​​给出了以下错误。

        在代码下面工作

        const admin = require('firebase-admin');
        const serviceAccount ="...."; //service account path
        admin.initializeApp({
          credential: admin.credential.cert(serviceAccount)
        });
        
        let  fcmToken = "...."; // Your token
        let message ={
            "token": fcmToken,
            "data": {
                "updateApi": "activity"
            }
        } 
        
        admin.messaging().send(message)
          .then((response) =>{
            console.log('Successfully sent notification:', response);
        })
          .catch((error) =>{
            console.log('Error while sending notification:', error);
        });
        

        在消息对象中添加 prioritycontent_available 时出错

        { code: 'messaging/invalid-argument',
             message: 'Invalid JSON payload received. Unknown name "priority" at \'message\': Cannot find field.\nInvalid JSON payload received. Unknown name "content_available" at \'message\': Cannot find field.' },
          codePrefix: 'messaging' }
        

        【讨论】:

        • 是的,只是不要在上面的消息对象中传递 prioritycontent_available
        • 那么如何控制这些值。我可以在哪里更改优先级和 content_available 值?
        【解决方案5】:

        请按照documentation for server side 并按照文档中的说明为 json 进行设置。我之前遇到过类似的问题并解决了这个文档的问题。

            {
          "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
          "priority" : "high",
          "content_available": true,
          "notification" : {
            "body" : "",
            "title" : "",
            "icon" : "new"
          },
          "data" : {
            "volume" : "3.21.15",
            "contents" : "http://www.news-magazine.com/world-week/21659772"
          }
        }
        

        content_available = true and body, title empty 完成任务。

        【讨论】:

        • 但我不希望用户在通知中心收到通知。我只想要一个静默通知,它将在“didReceiveRemoteNotification”中执行一些代码。这就是“静默通知”的含义。
        • @vladiulianbogdan 运气好吗?
        猜你喜欢
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 2020-05-22
        • 2018-05-25
        • 1970-01-01
        • 2017-02-26
        相关资源
        最近更新 更多