是否可以阻止显示远程通知?

时间:2017-04-19 15:19:27

标签: ios swift apple-push-notifications

我想更好地控制向我的用户显示哪些通知,并有选择地使其中一些人沉默。为了做到这一点,我在我的应用程序中实现了UNNotificationServiceExtension,这允许我拦截和修改通知,即使我的应用程序没有运行。但问题是,即使我没有拨打didReceive(_:withContentHandler:),系统仍会在大约30秒后显示远程通知。我怎样才能防止这种情况发生?

5 个答案:

答案 0 :(得分:5)

从iOS 11开始,无法使用UNNotificationServiceExtension来抑制推送通知。

在WWDC 17的Best Practices and What’s New in User Notifications中,Teja明确表示不能做这样的事情(从22:17分开始):

  

所有工作都应该是修改或增强此通知。服务扩展程序也无权删除此通知或阻止其显示。   此通知将传递给设备。如果您想在后台启动应用程序并运行一些其他处理,则应发送静默通知。您还可以发送静音通知并在后台启动您的应用,如果您想要提交条件通知,您的应用可以决定是否安排本地通知。

答案 1 :(得分:2)

从 iOS 13.3 开始是可能的。 您可以阻止它显示在用户通知扩展中。 您需要做的就是从 Apple 获得通知服务权利,并将 apns-push-type 标头字段设置为警报。

您可以在此处查看所有详细信息:https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_usernotifications_filtering

答案 2 :(得分:0)

只是为了完整性:

当应用程序处于不活动状态 (在后台或被终止)Landschaft's answer确实适用时:人们无法禁止任何推送通知。

但是,如果应用处于活动状态 在前台,则 可能会禁止推送通知。

除了使用应用程序扩展程序之外,还需要从willPresent实现UNUserNotificationCenterDelegate功能。

这里可以过滤通知,并在completionHandler中返回允许显示的方式:
•不显示任何内容:completionHandler([])
•仅显示警报:completionHandler([.alert])
•显示带有声音的警报:completionHandler([.alert, .sound])
•等...

我们想显示本地通知,但从不显示推送通知,因为我们使用自定义UI在应用程序内处理它们:

func userNotificationCenter(_ center: UNUserNotificationCenter, 
                            willPresent notification: UNNotification, 
                            withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    if response.notification.request.trigger is UNPushNotificationTrigger {
        completionHandler([])
    } else {
        completionHandler([.alert, .badge])
    }
}

答案 3 :(得分:0)

很容易错过@Lepidopteron上面的评论,并错误地认为绝对没有办法抑制推送通知-存在,称为静默推送通知。但是它有一些限制。如Apple's docs中所述,您每小时只能发送其中的2-3条,并且不保证送货。

答案 4 :(得分:0)

swift 5 iOS 11.x

我让它起作用了,但是有点跳舞。基本上,您需要向您不想发送通知的设备发送静默通知,然后让该设备在发送通知之前检查它也不应发送通知的设备列表。

willPresent也可以很好地工作...但是仅当您的应用程序在前台运行时才提到。显然,它也必须检查其禁用设备列表。