我想更好地控制向我的用户显示哪些通知,并有选择地使其中一些人沉默。为了做到这一点,我在我的应用程序中实现了UNNotificationServiceExtension
,这允许我拦截和修改通知,即使我的应用程序没有运行。但问题是,即使我没有拨打didReceive(_:withContentHandler:)
,系统仍会在大约30秒后显示远程通知。我怎样才能防止这种情况发生?
答案 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也可以很好地工作...但是仅当您的应用程序在前台运行时才提到。显然,它也必须检查其禁用设备列表。