【问题标题】:How do I make a UNUserNotification that's consistent through app states?如何通过应用程序状态创建一致的 UNUserNotification?
【发布时间】:2019-07-11 08:48:18
【问题描述】:

我制作了这样的 UNUserNotification:

    let content = UNMutableNotificationContent()
    content.title = "a title"
    content.body = "a body"
    content.sound = .default

    content.categoryIdentifier = "\(type(of: self))"

    let request = UNNotificationRequest(
        identifier: UUID().uuidString,
        content: content,
        trigger: UNTimeIntervalNotificationTrigger(timeInterval: 0.01, repeats: false)
    )

    let category = UNNotificationCategory(
        identifier: content.categoryIdentifier,
        actions: [
            UNNotificationAction(identifier: Strings.accept.id, title: Strings.accept.title, options: [.authenticationRequired, .foreground]),
            UNNotificationAction(identifier: Strings.reject.id, title: Strings.reject.title, options: [.authenticationRequired, .destructive])
        ],
        intentIdentifiers: [],
        options: .customDismissAction
    )

它将显示一个带有标题和正文的通知,以及两个自定义操作按钮(接受和拒绝,这是一个来电)。它也会播放声音,但由于某种原因,如果应用程序处于前台则不会。
我还尝试用它来伪造一个持久通知,就像 Whatsapp 通过每约 4 秒重复一次本地通知来做到这一点的方式一样,但是第二次显示通知时声音被切断了一点。这不是第一个的声音,第二个显示有自己的声音播放,但这一次并没有完全播放出来。声音只有约 1-2 秒。
我不明白为什么会有这些差异,如何让它始终播放声音(前景、背景、不运行)以及如何确保在第二次显示通知时声音不会被切断?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    当应用程序运行时收到通知时,通知通常会被静音,以便应用程序能够以更原生的方式处理它们。

    如果我没记错的话,收到通知会调用:

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler:
        @escaping (UNNotificationPresentationOptions) -> Void) {
    
        if someCondition {
            completionHandler(.alert)
        } else {
            completionHandler(.init(rawValue: 0))
        }
    }
    

    当收到通知时调用此方法,如果应用程序在前台运行,通常会静音。完成处理程序确定应该采取什么行动以及是否应该显示通知或发出声音等。

    在这种情况下,如果 someCondition 为真,那么它应该像往常一样在本机显示通知,否则不做任何事情。

    尝试在您的应用中使用此方法调用completionHandler(.alert),您的通知应该会显示

    查看documentation here

    【讨论】:

    • 抱歉,您是否阅读过文档链接?它没有指定远程通知。它是在 iOS 10 中引入的 UserNotifications SDK,并且此委托方法确实声明为它的描述:“询问委托如何处理在应用程序在前台运行时到达的通知。”
    • 这个link/tutorial也解释了同样的事情,特别是形成一个本地通知的角度
    • 您指定了远程通知(“收到通知时”)。所以我假设你在谈论推送/远程通知。您的委托方法已经到位,它调用完成处理程序。否则通知根本不会显示。但就像我在帖子和评论中所说的那样,问题在于声音,特别是声音在前景/背景中的工作方式的差异。我一点也不明白这如何回答这个问题。是的,我阅读了文档,但没有帮助,所以现在我在这里。
    • 好的,我知道这可能会导致混乱,但对于 SDK 来说,通知就是这样,不管它是远程的还是本地的。我试图在我的回答和 cmets 中指出的关键部分是,当应用程序处于前台时会调用此委托方法,默认情况下,当您的应用程序处于前台时,通知本身通常会被静音。所以在这个方法中你可以返回completionHandler([.alert, .sound]) 这可能会解决你的问题。
    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多