替代UserNotificationCenterDelegate的willPresent当应用程序在

2019-05-12 11:17发布

我想弄清楚我是否可以通过本地通知完成我的目标,或者我是否需要切换到远程通知。

我通过构建播放的RSS更新的广播节目的最新一集在一天的设定时间报警程序练习的iOS 10 /斯威夫特3。 当应用程序在前台,这很容易通过UNUserNotificationCenterDelegate的willPresent函数来执行。 我只是用willPresent获取最新一集,并通过AVAudio播放器播放。

当然,如果应用程序仅在前台工作,这个功能是非常有限的。 我希望应用程序在后台或关闭时的工作方式相同。

我可以从文档看到,当应用程序是不是在前台willPresent不运行。 有另一种方式拥有本地通知执行代码之前推通知时,应用程序在后台? 或者将我必须切换到远程通知? 我看到这个回答一个相关的问题 ,但我不知道是否有一个更优雅的方式。

Answer 1:

对于iOS 10 本地通知你的运气了。

对于iOS 10 远程通知 - 无论用户交互您可以收到使用回调application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 。 (这是一种令人困惑的是,他们不推荐最通知相关的方法,但没有这一项)


回调当应用程序在前台, 你是要展现的通知:

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

    completionHandler([.alert, .sound]) // Display notification as regular alert and play sound
}

回调用于当应用程序是无论是在背景或前景中和用户轻敲动作:

例如,为您提供了用户拍了拍保存回调。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let actionIdentifier = response.actionIdentifier

    switch actionIdentifier {
    case UNNotificationDismissActionIdentifier: // Notification was dismissed by user
        // Do something
        completionHandler()
    case UNNotificationDefaultActionIdentifier: // App was opened from notification
        // Do something
        completionHandler()
    default:
        completionHandler()
    }
}

回调用于当应用程序是在任一背景,前景或(可能)悬浮状态和推送通知(远程或无声通知)到达:

当你在通知拍了拍此前iOS10 application(_:didReceiveRemoteNotification:fetchCompletionHandler:)会被调用。

但由于iOS的10 application(_:didReceiveRemoteNotification:fetchCompletionHandler:)没有呼吁 。 这只是称为远程通知到达时。 (这让我们双方在前台和后台调用)


对于预iOS的10,你可以使用旧的didReceiveLocalNotification功能和捕捉任何通知的到来。



文章来源: Alternative to UserNotificationCenterDelegate's willPresent when app is in background