IM 消息自动解析与分发中间层
PHIMMessageBus 是一个轻量级、可扩展的 IM 消息解析与分发中间层,用来在 IM SDK 与业务处理逻辑之间建立一层清晰、稳定的消息总线。
它的核心目标不是替代 IM SDK,而是把“消息识别、模型映射、路由分发、Handler 订阅”这些通用能力抽出来,降低业务侧接入和维护成本。
特性
- SDK 解耦:支持接入任意 IM SDK,不依赖具体实现
- 自动解析:将原始消息数据解析为强类型业务模型
- 精准分发:按消息类型分发给对应的 Handler
- 可扩展:支持自定义
KeyProvider、ModelFactory、Parser - 低侵入:业务层只关注注册和处理,不关注分发细节
- 可观测:内置日志能力,便于调试链路问题
适用场景
当你的 IM 消息系统存在以下问题时,PHIMMessageBus 会比较适合:
- 原始消息结构复杂,业务层重复做字典解析
- 多种消息类型混杂在同一条回调链路中
- 不同业务方都需要监听特定消息
- 消息类型、解析规则、业务处理逻辑耦合严重
- 想在不改业务代码的情况下替换或适配不同 IM SDK
整体架构
整个系统分为两个阶段:
- 初始化阶段:建立消息类型与处理关系
- 运行时阶段:完成消息解析与分发
从职责划分上看,框架内部主要由以下几部分组成:
PHIMCenter:统一入口,负责配置、注册和分发PHIMMessageRegistry:维护messageKey -> ModelType的映射关系PHIMDispatchCenter:维护ModelType -> Handler的订阅关系,并执行解析与分发PHIMMessageKeyProvider:从原始消息中提取消息类型标识PHIMMessageModelFactory:负责将字典数据构建为业务模型PHIMMessageBodyParser:负责按需提取消息体中需要解析的字段
架构设计
初始化阶段
在系统初始化阶段,主要完成两件事情:
第一是注册消息类型,通过 Registry 建立 messageKey 到 ModelType 的映射; 第二是注册监听关系,通过 DispatchCenter 建立 ModelType 到 Handler 的订阅关系。
虽然这两个过程在实现上是分离的,但在 API 层做了封装,对外只暴露一个 addHandler 方法,简化使用成本。

消息处理阶段
在消息处理阶段,整个流程是一个典型的“解析 + 路由 + 分发”链路:
首先从 RawMessage 中解析出原始字典数据; 然后通过 KeyProvider 提取消息类型 key; 在 Registry 中查找对应的模型类型; 接着进入 DispatchCenter,在这里通过 Parser 对数据进行按需提取; 再通过 ModelFactory 构建业务模型; 最终封装成统一的 MessageContainer,并根据 messageKey 分发给所有订阅的 Handler。

快速开始
1. 基础配置
PHIMCenter.shared.setPrintLog(true)
PHIMCenter.shared.setKeyProvider(PHExampleKeyProvider())
PHIMCenter.shared.setModelFactory(PHExampleModelFactory())
2. 注册消息监听
PHIMCenter.shared.addHandler(self, for: [
PHExampleMessage.self
])
3. 实现消息处理
extension ViewController: PHIMHandlerProtocol {
func handle(_ message: PHIMMessageContainer) {
if let msg = message.body as? PHExampleMessage {
print("收到消息: \(msg)")
}
}
}
4. 分发消息
下面示例模拟 IM SDK 回调,将原始消息传入消息总线:
let rawContent = """
{
"content": {
"homeScore": 2,
"statusId": 2,
"awayScore": 4,
"matchTiming": "第一节07:24",
"scheduleId": 3916567
},
"type": 60016
}
"""
let message = PHExmapleIMRawMessage(
rawContent: rawContent,
sessionId: "1",
sessionType: .chatroom
)
PHIMCenter.shared.dispatch([message])
核心组件
PHIMCenter
统一入口,负责:
- 初始化配置
- 注册 Handler
- 分发消息
- 控制日志输出
PHIMMessageRegistry
注册中心,负责:
- 维护
messageKey -> MessageModel映射关系 - 为运行时路由提供模型类型查找能力
PHIMDispatchCenter
分发中心,负责:
- 维护消息订阅关系
- 调用 Parser 提取消息体
- 调用 ModelFactory 构建模型
- 将消息精准分发给对应 Handler
PHIMMessageProtocol
public protocol PHIMMessageProtocol {
/// 消息标识(唯一 key)
static var messageKey: String { get }
/// 解析字段,默认可指向 content 等节点
static var parseKey: String? { get }
}
PHIMHandlerProtocol
public protocol PHIMHandlerProtocol: AnyObject {
func handle(_ message: PHIMMessageContainer)
}
扩展能力
自定义 KeyProvider
你可以根据自己的 IM 协议,从原始字典中提取消息类型:
class CustomKeyProvider: PHIMMessageKeyProvider {
func messageKey(from dict: [String: Any]) -> String? {
return dict["type"] as? String
}
}
也可以支持组合字段:
return "\(dict["cmd"])-\(dict["subType"])"
自定义 ModelFactory
ModelFactory 负责把解析后的字典转换为业务模型,可以按项目实际情况选择不同策略,例如:
CodableObjectMapper- 手动解析
https://github.com/Louis1239/PHIMMessageBus.git
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)