Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以阻止显示远程通知?_Ios_Swift_Apple Push Notifications - Fatal编程技术网

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

Ios 是否可以阻止显示远程通知?,ios,swift,apple-push-notifications,Ios,Swift,Apple Push Notifications,我希望更好地控制向用户显示的通知,并有选择地使其中一些通知静音。为了做到这一点,我在我的应用程序中实现了一个,它允许我拦截和修改通知,即使我的应用程序没有运行。然而,问题是,即使我不调用didceive(:withContentHandler:),系统仍会在大约30秒后显示远程通知。如何防止这种情况发生?从iOS 11开始,无法使用UnnotificationService Extension来禁止显示推送通知 在WWDC 17中,Teja明确表示这样的事情不能做(从22:17分开始): 所有工

我希望更好地控制向用户显示的通知,并有选择地使其中一些通知静音。为了做到这一点,我在我的应用程序中实现了一个,它允许我拦截和修改通知,即使我的应用程序没有运行。然而,问题是,即使我不调用
didceive(:withContentHandler:)
,系统仍会在大约30秒后显示远程通知。如何防止这种情况发生?

从iOS 11开始,无法使用
UnnotificationService Extension来禁止显示推送通知

在WWDC 17中,Teja明确表示这样的事情不能做(从22:17分开始):

所有工作都应该是修改或增强此通知。服务扩展也无权删除此通知或阻止其显示。 此通知将发送到设备。如果您想在后台启动应用程序并运行其他处理,则应发送静默通知。您还可以发送静默通知并在后台启动您的应用程序,如果您希望提供有条件通知,您的应用程序可以确定是否计划本地通知

从iOS 13.3中,通知服务授权允许过滤通知(如Avirharsh Shukla评论中所指出的)。

仅为完整起见:

当应用程序未处于活动状态时(在后台或已被杀死):无法抑制任何推送通知

但如果应用程序在前台处于活动状态,则可以抑制推送通知

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

在这里可以过滤通知,并在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])
    }
}

很容易错过上面@Lepidopteron的一条评论,错误地认为根本没有办法抑制推送通知——确实有,这被称为静默推送通知。但它也有一些局限性。如中所述,您每小时只能发送其中的2-3个,并且没有交货保证。

swift 5 iOS 11.x

我让这个工作,但它是一个舞蹈位。基本上,您需要向不想发送通知的设备发送静默通知,然后让该设备在发送通知之前检查不应发送通知的设备列表


willPresent也很好用。。。但是,正如前面提到的,只有当应用程序在前台运行时才可以。显然,它也必须检查其禁用设备列表。

从iOS 13.3开始,这是可能的。 您可以阻止它显示在用户通知扩展中。 您需要做的就是从Apple获得通知服务授权,并将apns推送类型标题字段设置为警报


您可以查看以下所有详细信息:

静默推送不适用于您的特定情况?@鳞翅目昆虫静默通知被限制,苹果建议每小时使用的次数不要超过几个。嗯,因此,在您的情况下,您需要每小时频繁发送推送通知,但希望超过发送给用户的通知?您能在服务器端修复它,以便它从那里发送摘要吗?@boidkan这不会有什么区别,因为我仍然无法删除以前收到的远程通知。问题是为什么不能?在同一个视频中,他们明确表示扩展不能阻止通知的显示。但是为什么没有说为什么不呢。他们是否打算采用其他机制?在我们的案例中,我们有多个轮班的员工使用同一部电话。手机可能会收到以前用户的通知。扩展可以过滤掉它们,但我们无法隐藏它。我们能做的最好的事就是修订。这远非理想。我的情况和@David所说的一样,有人找到了解决办法吗?看看这个