[英]Is it possible to prevent a remote notification from being displayed?
我想更好地控制向我的用戶顯示哪些通知並有選擇地使其中一些通知靜音。 為了做到這一點,我在我的應用程序中實現了一個UNNotificationServiceExtension
,即使我的應用程序沒有運行,它也允許我攔截和修改通知。 然而問題是,即使我不調用didReceive(_:withContentHandler:)
系統仍然會在大約 30 秒后顯示遠程通知。 我怎樣才能防止這種情況發生?
從iOS 11 開始,無法使用UNNotificationServiceExtension
顯示推送通知。
在 WWDC 17's Best Practices and What's New in User Notifications 中,Teja 明確聲明不能做這樣的事情(從 22:17 開始):
所有工作都應該是關於修改或增強此通知。 服務擴展也無權刪除此通知或阻止其顯示。 此通知將發送到設備。 相反,如果您想在后台啟動您的應用程序並運行一些額外的處理,您應該發送一個靜默通知。 您還可以發送靜默通知並在后台啟動您的應用程序,如果您想呈現條件通知,您的應用程序可以決定是否安排本地通知。
從iOS 13.3 開始,通知服務權利com.apple.developer.usernotifications.filtering允許過濾通知(如 Aviharsh Shukla 的評論中指出的那樣)。
只是為了完整性:
當應用程序不活躍(在后台或被殺死)時, Landschaft 的回答確實適用:不能抑制任何推送通知。
但是,如果應用程序在前台處於活動狀態,則可以抑制推送通知。
不使用應用程序擴展,需要從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])
}
}
從 iOS 13.3 開始是可能的。 您可以阻止它顯示在用戶通知擴展中。 您需要做的就是從 Apple 獲得通知服務權利並將 apns-push-type 標題字段設置為警報。
您可以查看所有詳細信息: https : //developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_usernotifications_filtering
很容易錯過@Lepidopteron 上面的評論並錯誤地假設絕對沒有辦法抑制推送通知 - 有,它被稱為靜默推送通知。 但是它有一些限制。 正如Apple 的文檔中所述,您每小時只能發送 2-3 個這樣的內容,並且沒有交付保證。
快速 5 iOS 11.x
我讓這個工作,但它有點跳舞。 基本上,您需要向您不想向您發送通知的設備發送一個靜默通知,然后讓該設備在發送通知之前檢查它不應該發送通知的設備列表。
willPresent 也可以完美地工作......但只有當您的應用程序在前台運行時才提到。 顯然,它也必須檢查其禁用設備列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.