马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
iOS 消息推送(Push Notification)的核心机制基于 Apple Push Notification Service (APNs),它是苹果提供的环球推送服务,负责将消息从应用服务器传递到用户的设备。以下是 iOS 消息推送的完整原理和流程:
1. 团体架构
iOS 消息推送涉及三个核心角色:
- 应用服务器(Provider Server):你的后端服务,负责天生和发送推送消息。
- Apple Push Notification Service (APNs):苹果的推送中转服务器,负责吸收消息并转发到设备。
- 用户设备(Client Device):安装了你的应用的 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企服之家,中国第一个企服评测及商务社交产业平台。 |