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

4

我正在尝试使用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上开了一个工单。


你有检查 iOS 静默通知的有效载荷吗? - Rakesh Mandloi
你的意思是 iOS 文档吗? - John Doherty
请问您能否添加sendToDevice函数内部发生的内容? - Gokul G
正常通知工作正常,问题在于静音通知从未到达 - 但如果通过FWPusher发送,则可以到达。 - John Doherty
sendToDevice 内的代码是什么? - Gokul G
显示剩余10条评论
4个回答

1
您的代码看起来正确。您可以尝试在可变内容和内容可用性中尝试多个true和false的组合。 您还可以尝试不发送mutableContent字段。但是据我记得两者都应为true。
另一种调试方法是检查从nodejs输出的json。您可以在NWPusher或PostMan中尝试相同的有效载荷。这将给您一些线索。
我已经在postman中尝试过以下有效载荷,对我来说运行正常。
{"mutable_content":true,"content_available" : true,"priority":"high","registration_ids":["d3-fa7XDQQ4:APA91bEKXbT3HAv6ko9RukcxaB4QBr8zOIT06CBpj9o0Sl6TxsMpTnAMQ86t14foIcuQuDUyzMApbvDORELYyD0WOX3BcfP7ZNtWx9uY0JGm2B7cmdlPoOFs68fe6rz3Q7tq_8Ib7Y4H"]}

@JohnDoherty,你尝试过在可变内容和内容可用性中使用true和false的组合吗? - Gokul G

0

对于仍然遇到此问题的任何人,正如Gokul所提到的,代码是完全正确的

只需确保您按照Apple文档中的步骤进行操作

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

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

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

enter image description here


0

对于静默通知,您需要确保以下几点:

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

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

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

示例有效负载:

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

欲了解更多信息,请查看苹果的参考文献:静默推送应用更新


-3

这是用于 iOS 静默推送的 PHP 版本。请添加 '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"
  }
}

您一定是在使用旧版本的API,因为当我使用那个有效载荷时,会收到以下错误提示:消息载荷包含无效的“aps”属性。有效的属性为“data”和“notification”。 - John Doherty
我尝试过了,但是出现了我提到的错误。就像我说的那样,你可能在使用不同版本的API。 - John Doherty
问题并没有要求提供 PHP 脚本。 - Aakash Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接