无法使用FCM向iOS发送静默推送通知

时间:2019-02-27 13:20:07

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

我正在尝试使用node.js模块firebase-admin 7.0.0和以下代码向iOS设备发送静默数据通知:

// load lib
var firebase = require('firebase-admin');

// add API keys
firebase.initializeApp({
    credential: firebase.credential.cert('./certs/firebase-private-key.json')
});

// device token send back from device
var token = '00397db1aa2f1fa625f71deef0c8e8ef0d4427cf60a13c0fb4bd290dcec41f4b';

// data message to send (contains no notification details so should be silent)
var message = {
   data: {
      key1: 'hello',
      key2: 'world'
   }
};

var options = {
    priority: 'high',
    timeToLive: 60 * 60 * 24,
    contentAvailable: true,
    mutableContent: true
};

// send the message
firebase.messaging().sendToDevice(token, message, options).then(function (res) {
    // it worked!
    console.log(res);
})
.catch(function (err) {
    // it failed :(
    console.log(err);
});

我收到一条回复,说邮件已发送,但从未到达设备。而如果我使用NWPusher发送消息,则(以下示例有效负载)可以正常工作:

{"aps":{ "content-available": 1,"badge":0, "hello": "there" }}

有什么想法吗?

仅供参考:我也在GitHub上打开了一张票证

4 个答案:

答案 0 :(得分:2)

您的代码看起来正确。您可以在可变内容和可用内容中尝试对与错的多种组合。 您也可以尝试不发送mutableContent字段。但是据我记得,两者都应该是正确的。

另一种调试方法是检查从nodejs输出的json。您可以尝试相同 NWPusher或PostMan中的有效负载。这会给你一些线索。

我已经在邮递员中尝试了以下有效负载,对我来说它工作正常

{"mutable_content":true,"content_available" : true,"priority":"high","registration_ids":["d3-fa7XDQQ4:APA91bEKXbT3HAv6ko9RukcxaB4QBr8zOIT06CBpj9o0Sl6TxsMpTnAMQ86t14foIcuQuDUyzMApbvDORELYyD0WOX3BcfP7ZNtWx9uY0JGm2B7cmdlPoOFs68fe6rz3Q7tq_8Ib7Y4H"]}

答案 1 :(得分:0)

对于无声通知,您需要确保以下几点:

1-您的有效负载中没有alert

2-您的有效载荷中有content-available" : 1

3-启用了推送通知的后台模式(选择目标>功能>后台模式>远程通知)

有效载荷样本:

{
    "aps" : {
        "content-available" : 1
    },
    "acme1" : "bar",
    "acme2" : 42
}

有关更多信息,请查看Apple的参考文献:Pushing Updates to Your App Silently

答案 2 :(得分:0)

对于仍然有此问题的任何人,正如 Gokul 所说,代码很好

只要确保您按照 Apple docs

中的步骤进行操作

特别要确保您向 AppDelegate 添加了正确的回调: application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

请注意,它与用于处理常规通知的不同application(_:didReceiveRemoteNotification:)

还要确保在项目设置中的后台模式下打开远程通知,如here所述:

enter image description here

答案 3 :(得分:-1)

这是PHP版本,可用于iOS静默发送。请添加'content-available'=> 1进行静默通知

 $body = array(
   'content-available' => 1,
   'sound' => ''
 ); 

{
  "aps" : {
    "alert" : "Notification with custom payload!",
    "badge" : 1,
    "content-available" : 1
  },
  "data" :{
    "title" : "Game Request",
    "body" : "Bob wants to play poker",
    "action-loc-key" : "PLAY"
  }
}