将 UNNotificationRequest (UserNotificationFramework) 用于 iOS 上的仅数据本地通知

Use UNNotificationRequest (UserNotificationFramework) for data only local notification on iOS

我想在 iOS10 上使用 UserNotificationFramework 向自己发送仅数据通知——即,没有面向用户的文本或声音。基本上将它用作持久计时器,以便能够触发应用程序,如果 运行 当它触发时,检查由于令牌过期导致的会话超时之类的事情。

有点类似于本地通知中的 "content-available" 匿名推送通知。

除了需要涉及某种面向用户的数据,我无法收到触发通知外,一切正常。

这是添加到 UNUserNotificationCenter[=25] 的 UNNotificationRequestUNMutableNotificationContent 的相关部分=]触发通知。

//  content.body = "Expiration"
//  content.sound = UNNotificationSound(named: "silent-short.wav")
    content.threadIdentifier = typeIdentifier
    content.userInfo = ["1":"One"]
    content.setValue("YES", forKey: "shouldAlwaysAlertWhileAppIsForeground")

如上所述,通知根本不会触发。如果我取消注释其中任何一行——不管哪一行——它都会触发。但我不希望向用户显示文本通知横幅(在应用程序内部或外部),因此第一个没有帮助。我尝试使用无声的声音,这样系统就可以认为它正在播放声音,但用户却什么也感受不到。但是系统会发出方便的振动。在这种情况下,这不是那么方便。有没有办法让通知不振动?或任何其他方式获取仅本地数据通知?

您不能将本地通知设置为像静默推送通知一样不显示在通知中心。 UserNotifications 框架旨在以通知的形式向用户显示数据。

您只能使用推送通知实现静默通知,目前无法使用本地通知实现相同的功能。

如果您需要在您的应用程序不在前台时执行任务,您可以使用 background execution,但如果您只需要在您的应用程序在前台时执行任务 运行,那么是比使用通知更好的方法来实现这一点。尽管您的问题对您实际想要实现的目标含糊不清,但您提到了会话超时。为了测量会话超时,您可以只使用普通的 Date 对象,在您开始会话时保存当前日期并使用 Date().timeIntervalSince(date: startDate) 检查经过的时间,然后您需要使用您的令牌来决定是否令牌是否过期