适用于 iOS 的 Firebase FCM 静默推送通知
Posted
技术标签:
【中文标题】适用于 iOS 的 Firebase FCM 静默推送通知【英文标题】:Firebase FCM silent push notifications for iOS 【发布时间】: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”已经设置,我不应该设置优先级。没用。
-
我在 XCode > Capabilities 中启用了“推送通知”。
我在 XCode > 功能的后台模式中选中了“远程通知”。
当应用程序在前台时,有时当应用程序在后台时,FCM 通知工作正常。
【问题讨论】:
【参考方案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);
);
在消息对象中添加 priority 和 content_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'
【讨论】:
是的,只是不要在上面的消息对象中传递 priority 和 content_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 运气好吗?以上是关于适用于 iOS 的 Firebase FCM 静默推送通知的主要内容,如果未能解决你的问题,请参考以下文章
我正在使用 `fcm` gem 发送推送通知,它适用于 android 但不适用于 IOS
FCM 检测 IOS 上的应用程序卸载(firebase 云消息推送通知)