我正在实现具有以下目标的本地通知功能:
如果用户至少7天未访问屏幕X,则显示此通知。 仅显示一次,即使用户在第一次显示通知后没有再次访问屏幕X。
我当前的策略是安排通知在用户首次启动该应用后的7天后触发。然后,如果用户在那7天之前访问了屏幕X,我将重新安排该通知的时间,从而将计时器有效地重置为7天。我使用自定义类(NotificationManager
)来管理通知的设置和计划。您可以假设NotificationManager
的实现没有错误。
这是我的 AppDelegate.swift :
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// notification was never shown to the user
if firstEverAppLaunch {
NotificationManager.shared.schedule(notificationWithIdentifier: "remindUserToVisitScreenX")
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
if notification.request.identifier == "remindUserToVisitScreenX" {
UserDefaults.standard.set(true, forKey: "doNotShowNotificationAgain")
}
}
ScreenXController.swift
//.. some uninteresting code
override func viewWillAppear() {
// if user notification has never been shown, reschedule (i.e. reset) notification
if !UserDefaults.standard.bool(forKey: "doNotShowNotificationAgain") {
NotificationManager.shared.schedule(notificationWithIdentifier: "remindUserToVisitScreenX")
}
{
我当前的实现几乎可以通过调用willPresent notification
函数来正常工作。但是,如果通知在应用程序处于后台或处于非活动状态时到达,则willPresent
将不会被调用,因此该应用程序无法满足该通知仅在应用程序中只显示一次的要求。应用的整个生命周期。
示例:
用户一周都没有访问屏幕X。在应用程序不活动时触发通知。用户关闭通知,然后启动应用程序,而无需再访问屏幕X一周。在该周结束时,用户再次 收到通知。
答案 0 :(得分:1)
当应用在后台(挂起)或终止时用户点击或取消通知时,将通过以下UNUserNotificationCenterDelegate
方法接收回调。
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
如果用户点击并打开应用,则response.actionIdentifier
将为“ UNNotificationDefaultActionIdentifier
”。
如果用户通过在通知中点击清除选项或向左滑动通知来关闭,则response.actionIdentifier
将为“ UNNotificationDismissActionIdentifier
”。
因此,只要应用程序处于非活动状态,只要用户在通知中采取任何措施,都会在此回调中收到通知。如您所料,可以在此处安排7天本地通知。
希望有帮助。