iOS 推送(APNs)
iOS 的离线提醒通过 Apple Push Notification service(APNs)投递:IM 服务端在用户离线时把通知交给 APNs,APNs 推送到设备;客户端负责申请通知权限、上报 deviceToken、决定前台是否展示,以及点击通知后跳转到对应会话。
链路与职责
服务端:持有 APNs 证书或 Auth Key(.p8),按 deviceToken 投递;推送内容由消息触发。
客户端:申请权限 → 拿到 deviceToken → 调用 IMLib 推送令牌接口登记 → 处理前台 / 后台 / 点击三类回调。
IMLib 不直接连接 APNs:推送投递由服务端完成,客户端只负责令牌登记与展示策略。
能力地图
| 主题 | 内容 | 文档 |
|---|---|---|
| APNs 集成 | 开启 Push Notifications 能力、注册远程通知、拿到 deviceToken | 集成 APNs |
| 令牌登记 | `registerPushToken` / `getPushTokens` / `unregisterPushToken`,多设备与换绑 | 推送令牌登记 |
| 前台展示 | 前台收到通知是否展示、当前会话去重、声音与角标 | 前台通知处理 |
| 后台与静默 | `content-available` 静默推送、后台补收、系统节流 | 后台与静默推送 |
| 角标 | 未读总数计算、清零时机、多端一致 | 角标(badge) |
| 排障 | 权限、环境、证书、deviceToken 失效的排查顺序 | 推送排障 |
客户端生命周期
Text
App 启动
→ UNUserNotificationCenter.requestAuthorization(首次弹权限)
→ UIApplication.registerForRemoteNotifications()
→ didRegisterForRemoteNotificationsWithDeviceToken(拿到 APNs token)
→ client.registerPushToken({ platform: "ios", token, deviceId, appVersion })
→ 服务端离线时经 APNs 投递通知
→ didReceiveRemoteNotification / willPresent(前台)
→ 用户点击 → 打开会话(本地历史 + 云端补齐)与 IMKit 的配合
- IMKit 会话页正在展示的会话收到推送时不弹系统通知(避免重复打扰),只更新未读与角标。
- 免打扰会话(level=2)不展示通知与红点,但保留未读数(见「免打扰」页)。
- 点击通知进入会话后调用 `clearUnreadCount` 清零,并同步角标。
模拟器限制
iOS 模拟器从 Xcode 14 起支持本地通知,但远程 APNs 推送仍需真机验证;文档中的推送链路以真机为准。