iOS如何实现特定推送仅角标显示?营销与高频消息差异化处理
实现差异化推送通知展示的方案
嘿,这个需求完全可行!我来给你拆解下具体怎么实现——核心是利用APNs(Apple Push Notification service)的payload配置,结合App端的通知代理逻辑,就能精准区分不同类型推送的展示行为。
1. 从推送Payload入手控制展示逻辑
这是最直接的方式,通过调整推送请求里的aps字段,就能让系统自动处理不同类型的推送:
- 高频话题类(仅角标):
不要在aps里包含alert字段(或者显式设为null),只保留badge字段来指定角标数值。这样系统只会更新主屏幕的App角标,不会显示锁屏通知,也不会把这条推送存入通知中心。
示例Payload:{ "aps": { "badge": 3, // 这里可以设为具体数值,或者用"+1"来增量更新(需要服务器配合计算当前角标数) "sound": null // 如果不需要提示音,直接去掉或设为null }, "push_type": "breaking_news" // 自定义字段,方便App端识别推送类型 } - 营销类推送:
正常配置alert、sound、badge字段,系统就会按照常规逻辑展示横幅、锁屏通知,并将推送存入通知中心。
示例Payload:{ "aps": { "alert": { "title": "限时优惠", "body": "全场商品8折起!" }, "sound": "default", "badge": 1 }, "push_type": "marketing" }
2. App端代理的辅助加固(可选但推荐)
为了避免极端场景下的意外展示,你可以通过UNUserNotificationCenterDelegate的方法,在推送到达时主动控制展示选项:
实现userNotificationCenter(_:willPresent:withCompletionHandler:)方法,根据自定义的push_type字段判断推送类型,然后指定对应的展示选项:
import UserNotifications class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo guard let pushType = userInfo["push_type"] as? String else { // 默认按授权的所有选项展示 completionHandler([.alert, .sound, .badge]) return } if pushType == "breaking_news" { // 仅更新角标,不展示其他内容 completionHandler([.badge]) } else { // 营销类推送,展示所有授权的选项 completionHandler([.alert, .sound, .badge]) } } }
记得在App启动时设置这个代理:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().delegate = NotificationDelegate() return true }
3. 权限相关注意事项
你已经请求了.alert, .sound, .badge的权限,这完全没问题——即使拥有.alert权限,只要推送Payload里不包含alert字段,或者在代理方法里指定仅展示.badge,系统就不会弹出alert通知。唯一需要确保的是,你的App已经获得了.badge权限,这一点你已经覆盖到了。
内容的提问来源于stack exchange,提问作者jugutier
相关产品推荐
相关产品推荐

