Ios APNS严重警报被视为正常通知

Ios APNS严重警报被视为正常通知,ios,json,swift,firebase-cloud-messaging,apple-push-notifications,Ios,Json,Swift,Firebase Cloud Messaging,Apple Push Notifications,我正在尝试通过FCM将关键警报从PHP后端发送到我的iOS应用程序。问题在于,通知不会被视为严重警报,也不会绕过“请勿打扰”模式 从后端发送到FCM的有效负载(示例) 这是iOS还是APN中的错误 {“卷”:1.0,“关键”:1,“名称”:“默认”} 有什么办法让它工作吗 到目前为止,我发现唯一可疑的事情是,保存推送通知信息的userInfo变量将声音保存为JSON字符串,而不是序列化对象 Printing description of userInfo: ▿ 4 elements ▿ 0

我正在尝试通过FCM将关键警报从PHP后端发送到我的iOS应用程序。问题在于,通知不会被视为严重警报,也不会绕过“请勿打扰”模式

从后端发送到FCM的有效负载(示例)

这是iOS还是APN中的错误

{“卷”:1.0,“关键”:1,“名称”:“默认”}

有什么办法让它工作吗

到目前为止,我发现唯一可疑的事情是,保存推送通知信息的userInfo变量将声音保存为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":...}
这听起来确实是你可能面临的问题。根据苹果的文档,
sound
属性必须是关键警报的字典():

包含关键警报的声音信息的词典。对于常规通知,请改用声音字符串

我建议您使用这样的工具测试发送推送通知,以便进行测试,在该工具中,您可以将sound属性指定为字典,然后看看会发生什么

也许这是FCM中的错误?如果测试显示推送通知按预期工作,则可能是这种情况。

严重警报 首先,苹果推送通知服务的相关信息

来自苹果文档:

启用UNNotificationSetting.enabled时,此属性授权应用程序 播放忽略请勿打扰和设备 静音开关

对于远程通知,当 通知的有效负载包含一个声音目录,其中包含 关键键。关键警报需要由以下机构发布的特殊权限: 苹果

来自苹果文档:

不要直接创建此类的实例。远程 通知时,此对象的内容派生自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云消息传递(FCM)

以前,Firebase云消息(FCM)不支持关键警报,必须直接通过Apple推送通知服务(APNS)完成。但是,据我所知,FCM API现在有了一个
声音
属性


两个要点

1:您必须从苹果公司获得一个许可证,才能使其正常工作。你必须证明为什么你的应用程序应该被允许绕过用户偏好来提供通知,即使在“请勿打扰”处于打开状态时也是如此。然后,您必须在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的较新版本中应该是可能的,但如果实现了上述步骤,则肯定可以使用本机APN


您可能还需要检查一种方法,以便在收到警报时使用通知扩展名使其成为关键警报。
可变内容
键必须设置为true,以便调用通知扩展。

您的应用程序是否具有严重警报权限?你不能只是决定发送关键警报。苹果必须同意你的应用程序值得绕过用户设置,然后用户也必须批准它。是的,我有权利和正确的配置文件。我真的没有答案给你,但我从一位同事那里得知,他在无声推送中挣扎,但没有成功,他通过改变通知标题的顺序来解决这个问题。他用的是AWS SNS。我很困惑。
{“volume”:1.0,“critical”:1,“name”:“default”}
难道不是字典吗?!我知道您已启用关键警报,但请尝试在此之后重新启动。感谢您的宝贵反馈!如果新的FCM HTTP v1 API有效,我将尝试它。我还获得了苹果公司的授权,并启用了关键警报的开发配置文件。我尝试了新的FCM HTTP v1 API与kreait/firebase php的结合,现在它工作得很好。谢谢不幸的是,这个测试工具不起作用,但我尝试了一个在线FCM测试工具,并在iOS上收到了通知,但它不是严重警报。
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
}