我正在尝试通过FCM将关键警报从PHP后端发送到我的iOS应用程序。问题是,通知不会被视为严重警报,也不会绕过"请勿打扰"模式。
从后端发送到 FCM 的有效负载(示例(
{
"to": "<fcm token>",
"data": {"property-1": "value-1"},
"priority": "high",
"notification": {
"title": "Hello World!",
"body": "Lorem Ipsum ...",
"badge": 1
"sound": {
"critical": 1,
"name": "default",
"volume": 1.0
},
"color": "#ffffff"
},"time_to_live": 300,
"content_available": true
}
根据Apple文档,此格式应该是有效的。
在设置中,将启用严重警报。
到目前为止,我发现的唯一可疑的事情是,保存推送通知信息的userInfo
变量sound
保存为JSON字符串而不是序列化对象。
Printing description of userInfo:
▿ 4 elements
▿ 0 : 2 elements
▿ key : AnyHashable("gcm.message_id")
- value : "gcm.message_id"
- value : <message-id>
▿ 1 : 2 elements
▿ key : AnyHashable("google.c.a.e")
- value : "google.c.a.e"
- value : 1
▿ 2 : 2 elements
▿ key : AnyHashable("aps")
- value : "aps"
▿ value : 4 elements
▿ 0 : 2 elements
- key : content-available
- value : 1
▿ 1 : 2 elements
- key : alert
▿ value : 2 elements
▿ 0 : 2 elements
- key : title
- value : Hello World!
▿ 1 : 2 elements
- key : body
- value : Lorem Ipsum ...
▿ 2 : 2 elements
- key : badge
- value : 1
▿ 3 : 2 elements
- key : sound
- value : {"volume":1.0,"critical":1,"name":"default"}
▿ 3 : 2 elements
▿ key : AnyHashable("message")
- value : "message"
- value : {"data":...}
这是 iOS 或 APNS 中的错误吗?
{"volume":1.0,"critical":1,"name":"default"}
任何想法如何使其工作?
严重警报
首先,与苹果推送通知服务相关的一些信息。
来自苹果文档: criticalAlertSetting:
启用 UNNotificationSetting.时,此属性将授权应用 播放忽略"请勿打扰"和设备的关键声音 静音开关。
对于远程通知,系统尝试在以下情况下播放关键声音 通知的有效负载包含一个声音目录,其中包含 关键键。严重警报需要由 苹果。
来自苹果文档: UNNotification内容:
不要直接创建此类的实例。对于远程 通知,此对象的内容派生自 JSON 您的服务器发送到 APNS 服务器的有效负载。
UNNotificationContent
具有以下几个属性:
var title: String // A short description of the reason for the alert.
var subtitle: String // A secondary description of the reason for the alert.
var body: String // The message displayed in the notification alert.
var badge: NSNumber? // The number to display as the app’s icon badge.
var sound: UNNotificationSound? // The sound to play when the notification is delivered.
var launchImageName: String // The name of the launch image to display when your app is launched in response to the notification
var userInfo: [AnyHashable : Any] // A dictionary of custom information associated with the notification.
var attachments: [UNNotificationAttachment] // An array of attachments to display with the notification.
请注意,sound
属性和userInfo
属性是分开的。这意味着严重警报设置必须存储在sound
下,而不是存储在userInfo
下。
Firebase Cloud Messaging (FCM(
以前,Firebase Cloud Messaging (FCM( 不支持严重警报,必须直接通过 Apple 推送通知服务 (APNS( 完成。但是,我知道 FCM API 现在对此具有sound
属性。
两个要点:
1:您必须拥有Apple的关键警报权利才能正常工作。您必须证明为什么应该允许您的应用程序绕过用户首选项以提供通知,即使打开了"请勿打扰"。然后,您必须在 Xcode 中使用此内容更新您的预配配置文件。
2:在请求通知权限时,还必须专门请求针对关键警报的权限:
var authOptions: UNAuthorizationOptions?
if #available(iOS 12.0, *) {
authOptions = [.alert, .badge, .sound, **.criticalAlert**]
} else {
authOptions = [.alert, .badge, .sound]
}
UNUserNotificationCenter.current().requestAuthorization(options:
authOptions!) { (granted, error) in
// Handle outcome here
}
然后,系统将提示用户专门允许关键通知。
总之,这在较新版本的 FCM 中应该是可能的,但前提是实施了上述步骤,则肯定会使用本机 APNS 工作。
您可能还想检查此答案,以获取使用通知扩展在收到警报时使警报变得关键的方法。mutable-content
键必须设置为 true,以便调用通知扩展。
到目前为止,我发现的唯一可疑的事情是,保存推送通知信息的userInfo变量将声音保存为JSON字符串而不是序列化对象。
这听起来确实像您可能面临的问题。根据 Apple 文档,sound
属性必须是严重警报的字典(Apple 开发人员 – 生成远程通知(:
包含严重警报的声音信息的字典。对于常规通知,请改用声音字符串。
我建议您使用像这样的工具测试发送推送通知以进行测试 GitHub – onmyway133/PushNotifications 您将声音属性指定为字典,看看会发生什么。
也许这是FCM中的一个错误?如果测试显示推送通知按预期工作,则可能是这种情况。