qidao123.com技术社区-IT企服评测·应用市场
标题:
iOS消息推送原理
[打印本页]
作者:
石小疯
时间:
2025-4-27 13:51
标题:
iOS消息推送原理
iOS 消息推送(Push Notification)的核心机制基于
Apple Push Notification Service (APNs)
,它是苹果提供的环球推送服务,负责将消息从应用服务器传递到用户的设备。以下是 iOS 消息推送的完整原理和流程:
1. 团体架构
iOS 消息推送涉及三个核心角色:
应用服务器(Provider Server)
:你的后端服务,负责天生和发送推送消息。
Apple Push Notification Service (APNs)
:苹果的推送中转服务器,负责吸收消息并转发到设备。
用户设备(Client Device)
:安装了你的应用的 iOS 设备,吸收并展示推送消息。
应用服务器 → APNs → iOS 设备
复制代码
2. 关键流程
2.1 设备注册与 Device Token
步骤 1:应用哀求推送权限
应用初次启动时,需向用户哀求推送权限(通过 UNUserNotificationCenter):
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
print("用户允许推送")
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications() // 注册远程推送
}
}
}
复制代码
步骤 2:获取 Device Token
用户授权后,体系会向 APNs 注册设备,并天生一个唯一的
Device Token
(设备令牌)。该 Token 通过应用回调返回:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print("Device Token: \(tokenString)")
// 将 Device Token 发送到你的服务器保存
}
复制代码
Device Token 的作用
:标识设备和应用的唯一组合,用于 APNs 路由消息。
留意
:Token 可能变革(如设备恢复出厂设置、重装应用等),需服务器定期更新。
2.2 服务器发送推送消息
步骤 1:构造推送负载(Payload)
推送消息是一个 JSON 对象,包罗以下核心字段:
{
"aps": {
"alert": {
"title": "新消息",
"body": "您有一条未读消息"
},
"sound": "default",
"badge": 1
},
"custom_data": { // 自定义数据
"type": "chat",
"id": "123"
}
}
复制代码
aps:苹果定义的字段,控制通知的展示和举动(如弹窗、声音、角标)。
自定义数据:通过 userInfo 传递到应用,用于处理业务逻辑。
步骤 2:与 APNs 建立安全连接
服务器需通过以下方式与 APNs 通信:
HTTP/2 API
(推荐):使用基于 Token 的认证(JWT)或证书。
Legacy Binary Protocol
(旧版,已逐渐弃用)。
认证方式
:
APNs Auth Key
(更灵活):天生 JWT 令牌,使用密钥署名。
APNs Certificate
(证书):需在 Apple 开辟者账号创建推送证书。
步骤 3:发送推送哀求
服务器向 APNs 发送 HTTP/2 哀求,包罗以下信息:
Device Token
:目的设备的标识。
Payload
:上述 JSON 数据。
Headers
:指定推送优先级(apns-priority)、过期时间(apns-expiration)等。
2.3 APNs 转发消息到设备
APNs 根据 Device Token 找到目的设备,并通过长连接(基于 Apple 的持久化连接)将消息推送到设备。
可靠性
:
假如设备离线,APNs 会暂存消息(默认保存最多 30 天),待设备上线后重发。
通过 apns-expiration 可自定义消息过期时间。
2.4 设备吸收并处理推送
前台运行
:应用在前台时,推送不会自动展示,需通过 UNUserNotificationCenterDelegate 处理:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// 自定义处理逻辑(如播放声音)
completionHandler([.banner, .sound])
}
复制代码
后台或未运行
:体系自动展示通知,用户点击通知会叫醒应用,触发回调:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
if let customData = userInfo["custom_data"] as? [String: Any] {
// 跳转到特定页面(如聊天详情)
}
completionHandler()
}
复制代码
静默推送(Silent Notifications)
:
通过在 aps 中添加 "content-available": 1,触发应用在后台实行代码(需开启后台模式):
{
"aps": {
"content-available": 1
},
"custom_data": { "action": "refresh_data" }
}
复制代码
应用需在 AppDelegate 中处理:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let action = userInfo["custom_data"]?["action"] as? String {
// 执行后台任务(如刷新数据)
}
completionHandler(.newData)
}
复制代码
3. 安全机制
Device Token 加密
:每个 Token 与设备和应用绑定,无法伪造。
通信加密
:APNs 使用 TLS 加密,防止中间人攻击。
认证方式
:APNs Auth Key 或证书确保服务器合法性。
4. 常见题目与优化
推送失败的原因
:
Device Token 失效或未更新。
APNs 证书或 Auth Key 配置错误。
用户关闭了推送权限。
测试工具
:
使用 NWPusher 或命令行工具 curl 发送测试推送。
Xcode 控制台查看推送日志。
性能优化
:
使用 apns-push-type 区分推送范例(如 alert 或 background)。
合并重复推送,克制频繁打扰用户。
5. 扩展功能
富媒体推送(Rich Notifications)
:通过 Notification Service Extension 添加图片、视频或自定义 UI。
推送统计
:集成第三方服务(如 Firebase)跟踪推送到达率和点击率。
通过以上机制,iOS 消息推送实现了高效、安全的消息传递,同时兼顾用户体验与开辟者灵活性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4