iOS SDK 快速集成 (QXJIMSDK)
QXJIMSDK 是专为全新重写版 qxj-ios 打造的 100% 纯 Swift IM SDK,基于 Apache-2.0 协议的 OpenIMCore.xcframework (3.8.3+3) 构建,完全消除了旧版 Objective-C OpenIMSDK 与 MJExtension 依赖。
1. 环境要求
- iOS 部署目标:
iOS 15.0+ - Swift 版本:
Swift 5.9+(Xcode 15.0+) - 架构支持:
- 真机:
arm64(ios-arm64) - 模拟器:
arm64(Apple Silicon Mac) &x86_64(Intel Mac) (ios-arm64_x86_64-simulator)
- 真机:
2. 使用 Swift Package Manager 安装
方式一:通过公司 Nexus 原生 Swift Package Registry(推荐)
公司测试服 Nexus 已开启原生 Swift Package Registry (SE-0292) 仓库(https://nexus.test.qxjapp.com/repository/qxj-swift/),并将 QXJIMSDK 发布为标准 Registry 包 qxj.QXJIMSDK。使用该方式无需 clone 庞大的 Go 源码仓库,SwiftPM 仅拉取纯 Swift 源码归档与 OpenIMCore.xcframework.zip 二进制产物。
1) 配置本地或 CI 的 Swift Registry 源(首次执行一次)
swift package-registry set https://nexus.test.qxjapp.com/repository/qxj-swift/
2) 在 Package.swift 中直接按 Registry ID (qxj.QXJIMSDK) 声明依赖
dependencies: [
.package(id: "qxj.QXJIMSDK", from: "3.8.3")
],
targets: [
.target(
name: "QXJChatFeature",
dependencies: [
.product(name: "QXJIMSDK", package: "qxj.QXJIMSDK")
]
)
]
方式二:在 qxj-ios/Packages/QXJIMSDK 中作为本地模块 + Nexus 远程 XCFramework
若希望在 qxj-ios 工程内直接调试 QXJIMSDK 的 Swift 源码,可保留 qxj-ios/Packages/QXJIMSDK 目录(仅含 7 个纯 Swift 文件),并在其 Package.swift 中从 Nexus 拉取 OpenIMCore.xcframework.zip:
// qxj-ios/Packages/QXJIMSDK/Package.swift
// swift-tools-version: 5.9
import PackageDescription
let package = Package(
name: "QXJIMSDK",
platforms: [.iOS(.v15)],
products: [
.library(name: "QXJIMSDK", targets: ["QXJIMSDK"])
],
targets: [
.binaryTarget(
name: "OpenIMCore",
url: "https://nexus.test.qxjapp.com/repository/qxj-raw/im-core/ios/3.8.3-patch.3/OpenIMCore.xcframework.zip",
checksum: "b7d383a58ec52ce25bdc013038a4c831aa4280391ec92511c95c3091f3c64a7d"
),
.target(
name: "QXJIMSDK",
dependencies: ["OpenIMCore"],
path: "Sources/QXJIMSDK",
linkerSettings: [
.linkedLibrary("resolv"),
.linkedFramework("SystemConfiguration"),
.linkedFramework("CoreTelephony")
]
)
]
)
在业务 Feature 模块中引用该本地 Package 时,package 名称为 "QXJIMSDK":
dependencies: [
.package(path: "../QXJIMSDK")
],
targets: [
.target(
name: "QXJChatFeature",
dependencies: [
.product(name: "QXJIMSDK", package: "QXJIMSDK")
]
)
]
方式三:直接通过 Git URL 引用 qxj-im-core 仓库
若直接通过 Git URL 引用本仓库(注意:SwiftPM 会根据 Git URL 末尾仓库名将 package 标识解析为 "qxj-im-core"):
dependencies: [
.package(url: "https://git.home.qxjapp.com/JCTX/qxj-im-core.git", branch: "main")
],
targets: [
.target(
name: "QXJChatFeature",
dependencies: [
.product(name: "QXJIMSDK", package: "qxj-im-core")
]
)
]
QXJIMSDK 的 Package.swift 已自动声明 .linkedLibrary("resolv")、SystemConfiguration 与 CoreTelephony,且完全不依赖 Objective-C Category 动态反射,因此无需在 Xcode Build Settings 中手动配置 -ObjC 或 -lresolv。
3. 五分钟上手流程
import Foundation
import QXJIMSDK
@MainActor
final class IMBootstrapService {
func startIM(userID: String, token: String) async throws {
// 1. 准备本地 SQLite 与日志存储目录
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
)
// 2. 初始化 SDK(自动挂载全部 7 大实时事件流)
try QXJIMClient.shared.initSDK(config: config)
// 3. 启动后台协程监听连接状态与新消息
listenToEvents()
// 4. 登录账号
try await QXJIMClient.shared.login(userID: userID, token: token)
}
private func listenToEvents() {
Task {
for await connEvent in QXJIMClient.shared.connectionEvents.stream() {
print("[IM 连接状态]: \(connEvent)")
}
}
Task {
for await msgEvent in QXJIMClient.shared.messageEvents.stream() {
if case .receivedNewMessage(let message) = msgEvent {
print("[收到新消息]: \(message.clientMsgID ?? "") - \(message.textElem?.content ?? "")")
}
}
}
}
}