iOS 工程配置
iOS 应用接入 IMLib 前需要完成一组工程配置:网络访问(ATS / 本地网络)、后台模式(长连接保活)、媒体权限(图片 / 文件 / 语音 / 位置)与推送能力(可选)。漏配的典型表现是“能连上但收不到推送 / 断线后不重连 / 选图片闪退”。
Info.plist 关键项
| Key | 值 | 用途 |
|---|---|---|
| `NSAppTransportSecurity` → `NSAllowsArbitraryLoads` | 开发环境 `YES`;生产按域名配置例外 | 允许 HTTP / 自签证书联调;生产建议全量 HTTPS |
| `NSLocalNetworkUsageDescription` | “用于连接本地开发服务器” | iOS 14+ 访问局域网服务端时的权限说明 |
| `UIBackgroundModes` | `fetch`、`remote-notification`(按需) | 后台同步与推送唤醒;长连接保活以系统策略为准 |
| `NSCameraUsageDescription` | “拍摄照片发送” | 拍照发图 |
| `NSPhotoLibraryUsageDescription` | “从相册选择图片发送” | 相册选图 |
| `NSMicrophoneUsageDescription` | “录制语音消息” | 语音消息 |
| `NSLocationWhenInUseUsageDescription` | “发送位置消息” | 位置消息 |
| `NSUserTrackingUsageDescription` | 按业务需要 | 如涉及归因追踪才需要 |
Text
<!-- Info.plist 片段 -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSLocalNetworkUsageDescription</key>
<string>用于连接本地开发服务器</string>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
</array>
<key>NSCameraUsageDescription</key>
<string>拍摄照片发送</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>从相册选择图片发送</string>
<key>NSMicrophoneUsageDescription</key>
<string>录制语音消息</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>发送位置消息</string>网络权限
- 生产环境使用 HTTPS 与 wss;ATS 默认阻止明文 HTTP,联调期才临时放开,上线前删除 `NSAllowsArbitraryLoads`。
- 自签证书:把根证书加入 App 的 trust store(或在 ATS 中对该域名配置例外),并在业务层固定证书指纹。
- 本地网络:访问 `192.168.*` / `10.*` 等内网地址时,iOS 14+ 会弹「本地网络」权限;用户拒绝后需在系统设置中重新开启。
- 代理 / VPN:企业网络下确认允许 WebSocket 升级(`Upgrade: websocket`)与长连接保活。
后台模式与保活
| 场景 | 配置 | 说明 |
|---|---|---|
| 切后台短时间保活 | 无需额外配置 | 系统给约 30 秒后台执行时间;期间可完成一次收发与本地落库 |
| 后台消息唤醒 | `remote-notification` + 推送通道 | 通过 APNs 通知唤醒;消息正文由 IMLib 在下次前台连接补收 |
| 后台同步 | `fetch`(BGTaskScheduler) | 定期拉取会话 / 未读;具体频率由系统调度 |
| VoIP / 通话 | 不适用 | IMLib 不含音视频能力;通话能力见音视频产品线 |
不要依赖“永久后台长连接”
iOS 会在切后台一段时间后挂起 socket。正确做法是:把连接状态、未读与草稿持久化,回到前台后重连并补收离线消息;推送负责提醒,不负责传消息正文。
推送能力(可选)
- Xcode → Signing & Capabilities → 添加 Push Notifications。
- 在 Apple Developer 后台创建 APNs Key(.p8),配置到服务端推送通道。
- App 启动时请求通知权限(`UNUserNotificationCenter.requestAuthorization`),拿到 deviceToken 后登记到 IMLib 推送令牌接口。
- 前台收到通知时自行决定是否展示(避免与 IMKit 会话页重复提示)。
Objective-C 工程注意点
- 在 Build Settings 中设置 `Defines Module = YES`,否则 `@import ImpIaaSIM;` 不可用;也可用 `#import
`。 - `.m` 文件中混用 Swift 时,确认已生成 `YourApp-Swift.h` 并在需要处导入。
- 关闭 Bitcode(Apple 已废弃);确保 `Other Linker Flags` 不含冲突的 `-all_load`(会与静态库符号冲突)。
相关:集成方式、快速开始、IMKit 快速开始。