UNNotificationServiceExtension - 在应用程序处于活动状态时隐藏

UNNotificationServiceExtension - hide when app is active

我正在使用 UNNotificationServiceExtension 将图像添加到 iOS APNS 通知。它运行良好,除了即使应用程序处于活动状态(在前台)也会显示通知。当应用程序处于活动状态时,我想使用 toast 处理通知,而不是在活动应用程序的顶部显示标准 iOS 通知。

问:有没有办法从通知服务扩展中检测应用程序的状态,并在应用程序处于活动状态时阻止通知显示?

application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 内调用 completionHandler(.newData) 会导致在应用内显示横幅。你可以摆脱它。

func application(_ application: UIApplication,
                   didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
   // completionHandler(.newData) // <- Comment it out
}

基于 Apple 的 documentation 默认情况下应用程序处于活动状态时不应显示通知。

If your app is in the foreground when a notification arrives, the shared user notification center calls this method to deliver the notification directly to your app. If you implement this method, you can take whatever actions are necessary to process the notification and update your app. When you finish, call the completionHandler block and specify how you want the system to alert the user, if at all.

使用通知服务扩展没关系-通知最终总是由应用程序处理,不过可以先使用扩展来修改它。

试试这个代码(事实上,因为通知会在应用程序处于活动状态时出现,你可能在某个地方实现了这个方法 - 如果你不需要它,你可以删除它)。

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    // Perform additional handling of the notification, if needed.

    completionHandler([])
}