如何在后台显示警报之前处理通知?

时间:2017-07-13 08:50:26

标签: ios notifications

所以我的应用程序中有这个“静音聊天室”功能。 如果聊天室静音,来自该聊天室的通知数据包含“静音= 1” 如下,

AnyHashable("aps"): {
"content-available" = 1;
alert = "Android @qwer: Gggggggg";
badge = 8;
sound = default;},
 AnyHashable("custom"): {
a =     {
    comment = 423;
    event = 133;
    mute = 1;
};
}

当我收到该通知时,我根据静音布尔值确定天气以显示警报/声音

当应用程序处于前台时收到通知

时,它工作正常

它类似于:

func userNotificationCenter(_ center: UNUserNotificationCenter,  willPresent notification: UNNotification, withCompletionHandler  completionHandler: @escaping (_ options:   UNNotificationPresentationOptions) -> Void) {  let userInfo = notification.request.content.userInfo

    guard let data = userInfo["custom"] as? [String: Any] else { return }

    guard let additional = data["a"] as? [String: Any] else {
        print ("no addi")
        return }

    let mute = additional["mute"] as? NSNumber

    if mute == 1 {

        completionHandler([ .badge])

    } else if mute == 0 {

        completionHandler([.alert, .badge, .sound])

    }}

但是当app处于后台时,事情会变得棘手,

当应用在后台时收到通知时

这种方法

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

被调用,并立即显示通知警报。

所以,当App处于后台时,我怎么想静音聊天室(不显示警报和静音)...

非常感谢!!!

2 个答案:

答案 0 :(得分:2)

实现这一目标的最佳方式。

如果您的chatroommute,那么您的server已经知道,因为服务器正在发送带有push notification标志的mute : 1

因此,后端必须检查,如果mute值为true,则不要添加alert& sound中的push payload个关键字。即使应用程序在后台/前台这将工作。

示例有效负载:

{
    "aps" : {
        "content-available" : 1,
        "badge" : 8
    }
    //Custom data here.
}

答案 1 :(得分:0)

您必须实现一个Web服务,该服务接受应用程序状态的布尔值。 当您的应用程序处于后台时,您可以使用布尔值true来调用此Web服务。 对于服务器端,当此布尔值为true时,则无需从后端发送通知。