推送通知是应用安装后与用户互动的最有效方式之一。它们可以通知新消息、折扣、内容更新或提醒被遗忘的购物车。推送通知(push notifications)通过云服务工作:Android上的Firebase Cloud Messaging(FCM)和iOS上的Apple Push Notification Service(APNS)。本文将分析通知的架构、类型以及两个平台的配置过程。更多详情请参阅FCM官方文档。
要点
推送通知是服务器在应用未请求的情况下发送到移动设备的消息。消息通过云服务(FCM或APNS),即使应用已关闭,也能将其传送到设备。通知分为两类:显示通知(向用户显示)和数据通知(传输数据用于后台处理)。
推送通知的架构包括三个组件:(1)应用服务器 — 向FCM/APNS发送请求;(2)云服务 — 路由通知;(3)客户端应用 — 接收和处理通知。服务器必须知道设备的设备令牌才能专门向其发送通知。对于群发,使用主题订阅 — 将设备订阅到主题频道(新闻、促销、天气)。
在每个设备上,通知由操作系统处理:Android — 通过NotificationManager和NotificationChannel,iOS — 通过UNUserNotificationCenter。用户可以为每个频道配置通知行为:允许声音、横幅、在锁定屏幕上显示或完全禁用。正确的频道配置可提高参与度并降低退订率。
在IT Sectr,我们从一开始就考虑平台特定特性来设计推送通知系统。关键决策:选择FCM还是直接APNS、负载格式、发送频率和订阅机制。这有助于避免通知无法到达或被系统阻止的情况。
Firebase Cloud Messaging(FCM)是Google用于通知投送的跨平台服务。FCM支持Android、iOS、Web和Flutter。在iOS上,FCM通过APNS工作:FCM向APNS发送请求,APNS将通知传送到设备。FCM的优势:两个平台统一的API、内置分析、A/B测试、主题和受众细分。
Apple Push Notification Service(APNS)是Apple的原生服务。仅在Apple设备(iOS、macOS、watchOS、tvOS)上运行。需要通过TLS证书或令牌(JWT)进行直接授权。APNS提供最小的投递延迟和与iOS功能的直接集成:PushKit、Notification Service Extension和关键警报。
FCM和APNS之间的选择取决于项目架构。如果应用仅适用于iOS — APNS提供更多控制。如果是跨平台 — FCM通过统一API更方便。许多项目使用FCM作为主要服务,并在iOS上额外配置PushKit用于VoIP。混合方法可以从两个系统中获得最佳效果。
| 特性 | FCM | APNS |
|---|---|---|
| 平台 | Android、iOS、Web、Flutter | iOS、macOS、watchOS、tvOS |
| 授权 | 服务器密钥(Firebase Console) | TLS证书或JWT令牌 |
| 最大负载 | 4 KB(data)、2 KB(notification) | 4 KB |
| 主题 | 内置(Topic Messaging) | 无(在服务器端实现) |
| 静默推送 | 支持 | 支持(content-available) |
| PushKit | 无 | 有(VoIP、实时活动) |
| 分析 | Firebase Analytics | 无内置 |
| 发送到关闭的设备 | 有限(取决于制造商) | 有,通过PushKit |
富通知是不仅包含文本还包含媒体内容(图片、视频、音频和操作按钮)的通知。在Android上通过NotificationCompat样式实现:BigPictureStyle(大图片)、BigTextStyle(折叠/展开文本)、InboxStyle(消息列表)、MediaStyle(播放控制)。在iOS上使用Notification Content Extension — 用于展开通知的具有自定义UI的独立目标。
静默推送(iOS上的content-available)是在不向用户显示的情况下传递的通知。用于后台数据更新:内容同步、预加载、小部件更新。在iOS上,静默推送需要启用Background Modes → Remote notifications。在Android上,使用FirebaseMessagingService配合onMessageReceived处理后台通知。重要:在iOS上,静默推送有频率限制,如果应用不在前台,则不保证送达。
交互式通知允许用户在不打开应用的情况下执行操作。在Android上是通知中的按钮(Action):“回复”、“批准”、“拒绝”。操作通过PendingIntent处理,启动BroadcastReceiver或Service。在iOS上,Notification Action通过UNNotificationAction和UNNotificationCategory注册。按钮可以是foreground(打开应用)、background(在后台执行)或destructive(不可逆操作 — 删除、阻止)。
Notification Content Extension(iOS) — 用于在长按或3D Touch时显示扩展通知内容的自定义视图控制器。Notification Service Extension(iOS) — 用于在显示前修改通知内容的中间件:解密E2E消息、加载图像、混淆机密数据。Android上没有直接的类似功能 — 所有修改都在FirebaseMessagingService中执行。
对于Android,需要:(1)将Firebase SDK添加到项目(google-services.json);(2)为每个通知类别创建NotificationChannel(Android 8+);(3)实现FirebaseMessagingService以接收令牌和传入消息。Notification Channel是必需的 — 没有它,通知将不会在Android 8+上显示。频道具有优先级(IMPORTANCE_HIGH — 声音+弹出窗口,IMPORTANCE_LOW — 无声音),用户可以在系统设置中配置它们。
对于iOS,需要:(1)在Xcode中启用Push Notifications功能;(2)在Apple Developer Portal上配置APNS密钥;(3)通过UNUserNotificationCenter.requestAuthorization请求授权 — 这是一个只显示一次的系统对话框。用户的响应至关重要:如果未授予权限,通知将不会被送达。建议在显示系统对话框之前向用户解释为什么需要通知(预先权限提示)。
设备令牌(iOS)和注册令牌(Android)是用于推送通知的唯一设备标识符。令牌在首次启动应用时生成,可能会更改:重新安装、清除数据、重置隐私设置时。服务器必须定期更新令牌。Firebase提供通过onNewToken进行令牌管理的便捷API,以及用于测试通知发送的面板(Firebase Console → Cloud Messaging)。
主题订阅是FCM最有效的机制之一。设备订阅主题(例如“news”、“promo_users_ios”),服务器按主题发送通知,无需存储令牌列表。Firebase Topics支持每个主题最多一百万个订阅者,并通过表达式语言支持条件发送(Condition):“'news' in topics && ('US' in topics || 'UK' in topics)”。
通知负载是通过FCM/APNS发送的JSON结构。对于FCM:分别notification(可见部分 — 标题、正文、图片)和data(应用的自定义字段)。对于APNS:包含alert、badge、sound、category和content-available的aps字典。正确的负载结构至关重要:如果notification + data同时到达,后台应用可能无法接收data。建议仅对Android使用data消息,并通过FCM Console单独传递视觉字段。
常见问题
FCM(Firebase Cloud Messaging)是Google用于Android和跨平台通知的服务。APNS(Apple Push Notification Service)是Apple仅用于iOS/macOS的服务。FCM可以通过APNS在iOS上传递通知,充当代理服务器。
富通知是具有媒体内容(图片、视频、音频、操作按钮)的增强型通知。在iOS上通过Notification Content Extension实现;在Android上通过BigPictureStyle和InboxStyle实现。
设备令牌是用于发送推送通知的唯一设备标识符。在Android上是来自FCM的注册令牌;在iOS上是来自APNS的设备令牌。令牌可能会更改在重新安装应用或重置设置时,因此需要在服务器上更新。
静默推送(无声通知)是不向用户显示的通知。用于后台数据更新:内容同步、小部件更新、预获取。在iOS上需要启用Background Modes → Remote notifications。
PushKit是Apple用于传递高优先级通知的框架,用于VoIP应用(通话、消息)。PushKit传递通知即使应用已关闭,并保证启动应用进行处理。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。