You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:35:18