初始化、登录与生命周期
QXJIMClient.shared 管理底层 Go IM 核心引擎的初始化、WebSocket 长连接建立、本地 SQLite 数据库挂载以及应用前后台切换。
1. 初始化配置 (IMConfig)
在调用任何其他 SDK 接口前,必须在应用启动阶段调用 initSDK(config:):
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
systemType | String | "ios" | 系统标识 |
platformID | Int32 | 1 (.iOS) | 平台枚举:iOS = 1, iPad = 9 |
apiAddr | String | 必填 | OpenIM HTTP API 地址(如 https://im-api.example.com) |
wsAddr | String | 必填 | OpenIM WebSocket 地址(如 wss://im-ws.example.com) |
dataDir | String | 必填 | 本地 SQLite 数据库存储目录绝对路径(SDK 会自动创建目录) |
logLevel | UInt32 | 4 | 日志级别:6=Debug, 4=Info, 3=Warn, 2=Error |
isLogStandardOutput | Bool | true | 是否在 Xcode 控制台打印日志 |
logFilePath | String | 同 dataDir | 本地日志文件输出目录 |
isExternalExtensions | Bool | false | 是否启用外部扩展 |
let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let config = IMConfig(
platform: .iOS,
apiAddr: "https://im-api.qxj.com",
wsAddr: "wss://im-ws.qxj.com",
dataDir: "\(docDir)/qxj_im_data",
logLevel: 4,
isLogStandardOutput: true
)
try QXJIMClient.shared.initSDK(config: config)
2. 登录与登出 (login / logout)
2.1 登录 (login)
try await QXJIMClient.shared.login(userID: "u_10001", token: "eyJhbGciOi...")
- 登录成功后,SDK 会自动初始化
u_10001专属的本地 SQLite 数据库并建立 WebSocket 长连接,随后触发会话与消息增量同步(可通过conversationEvents监听syncServerStart/syncServerProgress/syncServerFinish)。
2.2 查询登录状态与当前用户
let status: IMLoginStatus = QXJIMClient.shared.loginStatus
// .uninitialized (0) | .loggedOut (1) | .loggingIn (2) | .loggedIn (3)
let currentUserID: String = QXJIMClient.shared.loginUserID
let version: String = QXJIMClient.shared.sdkVersion // "v3.8.3-patch.3"
2.3 退出登录 (logout)
try await QXJIMClient.shared.logout()
- 用户主动退出账号时调用。若收到
.kickedOffline(被踢下线)或.userTokenExpired(Token 过期)事件,底层连接已自动断开,无需再次调用logout(),直接清理业务态跳转登录页即可。
3. 前后台切换与网络变化通知
在 SwiftUI scenePhase 变化或 NWPathMonitor 监听到网络切换时调用:
// SwiftUI App 监听前后台切换
.onChange(of: scenePhase) { _, newPhase in
Task {
switch newPhase {
case .active:
try? await QXJIMClient.shared.setAppBackgroundStatus(isBackground: false)
case .background:
try? await QXJIMClient.shared.setAppBackgroundStatus(isBackground: true)
default:
break
}
}
}
// 当 Wi-Fi / 蜂窝网络切换时立即触发底层重连
try? await QXJIMClient.shared.networkStatusChanged()