iOS消息推送原理

打印 上一主题 下一主题

主题 1961|帖子 1961|积分 5883

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
iOS 消息推送(Push Notification)的核心机制基于 Apple Push Notification Service (APNs),它是苹果提供的环球推送服务,负责将消息从应用服务器传递到用户的设备。以下是 iOS 消息推送的完整原理和流程:
  
  1. 团体架构

  iOS 消息推送涉及三个核心角色:
  

  • 应用服务器(Provider Server):你的后端服务,负责天生和发送推送消息。
  • Apple Push Notification Service (APNs):苹果的推送中转服务器,负责吸收消息并转发到设备。
  • 用户设备(Client Device):安装了你的应用的 iOS 设备,吸收并展示推送消息。
  1. 应用服务器 → APNs → iOS 设备
复制代码

  2. 关键流程

  2.1 设备注册与 Device Token

  

  • 步骤 1:应用哀求推送权限
    应用初次启动时,需向用户哀求推送权限(通过 UNUserNotificationCenter):
    1. UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
    2.     if granted {
    3.         print("用户允许推送")
    4.         DispatchQueue.main.async {
    5.             UIApplication.shared.registerForRemoteNotifications() // 注册远程推送
    6.         }
    7.     }
    8. }
    复制代码
  • 步骤 2:获取 Device Token
    用户授权后,体系会向 APNs 注册设备,并天生一个唯一的 Device Token(设备令牌)。该 Token 通过应用回调返回:
    1. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    2.     let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    3.     print("Device Token: \(tokenString)")
    4.     // 将 Device Token 发送到你的服务器保存
    5. }
    复制代码

    • Device Token 的作用:标识设备和应用的唯一组合,用于 APNs 路由消息。
    • 留意:Token 可能变革(如设备恢复出厂设置、重装应用等),需服务器定期更新。

  2.2 服务器发送推送消息

  

  • 步骤 1:构造推送负载(Payload)
    推送消息是一个 JSON 对象,包罗以下核心字段:
    1. {
    2.   "aps": {
    3.     "alert": {
    4.       "title": "新消息",
    5.       "body": "您有一条未读消息"
    6.     },
    7.     "sound": "default",
    8.     "badge": 1
    9.   },
    10.   "custom_data": {  // 自定义数据
    11.     "type": "chat",
    12.     "id": "123"
    13.   }
    14. }
    复制代码

    • 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 处理:
    1. func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    2.     // 自定义处理逻辑(如播放声音)
    3.     completionHandler([.banner, .sound])
    4. }
    复制代码
  • 后台或未运行:体系自动展示通知,用户点击通知会叫醒应用,触发回调:
    1. func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    2.     let userInfo = response.notification.request.content.userInfo
    3.     if let customData = userInfo["custom_data"] as? [String: Any] {
    4.         // 跳转到特定页面(如聊天详情)
    5.     }
    6.     completionHandler()
    7. }
    复制代码
  • 静默推送(Silent Notifications)
    通过在 aps 中添加 "content-available": 1,触发应用在后台实行代码(需开启后台模式):
    1. {
    2.   "aps": {
    3.     "content-available": 1
    4.   },
    5.   "custom_data": { "action": "refresh_data" }
    6. }
    复制代码

    • 应用需在 AppDelegate 中处理:
      1. func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
      2.     if let action = userInfo["custom_data"]?["action"] as? String {
      3.         // 执行后台任务(如刷新数据)
      4.     }
      5.     completionHandler(.newData)
      6. }
      复制代码

  
  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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表