Objective-C 接入
iOS SDK 同时暴露 Objective-C 接口:聚合类 IMPOSClient + completion handler 风格回调。Swift 与 Objective-C 是同一份实现:同一个 appkey 初始化返回同一实例,两种语言可以在同一进程内混用。本页给出 ObjC 侧的初始化、连接、收发、事件、错误处理与 IMKit 挂载。
声明来源
当前 ObjC 声明来自 SDK 产物(objc-surface),与 Swift 方法逐一对应。
1. 初始化
#import <ImpIaaSIM/ImpIaaSIM.h>
// 工厂:initWithAppkey:serverUrl:(应用内单例见 ImpIaaSIM.client)
IMPOSClient *client = [[IMPOSClient alloc] initWithAppkey:@"YOUR_APP_KEY"
serverUrl:@"https://im.example.com"];
NSLog(@"ImpIaaSIM %@", client.contractVersion);import ImpIaaSIM
let client = ImpIaaSIM.client(options: IMPClientOptions(
appkey: "YOUR_APP_KEY",
serverUrl: "https://im.example.com"
))2. 连接与事件
// 事件注册返回 token,移除时传同一 token(避免闭包无法比较)
IMPOSListenerToken *token = [client addEventListener:@"messages" handler:^(IMPOSEvent *event) {
for (IMPOSMessage *message in event.messages) {
// 按 conversationType / targetId 聚合,按 clientMsgId 去重
}
}];
// [client removeEventListener:token];
[client connectWithToken:TOKEN completion:^(IMPOSResult *result) {
if (result.code != 0) {
NSLog(@"connect failed: %ld %@", (long)result.code, result.msg);
}
}];final class MessageListener: IMPEventListener {
func onEvent(_ payload: IMPEventPayload) {
if case .messages(let messages) = payload {
for message in messages { /* 聚合 / 去重 */ }
}
}
}
let listener = MessageListener()
client.addEventListener(.messages, listener: listener)
let res = await client.connect(token: TOKEN)
if res.code != 0 { print("connect failed: \(res.code) \(res.msg ?? "")") }3. 发送消息与拉取会话
[client sendTextMessageWithConversationType:1 /* 单聊 */
targetId:@"user2"
text:@"你好,NI PaaS"
completion:^(IMPOSResult *result) {
if (result.code != 0) { NSLog(@"send failed: %@", result.msg); return; }
[self appendMessage:result.data]; // 气泡置为已发送
}];
[client getConversationListWithCompletion:^(IMPOSResult *result) {
if (result.code == 0) {
self.conversations = result.data;
[self.tableView reloadData];
}
}];let sent = await client.sendTextMessage(
conversationType: .privateChat, targetId: "user2", text: "你好,NI PaaS", options: nil
)
let conversations = await client.getConversationList()4. 错误处理
Objective-C
[client connectWithToken:TOKEN completion:^(IMPOSResult *result) {
switch (result.code) {
case 0: break;
case 1002: /* Token 无效:重新获取 */ break;
case 3002:
case 3003: /* 超时 / 网络:退避重试 */ break;
default: NSLog(@"connect failed: %ld %@", (long)result.code, result.msg); break;
}
}];5. IMKit(Objective-C)
Objective-C 示例已隐藏(含未导出符号)
该示例引用了 SDK 头文件未导出的符号(多为 Swift 专用 helper)。请使用下表真实 ObjC 类,或参考对应组件页的 Objective-C 接入说明。
| 可用 ObjC 类 | 用途 |
|---|---|
IMPOSClient | IMLib 客户端(连接、消息、会话、群组等) |
IMPOSChatViewController | IMKit 会话页(真实 ObjC 类) |
IMPOSConversationListViewController | IMKit 会话列表页(真实 ObjC 类) |
IMPOSGlobalChatViewController | Global UIKit 会话页(真实 ObjC 类) |
IMPOSGlobalChatListViewController | Global UIKit 会话列表页(真实 ObjC 类) |
6. 混编注意事项
- Swift 侧 `@objc` 符号统一 `IMP` 前缀;ObjC 侧不需要桥接头文件即可直接使用(`use_frameworks!`)。
- 回调在主线程投递;更新 UI 无需再切队列。
- `RcResult` 在 ObjC 中是对象(`RcResult *`),`code` 为整型、`msg` 可能为 nil;判断成功只看 `code == 0`。
- 同一 handler 重复注册只生效一次;移除监听必须传同一 listener 实例。
- 不要在 ObjC 里自行创建第二条 WebSocket:IMLib 只允许一个连接实例,重复初始化返回同一实例。
Objective-C API 索引
全部 103 个语义操作的 ObjC 声明与 Swift 签名对照见 Objective-C API 索引;逐操作参数 / 返回 / 错误码见各功能页。