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 类用途
IMPOSClientIMLib 客户端(连接、消息、会话、群组等)
IMPOSChatViewControllerIMKit 会话页(真实 ObjC 类)
IMPOSConversationListViewControllerIMKit 会话列表页(真实 ObjC 类)
IMPOSGlobalChatViewControllerGlobal UIKit 会话页(真实 ObjC 类)
IMPOSGlobalChatListViewControllerGlobal 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 索引;逐操作参数 / 返回 / 错误码见各功能页。