# iOS SDK 测试报告 > **生成时间**: 2026-05-01 > **版本**: 0.1.0 > **测试状态**: 部分功能待测试 --- ## 测试环境 | 项目 | 版本/配置 | |------|-----------| | Xcode | 16.0 | | iOS 模拟器 | iPhone 16 Pro(iOS 18.0) | | Swift | 5.9+ | | Swift Tools Version | 5.9 | | 最低 iOS 版本 | iOS 14 | --- ## 测试用例清单 ### TC-01 SDK 初始化测试 | 字段 | 内容 | |------|------| | **测试目的** | 验证 SDK 初始化及模块配置 | | **测试步骤** | 1. 在 `AppDelegate` 中调用 `XuqmSDK.shared.initialize(config: SDKConfig(appId:appSecret:))`
2. 确认 `XuqmSDK.shared.requireConfig()` 返回有效配置
3. 确认 `ApiClient.shared` 已配置 baseURL 与拦截器 | | **预期结果** | 1. 初始化成功,无 fatalError
2. `config.appId` 与传入值一致
3. `TokenStore` 已实例化 | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ### TC-02 IM 登录/登出测试(UserSig 模式) | 字段 | 内容 | |------|------| | **测试目的** | 验证 UserSig 鉴权登录与登出流程 | | **测试步骤** | 1. 调用 `XuqmSDK.shared.login(userId: "user_001", userSig: "xxx")`
2. 观察 `ImSDK.shared.login` 内部触发 WebSocket 连接
3. 监听 `ImEventDelegate.imClientDidConnect()`
4. 调用 `XuqmSDK.shared.logout()`
5. 确认 `ImSDK.shared.disconnect()` 执行,Push Token 解注册 | | **预期结果** | 1. `currentUserId` 被赋值
2. WebSocket 连接成功,状态变为 `.connecting` → `.connected`
3. delegate `imClientDidConnect()` 触发
4. 登出后 `currentUserId` 置 nil
5. `PushSDK.shared.unregisterToken` 被调用 | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ### TC-03 单聊消息收发测试 | 字段 | 内容 | |------|------| | **测试目的** | 验证单聊消息发送、接收、历史与已读 | | **测试步骤** | 1. 调用 `ImSDK.shared.sendTextMessage(toId:chatType:content:)`
2. 接收方通过 `ImEventDelegate.imClientDidReceiveMessage(_:)` 接收
3. 调用 `fetchHistory(toId:page:size:)`
4. 调用 `markRead(targetId:chatType:)`
5. 发送方重新拉取历史,确认 `status == .read` | | **预期结果** | 1. 返回 `ImMessage`,`status` 为 `.sending` 或 `.sent`
2. 接收方实时收到消息,未读角标 +1
3. 历史消息返回 `[ImMessage]`
4. `markRead` HTTP 200,未读清零
5. 发送方消息状态更新为 `.read` | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ### TC-04 群聊消息收发测试 | 字段 | 内容 | |------|------| | **测试目的** | 验证群创建、订阅、群消息收发与历史 | | **测试步骤** | 1. 调用 `createGroup(name:memberIds:groupType:)`
2. 双端调用 `subscribeGroup(_:)`
3. 发送方调用 `sendTextMessage(toId:chatType:content:)`(chatType=.group)
4. 接收方通过 `imClientDidReceiveGroupMessage(_:)` 接收
5. 双端调用 `fetchGroupHistory(groupId:page:size:)` | | **预期结果** | 1. 返回 `ImGroup`,`memberIds` 包含指定用户
2. WebSocket 订阅 `/topic/group/{groupId}` 成功
3. 群消息发送成功
4. 群成员实时收到消息
5. 群历史正确分页 | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ### TC-05 连接状态监听测试(新增) | 字段 | 内容 | |------|------| | **测试目的** | 验证 `connectionState` 属性与 `addConnectionStateListener` 回调 | | **测试步骤** | 1. 添加 `addConnectionStateListener { state in print(state) }`
2. 触发登录,观察状态流转
3. 手动断开网络,观察重连状态
4. 恢复网络,观察恢复为 `.connected`
5. 调用 `disconnect()`,观察 `.disconnected` | | **预期结果** | 1. 监听器被加入数组
2. 登录时状态变化:`.disconnected` → `.connecting` → `.connected`
3. 断网后状态变为 `.disconnected` 并触发重连
4. 恢复网络后回到 `.connected`
5. `disconnect()` 后状态为 `.disconnected`,监听器仍保留(不移除) | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ### TC-06 Push 设备注册测试(APNs + FCM) | 字段 | 内容 | |------|------| | **测试目的** | 验证 APNs 设备 Token 获取、注册与 FCM 备选方案 | | **测试步骤** | 1. 在 `AppDelegate` 中调用 `PushSDK.shared.requestAuthorization()`
2. 系统授权后 `UIApplication.shared.registerForRemoteNotifications()`
3. 在 `didRegisterForRemoteNotificationsWithDeviceToken` 中调用 `XuqmSDK.shared.registerDeviceToken(_:)`
4. 确认 `PushSDK.shared.registerToken(token:userId:vendor:)` 调用(vendor=.apns)
5. 若集成 Firebase,验证 `registerFcmToken` 路径 | | **预期结果** | 1. `requestAuthorization` 返回 `true`
2. 系统弹窗申请通知权限
3. `cachedDeviceToken` 被保存
4. `/api/push/register` 返回 200
5. FCM 路径返回 vendor=FCM,注册成功 | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ### TC-07 版本更新检查测试 | 字段 | 内容 | |------|------| | **测试目的** | 验证 UpdateSDK 检查 App Store 更新 | | **测试步骤** | 1. 调用 `UpdateSDK.shared.checkAppUpdate(currentVersionCode: 1)`
2. 若 `needsUpdate=true` 且 `forceUpdate=true`,调用 `openAppStore(url:)`
3. 观察是否能正确跳转到 App Store 或下载页 | | **预期结果** | 1. 返回 `AppUpdateInfo`,`platform=IOS`
2. `forceUpdate` 为布尔值,下载链接有效
3. `UIApplication.shared.open` 成功跳转 | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ### TC-08 UserSig 过期检测测试(新增) | 字段 | 内容 | |------|------| | **测试目的** | 验证 `XuqmSDK` 解析 UserSig JWT exp 并在过期前触发回调 | | **测试步骤** | 1. 生成一个 exp 为当前时间 + 6 分钟的 UserSig JWT
2. 调用 `XuqmSDK.shared.login(userId:userSig:)`
3. 设置 `XuqmSDK.shared.onUserSigExpired = { ... }`
4. 等待 1 分钟,观察 Timer 是否在正确时间点触发
5. 触发后调用 `logout()`,确认 Timer 被 `invalidate` | | **预期结果** | 1. `extractExpirationDate` 正确解析 JWT payload
2. `startUserSigExpirationTimer` 创建 `Timer`
3. 到期前 5 分钟触发 `onUserSigExpired?()`
4. 回调在主线程执行
5. `logout()` 后 `userSigTimer` 为 nil,无内存泄漏 | | **实际结果** | 待测试 | | **通过状态** | ⬜ | --- ## 测试汇总 | 用例编号 | 用例名称 | 状态 | |---------|---------|------| | TC-01 | SDK 初始化测试 | ⬜ 待测试 | | TC-02 | IM 登录/登出测试(UserSig 模式) | ⬜ 待测试 | | TC-03 | 单聊消息收发测试 | ⬜ 待测试 | | TC-04 | 群聊消息收发测试 | ⬜ 待测试 | | TC-05 | 连接状态监听测试 | ⬜ 待测试 | | TC-06 | Push 设备注册测试(APNs + FCM) | ⬜ 待测试 | | TC-07 | 版本更新检查测试 | ⬜ 待测试 | | TC-08 | UserSig 过期检测测试 | ⬜ 待测试 |