大多数推送通知指南讲的都是用户看得见的消息。静默推送通知恰恰相反——用户永远看不到它们,而它们承担的是完全不同的工作。
静默推送在后台唤醒你的 App,执行一个任务,然后让它重新进入休眠。没有提醒、没有声音、没有角标。用户打开 App,发现最新内容已经加载好了。他们并不知道刚刚发生过一次推送——这正是它的意义所在。
对于出海企业来说,这一点尤其关键:你的海外用户分布在不同时区、不同网络环境下,App 打开瞬间是否”已经就绪”,直接影响海外市场的留存表现。本文将讲解静默推送在 iOS(APNs)和 Android(FCM)上的工作原理、代码实现,以及如何把它作为用户旅程编排的一环,用于出海运营。同时你会看到 Pushwoosh 如何统一处理跨平台静默推送投递,并把它整合进自动化流程。
延伸阅读:移动推送通知的工作原理 | 什么是推送通知?
什么是静默推送通知?
静默推送通知是由服务端发起的消息,它在后台唤醒 App,但不向用户展示任何内容。没有提醒、没有声音、没有角标。操作系统收到推送后,短暂激活 App,App 执行后台任务,随后重新休眠。
它与普通推送的区别很简单:可见推送是发给用户的消息;静默推送是发给 App 的指令。
在这几秒后台时间里,App 能做什么?
- 拉取新内容。 提前获取最新文章、更新后的商品目录或刷新的信息流,让用户打开 App 时一切就绪。
- 同步数据。 把服务端或其他渠道发生的变化更新到本地状态——比如用户在网页端完成的一笔下单、后台系统中的状态变更。
- 评估位置。 检测用户是否进入或离开某个 geofence,而无需用一条可见通知作为触发条件。
- 更新用户标签或分群数据。 把最新的行为信号回传到 CDP,确保定向投放始终精准。
- 为即将到来的可见通知预加载内容。 提前准备好应用内消息或富媒体推送(rich push)的内容,触发时即可瞬间渲染。
实际价值在于:用户打开的是一个已经更新好的 App,没有加载转圈,也没有过时数据。这种”快”和”新鲜”的感知会对留存产生可量化的影响——即便用户说不清为什么用起来这么顺手。对于跨境电商、出海游戏这类高度依赖留存的品类,这种体验差异往往就是复购与卸载之间的分水岭。
静默推送通知的工作原理
投递链路与普通推送通知相同:你的服务端把 payload 发送给 APNs(iOS)或 FCM(Android),服务把它投递到设备,操作系统据此执行操作。不同之处在于 payload 的结构,以及操作系统在收到它时的行为。
投递流程
- 服务端发送 payload。 你的后端或 Pushwoosh 向 APNs 或 FCM 发送一条特制消息。
- 服务投递到设备。 APNs 或 FCM 通过存储的 device token 把 payload 路由到正确的设备。
- 操作系统唤醒 App。 操作系统识别 payload 中的静默推送标志,在后台短暂激活 App。
- App 执行后台任务。 你的代码运行:拉取数据、同步状态、检查位置、更新标签。
- App 通知执行完成。 在 iOS 上,App 调用 completion handler;在 Android 上,
onMessageReceived()返回。操作系统让 App 重新休眠。
后台窗口是有限的。iOS 大约给 30 秒。Android 因设备和电源状态而异。后台任务必须足够快,或者被设计为能在这些约束内完成。对于出海 App,还要额外考虑海外用户的网络往返延迟——一次跨境的服务端请求可能就吃掉大半个时间窗口。
Payload 差异:iOS vs. Android
| 参数 | iOS(APNs) | Android(FCM) |
|---|---|---|
| 如何标记为静默 | aps 字典中设置 content-available: 1;不带 alert/sound/badge 字段 | 纯 data 消息:包含 data payload,不带 notification 对象 |
| APNs/FCM headers | apns-push-type: background;apns-priority: 5 | priority: normal(默认)或 high(用于时效性任务) |
| 后台时间限制 | 约 30 秒;必须调用 completionHandler | onMessageReceived 运行在主线程;耗时操作需移出 |
| 系统限流 | 发送频率超过约 3 次/小时或间隔过近时被限流 | Doze 模式与 App Standby 会限制后台投递 |
| 关键回调 | application(_:didReceiveRemoteNotification:fetchCompletionHandler:) | FirebaseMessagingService 中的 onMessageReceived() |
| 用户可见性 | 无——无提醒、声音或角标 | 无——不展示任何通知 |
iOS 上最常见的错误,是忘记在设置 apns-push-type: background 的同时设置 apns-priority: 5。如果 priority 设为 10(可见推送的默认值),Apple 可能拒绝该消息,或即便没有 alert body 也将其可视化展示。低优先级才是告诉 APNs”这是后台任务,而非紧急通知”的信号。
在 Android 上,关键规则更简单:FCM payload 里不能有 notification 对象。一旦存在 notification 对象,Android 就会把它当作普通推送通知并显示出来。静默推送 = 只有 data。
iOS 实现
Xcode 配置
在写任何代码之前,先在 Xcode 中启用 Background Modes:
- 打开项目并选择你的 App target。
- 进入 ‘Signing & Capabilities’,点击 ’+ Capability’。
- 添加 ‘Background Modes’ 并勾选 ‘Remote Notifications’。
你在 Apple Developer Portal 上的 App ID 必须已启用 Push Notifications。完成该更改后,请重新生成 provisioning profiles。
注册远程通知
静默推送同样需要向 APNs 注册设备。在 AppDelegate 中处理:
import UIKitimport UserNotifications
@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().requestAuthorization( options: [.badge, .sound, .alert] ) { granted, _ in if granted { DispatchQueue.main.async { application.registerForRemoteNotifications() } } } return true }
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() // Pushwoosh iOS SDK 自动处理 token 上报 }}处理静默推送
下面这个方法就是静默推送到达时 iOS 调用的方法:
extension AppDelegate {
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard let aps = userInfo["aps"] as? [String: AnyObject], aps["content-available"] as? Int == 1 else { completionHandler(.noData) return }
// 在这里运行你的后台任务 fetchLatestContent { success in completionHandler(success ? .newData : .noData) } }}务必在 30 秒窗口关闭前调用 completionHandler。否则 iOS 可能终止 App 并对后续静默推送进行限流。拉取到内容时传 .newData,没有变化时传 .noData,任务出错时传 .failed。
静默推送的 APNs payload
{ "aps": { "content-available": 1 }, "update_type": "content_refresh", "content_id": "latest_feed"}随该 payload 一同发送的必需 APNs headers:
- apns-push-type: background
- apns-priority: 5
Android 实现
FCM 配置与 manifest
将 FirebaseMessagingService 添加到你的 AndroidManifest.xml:
<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter></service>在 Kotlin 中处理 data 消息
继承 FirebaseMessagingService 并实现 onMessageReceived:
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) { // Pushwoosh Android SDK 自动处理 token 上报 }
override fun onMessageReceived(remoteMessage: RemoteMessage) { // 静默推送 = 仅 data payload,不带 notification 对象 if (remoteMessage.data.isNotEmpty() && remoteMessage.notification == null) { handleSilentPush(remoteMessage.data) } }
private fun handleSilentPush(data: Map<String, String>) { when (data["update_type"]) { "content_refresh" -> { // 从你的服务端拉取新内容 refreshContentFeed(data["content_id"]) } "segment_update" -> { // 把更新后的标签推送给 Pushwoosh syncUserSegmentData() } "location_check" -> { // 评估当前 geofence 状态 evaluateGeofences() } } }}静默推送的 FCM payload
payload 必须包含一个 data 对象,且不带 notification 对象:
{ "to": "DEVICE_TOKEN", "data": { "update_type": "content_refresh", "content_id": "latest_news_feed" }}仅在时效性强的后台任务中才把 priority 设为 ‘high’。对大多数内容刷新场景而言,标准优先级足矣,还能避免不必要的耗电。
使用 Pushwoosh 实现跨平台静默推送
手动管理 iOS 与 Android 的静默推送,意味着要维护两套 payload 格式、两套投递 headers、两套 SDK 集成。对出海团队来说,海外用户横跨 App Store 与 Google Play 两大国际商店,这种双重维护的成本会被进一步放大。Pushwoosh 把这一层抽象掉。
当你通过 Pushwoosh——无论是 UI 还是 API——触发静默推送时,平台会自动为每个目标平台生成正确的 payload。APNs 收到带正确 headers 的 content-available: 1,FCM 收到纯 data 消息。你只需配置一次 campaign。
Device token 管理也是集中化的。iOS token、Android token 和 web push 订阅全部统一存储与更新。当 token 发生变化(重装、系统升级)时,由 Pushwoosh 负责刷新。需要说明的是,Pushwoosh 的海外推送基础设施基于 FCM/APNs 构建,专为面向 App Store 与 Google Play 的国际版 App 设计。
对于非技术成员,Pushwoosh 提供了无需编写 payload 即可调度和触发静默推送的 UI。这让把静默推送整合进 用户旅程编排(Customer Journey Builder) 流程、与可见通知和应用内消息并用,变得切实可行。
出海应用场景
当”可见”反而会起反作用时,静默推送最有价值。下面这些场景里,它比普通推送更合适——而且大多直接对应出海企业的核心运营动作。
| 应用场景 | 静默推送触发什么 | 为何优于可见推送 |
|---|---|---|
| 内容预拉取 | App 拉取新文章、商品或信息流条目 | 用户打开即见新鲜内容,无加载页 |
| Geofence 评估 | App 比对用户位置与已存储的 geofence | 位置检查在无可见通知的情况下完成;仅在条件匹配时触发应用内消息或本地推送 |
| 分群更新 | App 把更新后的标签或事件发送给 Pushwoosh | 用户在站外活动(如网页下单)后,定向数据依然准确 |
| 投递前预备 | App 预加载应用内消息或优惠弹窗 | 可见通知或应用内消息瞬间呈现,无延迟 |
| RFM 重算 | App 把最新购买/活动数据推送到 CDP | 用户实时进入正确的 RFM 分群;后续 campaign 精准触发 |
为新闻与媒体 App 预拉取内容
一个发送突发新闻提醒的新闻 App,如果提前 30 秒发一条静默推送,会受益良多。静默推送唤醒 App,App 拉取文章并本地缓存。当可见提醒触发时,点击即可瞬间打开文章,无需等待内容加载。
对于带个性化信息流的 App,在用户典型的起床时段发一条静默推送,可以在用户打开前预拉取早间内容。App 之所以”感觉快”,是因为它真的快——数据早就在那儿了。
跨境电商:站外下单后保持分群数据准确
这是出海电商最典型的场景之一。用户在你的网页商城下了一单。他的 RFM 分群本应立即更新——但 App 在用户下次打开前并不知情。
一条在网页下单后发出的静默推送,会在后台唤醒 App,把最新的购买事件同步给 Pushwoosh。用户实时进入正确的 RFM 分群。随后的 campaign——会员奖励、交叉销售、感谢序列——便能基于准确数据触发。在双十一、618 或 Black Friday 这类大促期间,分群延迟一小时,就可能错过整个挽回窗口。
无可见触发的 Geofence 评估
用户走近一家门店。常规做法:发一条基于位置的推送通知。问题在于:用户必须已经 opt-in,时机可能不对,而且他们会觉得被追踪。
静默推送的做法:当用户进入某个区域时,服务端发一条静默推送。App 在客户端精确比对 geofence。如果条件匹配,App 在恰当时机激活应用内消息或本地通知。可见的沟通只在逻辑通过时才发生——而不是把它本身当作触发器。
为应用内消息预加载内容
需要服务端拉取才能渲染的应用内消息,可能存在明显延迟。在预期用户触发应用内消息之前发一条静默推送,可以预拉取内容并本地存储。消息触发时,便能立即显示。
这种模式非常适合引导流程、功能公告,以及内容个性化、无法硬编码进 App 二进制包的促销弹窗——尤其是出海 App 面对多语言、多市场时,内容往往需要按地区动态下发。
最佳实践
尊重操作系统的限流上限
iOS 会对到达过于频繁的静默推送进行限流。Apple 的指导大约是每小时 2-3 次,即最多约每 21 分钟一次。超过这个频率的 App,可能会发现自己的静默推送被延迟或丢弃,且没有任何报错。
Android 的 Doze 模式和 App Standby 会在设备空闲时限制后台执行。高优先级 FCM 消息可以在 Doze 期间唤醒 App,但应谨慎使用。标准优先级消息会被推迟,直到设备退出 Doze。
实用规则:只在后台任务确实有时效性时才发静默推送。以自然节奏预拉取内容一次(早晨,或服务端更新后)没问题;为了保持数据新鲜而每 10 分钟发一次则不行。
保持 payload 精简、任务快速
静默推送的 payload 应当是一个信号,而非一次数据传输。只发送最少的必要信息,告诉 App 该拉取什么、从哪拉取。真正的数据拉取发生在推送到达后、App 内部。
后台任务应在时间限制内充裕地完成。如果一个任务需要几秒以上,就把它设计成可中断的:保存进度、调用 completion handler、在下一次机会继续。冗长的后台任务有被操作系统终止的风险,还可能影响续航到用户能察觉的程度。
跨电源状态与 OEM 机型测试
静默推送的行为在不同 Android OEM 上差异显著。对出海 App 而言,海外用户的设备分布广泛:Samsung、Pixel 等海外主流机型,以及 Xiaomi、OPPO、vivo、OnePlus 等品牌的国际版机型,都各自带有激进的电池优化策略,可能完全阻止未加白名单 App 的后台执行。请在这些厂商的真机上测试,而不是只用原生 Android 模拟器。
出海提示:你的海外用户依赖 Google Play 与 FCM 进行推送投递,因此测试重点应放在 FCM 通道在各 OEM 国际版 ROM 上的后台投递可靠性,而非任何国内推送通道。
在 iOS 上,请在低电量模式以及 App 被强制退出的状态下测试。这些状态下静默推送的投递可靠性较低,你的后台逻辑应当能处理”用户打开前任务并未运行”这种情况。
通过下游事件追踪效果
静默推送不产生点击指标。请通过它们本应触发的事件来追踪效果:content_refreshed、segment_updated、geofence_evaluated。如果在一次静默推送 campaign 之后,这些事件不再以预期频率触发,说明投递被限流,或后台 handler 出错了。
Pushwoosh Analytics 会把 App 事件与 campaign 数据并列呈现。把你的后台任务完成事件映射到静默推送发送上,即可确认整条管道是否正常工作。
整合进旅程自动化,而非孤立发送
孤立发出的一条静默推送,只是一次技术操作。嵌入用户旅程中的静默推送,则是一次战略动作。最有用的模式,是把静默推送作为一个”为下游更好的可见交互铺路”的步骤:在促销推送前更新分群、在应用内消息前预拉取内容、在基于位置的提醒前评估 geofence。对出海运营尤其如此——它让你在面对海外多时区用户时,既能精准又能不打扰。
Pushwoosh 的用户旅程编排(Customer Journey Builder) 支持把静默推送作为旅程步骤,与可见通知和应用内消息并用。
用 Pushwoosh 提升 App 新鲜度与 campaign 精准度
静默推送通知是更好用户体验之下的基础设施层。打开即见的新鲜内容、准确的分群数据、无缝的 geofence 触发交互——没有后台 App 更新,这些都无法可靠运转。
Pushwoosh 处理跨平台静默推送投递、payload 格式化、token 管理以及用户旅程整合。开发者得到干净的 SDK 抽象;营销团队把静默推送当作自动化流程中的一等公民。对出海企业而言,这意味着用一套面向 FCM/APNs 的全球推送基础设施,同时服务好分布在不同市场的海外用户。