{"id":18438128,"url":"https://github.com/easemob/uikit_chatroom_ios","last_synced_at":"2026-01-28T13:01:17.787Z","repository":{"id":202564735,"uuid":"707222948","full_name":"easemob/UIKit_Chatroom_ios","owner":"easemob","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-11T05:40:38.000Z","size":17664,"stargazers_count":2,"open_issues_count":4,"forks_count":1,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-12-28T15:31:02.006Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/easemob.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-19T13:15:56.000Z","updated_at":"2025-07-08T03:25:49.000Z","dependencies_parsed_at":"2025-04-07T20:50:41.341Z","dependency_job_id":null,"html_url":"https://github.com/easemob/UIKit_Chatroom_ios","commit_stats":null,"previous_names":["easemob/uikit_chatroom_ios"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/easemob/UIKit_Chatroom_ios","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2FUIKit_Chatroom_ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2FUIKit_Chatroom_ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2FUIKit_Chatroom_ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2FUIKit_Chatroom_ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/easemob","download_url":"https://codeload.github.com/easemob/UIKit_Chatroom_ios/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2FUIKit_Chatroom_ios/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28845762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T12:37:07.070Z","status":"ssl_error","status_checked_at":"2026-01-28T12:37:06.657Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T06:18:42.609Z","updated_at":"2026-01-28T13:01:17.772Z","avatar_url":"https://github.com/easemob.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 聊天室 UIKit\n\n本产品主要为了解决大部分用户的泛娱乐业务场景下对聊天室的绝大部分用户需求，主要为用户解决直接集成SDK繁琐，复杂度高，部分api体验不好（在用户侧开发者来看）等问题。致力于打造集成简单，自由度高，流程简单，文档说明足够详细的聊天室UIKit产品。\n\n# 示例演示\n\n在本项目中，“Example”文件夹中有一个最佳实践演示项目，供您构建自己的业务能力。\n\n如需体验ChatroomUIKit的功能，您可以扫描以下二维码试用demo。\n\n![Demo](./Documentation/demo.png)\n\n# 聊天室 UIKit 指南\n\n## 简介\n\n本指南介绍了 ChatroomUIKit 框架在 iOS 开发中的概述和使用示例，并描述了该 UIKit 的各个组件和功能，使开发人员能够很好地了解 UIKit 并有效地使用它。\n\n## 目录\n\n- [前置开发环境要求](#前置开发环境要求)\n- [安装](#安装)\n- [文档](#文档)\n- [结构](#结构)\n- [快速开始](#快速开始)\n- [注意事项](#注意事项)\n- [进阶用法](#进阶用法)\n- [自定义](#自定义)\n- [业务流程图](#业务流程图)\n- [Api时序图](#Api时序图)\n- [设计指南](#设计指南)\n- [贡献](#贡献)\n- [许可证](#许可证)\n\n# 前置开发环境要求\n\n- Xcode 14.0及以上版本\n- 最低支持系统：iOS 13.0\n- 请确保您的项目已设置有效的开发者签名\n\n# 安装\n\n您可以使用 CocoaPods 安装 ChatroomUIKit 作为 Xcode 项目的依赖项。\n\n## CocoaPods\n\n在podfile中添加如下依赖\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '13.0'\n\ntarget 'YourTarget' do\n  use_frameworks!\n\n  pod 'ChatroomUIKit'\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    target.build_configurations.each do |config|\n      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'\n    end\n  end\nend\n```\n\n然后cd到终端下podfile所在文件夹目录执行\n\n```\n    pod install\n```\n\n\u003e⚠️Xcode15编译报错 ```Sandbox: rsync.samba(47334) deny(1) file-write-create...```\n\n\u003e 解决方法: Build Setting里搜索 ```ENABLE_USER_SCRIPT_SANDBOXING```把```User Script Sandboxing```改为```NO```\n\n\n# 结构\n\n### ChatroomUIKit 基本项目结构\n\n```\n聊天室UI套件\n├─ Service // 基础服务组件。\n│ ├─ Protocol // 业务协议组件。\n│ │ ├─ GiftService // 礼物发送和接收通道。\n│ │ ├─ UserService // 用户登录和用户属性更新的组件。\n│ │ └─ ChatroomService // 实现聊天室管理协议的组件，包括加入和离开聊天室以及发送和接收消息。\n│ ├─ Implement // 协议实现组件。\n│ └─ Client // ChatroomUIKit 初始化类。\n│\n└─ UI // 基本UI组件，不带业务。\n    ├─ Resource // 图像或本地化文件。\n    ├─ Component // 包含具体业务的UI模块。 聊天室UIKit中的一些功能性UI组件。\n    │ ├─ Room // 所有聊天室子视图的容器。\n    │ ├─ Chat // 聊天室中的弹幕组件和底部功能区。\n    │ ├─ Gift // 聊天室的礼物弹幕区、礼物箱等组件。\n    │ └─ Input // 聊天室中的输入组件，例如表情符号。\n    └─ Core\n       ├─ UIKit // 一些常见的UIKit组件和自定义组件。\n       ├─ Theme // 主题相关组件，包括颜色、字体、换肤协议及其组件。\n       └─ Extension // 一些方便的系统类扩展。\n```\n\n# 文档\n\n## [文档](/Documentation/ChatroomUIKit.doccarchive)\n\n您可以在 Xcode 中打开“ChatroomUIKit.doccarchive”文件来查看其中的文件或将此文件部署到您的主页。\n\n另外，您可以右键单击该文件以显示包内容并将其中的所有文件复制到一个文件夹中。 然后将此文件夹拖到“terminal”应用程序中并运行以下命令将其部署到本地IP地址上。\n\n```bash\npython3 -m http.server 8080\n```\n\n部署完成后，您可以在浏览器中访问 http://yourlocalhost:8080/documentation/chatroomuikit   其中`yourlocalhost`是您的本地IP地址。 或者，您可以将此文件夹部署在外部网络地址上。\n\n## Appearance\n\n[Appearance](https://github.com/easemob/UIKit_Chatroom_ios/blob/dev/Documentation/Appearance.md) 即加载UI前的可配项配置类\n\n## ComponentRegister\n\n[ComponentRegister](https://github.com/easemob/UIKit_Chatroom_ios/blob/dev/Documentation/ComponentRegister.md).即可继承进行定制的 UI 组件。\n\n## GiftsViewController\n\n[GiftsViewController](https://github.com/easemob/UIKit_Chatroom_ios/blob/dev/Documentation/GiftsViewController.md)\n\n礼物的承载容器。 您可以继承该类来实现额外的UI定义和业务处理。 当您点击发送按钮发送礼物后，您可以决定是否关闭礼物弹窗，并在您的服务器上调用您业务中的礼物接口将礼物消息发送到聊天室。\n\n# 快速开始\n\n本指南提供了不同 ChatroomUIKit 组件的多个使用示例。 请参阅“示例”文件夹以获取显示各种用例的详细代码片段和项目。\n\n参考以下步骤在 Xcode 中创建一个 iOS 平台下的App，创建设置如下：\n\n* Product Name 填入ChatroomUIKitQuickStart。\n* Organization Identifier 设为 您的identifier。\n* User Interface 选择 Storyboard。\n* Language 选择 你的常用开发语言。\n\n### 第一步：初始化ChatroomUIKit\n\n```swift\nimport ChatroomUIKit\n\n@UIApplicationMain\nclass AppDelegate：UIResponder，UIApplicationDelegate {\n\n     var window：UIWindow？\n\n\n     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -\u003e Bool {\n         // 您可以在应用程序加载时或使用之前初始化 ChatroomUIKit。\n         // 需要传入App Key。\n         // 获取App Key，请访问\n         // https://docs-im-beta.easemob.com/product/enable_and_configure_IM.html#%E8%8E%B7%E5%8F%96%E7%8E%AF%E4%BF%A1%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AF-im-%E7%9A%84%E4%BF%A1%E6%81%AF\n         let error = ChatroomUIKitClient.shared.setup（appKey: \"Appkey\"）\n     }\n}\n```\n\n### 第2步：登录\n\n```swift\n// 需要从您的应用服务器获取token。 您也可以使用控制台生成的临时Token登录。\n// 在控制台生成用户和临时用户 token，请参见\n// https://docs-im-beta.easemob.com/product/enable_and_configure_IM.html#%E5%88%9B%E5%BB%BA-im-%E7%94%A8%E6%88%B7。\n\nChatroomUIKitClient.shared.login(\n    userId: \"user id\", token: \"token\"\n) { error in\n\n}\n```\n\n### 第三步：创建聊天室视图\n\n```swift\n// 1. 获取聊天室列表并加入聊天室。 或者，在 环信 控制台上创建聊天室。\n// 选择“项目管理 \u003e 运营管理 \u003e 聊天室”，单击“创建聊天室”，在弹出的对话框中设置参数，创建聊天室。 获取聊天室 ID，将其传递给以下 `launchRoomView` 方法。\n// 参见https://docs-im-beta.easemob.com/product/enable_and_configure_IM.html#%E5%88%9B%E5%BB%BA%E8%81%8A%E5%A4%A9%E5%AE%A4\n// 2. 通过传入布局参数和底部工具栏的扩展按钮模型协议数组等参数，使用`ChatroomView`创建聊天室视图。\n// 建议ChatroomView的宽度初始化为屏幕的宽度，高度不小于屏幕的高度减去导航的高度。\nlet roomView = ChatroomUIKitClient.shared.launchRoomView(\n    roomId: String, frame: CGRect, isOwner: Bool\n)\n// 3. 添加视图。\naddSubView(roomView)\n// 4. 通过控制台将用户添加到聊天室。\n// 选择项目管理 \u003e 运营管理 \u003e 聊天室。 在聊天室的操作栏中选择查看聊天室成员，然后在弹出的对话框中将用户添加到聊天室。\n```\n\n事件透传请参考下一章。\n\n# 注意事项\n\n在调用`ChatroomUIKitClient.shared.launchRoomView(roomId: self.roomId, frame: CGRect(x: 0, y: ScreenHeight/2.0, width: ScreenWidth, height: ScreenHeight/2.0), ownerId: \"当前聊天室的主播用户ID\")`时，记得将ChatroomView添加到现有视图之上，以方便拦截和透传点击事件。\n\n![UI层级图](./Documentation/hierarchy.png)\n\n例如，如果您有一个播放视频流的视图，请添加到视频视图的上方，`ChatroomView`实质上是全屏覆盖的，传入的frame是可用区域，弹幕区域以及底部功能条区域，以及键盘弹起后输入框中事件的响应高度。\n\n# 进阶用法\n\n以下是进阶用法的三个示例。\n\n## 1.初始化聊天室UIKit\n相比于上面快速开始的聊天室UIKit初始化这里多了ChatOptions的参数，主要是对SDK中是否打印log以及是否自动登录，是否默认使用用户属性的开关配置。\n```swift\nlet error = ChatroomUIKitClient.shared.setup(\n    with: \"Your appkey\",\n    option: ChatroomUIKitInitialOptions.ChatOptions()\n)\n```\n\n## 2.登录\n\n```swift\npublic final class YourAppUser: NSObject, UserInfoProtocol {\n    public var identity: String = \"\"//user level picture url\n\n    public func toJsonObject() -\u003e Dictionary\u003cString, Any\u003e? {\n        [\n            \"userId\": self.userId,\n            \"nickname\": self.nickname,\n            \"avatarURL\": self.avatarURL,\n            \"identity\": self.identity,\n            \"gender\": self.gender\n        ]\n    }\n\n    public var userId: String = \u003c#T##String#\u003e\n\n    public var nickname: String = \"Jack\"\n\n    public var avatarURL: String = \"https://accktvpic.oss-cn-beijing.aliyuncs.com/pic/sample_avatar/sample_avatar_1.png\"\n\n    public var gender: Int = 1\n}\n// 使用当前用户对象符合`UserInfoProtocol`协议的用户信息登录ChatroomUIKit。\n// token生成参见快速开始中登录步骤中链接。\n ChatroomUIKitClient.shared.login(user: YourAppUser(), token: ExampleRequiredConfig.chatToken)\n```\n\n## 3.初始化聊天室视图\n\n```swift\n//1. 获取聊天室列表并加入聊天室或者控制台上创建聊天室。\n// 2. 通过传入布局参数和底部工具栏的扩展按钮模型协议数组等参数，使用`ChatroomView`创建聊天室视图。\n    let options  = ChatroomUIKitInitialOptions.UIOptions()\n    options.bottomDataSource = self.bottomBarDatas()\n    options.showGiftMessageArea = true\n    options.chatAreaShowGift = false\n    let roomView = ChatroomUIKitClient.shared.launchRoomView(roomId: self.roomId, frame: CGRect(x: 0, y: ScreenHeight/2.0, width: ScreenWidth, height: ScreenHeight/2.0), ownerId: \"Chatroom's owner id\", options: options)\n//3. 添加视图\n    addSubView(roomView)\n```\n\n## 4.监听ChatroomUIKit事件和错误\n\n您可以调用`registerRoomEventsListener`方法来侦听 ChatroomUIKit 事件和错误。\n\n```swift\nChatroomUIKitClient.shared.registerRoomEventsListener(self)\n```\n\n# 自定义\n\n## 1.修改可配置项\n\n下面展示如何更改弹幕区域的整体单元格布局风格以及如何创建ChatroomView。\n\n```swift\n// 可以通过设置属性来改变弹幕区域的整体单元格布局风格。\nAppearance.messageDisplayStyle = .hideUserIdentity\n// 创建ChatroomView，传入布局参数、底部工具栏扩展按钮模型协议数组等参数。\nlet roomView = ChatroomUIKitClient.shared.launchRoomView(roomId: \"聊天室 ID\",frame: \u003c#T##CGRect#\u003e)\nself.view.addSubView(roomView)\n```\n\n详情请参见[Appearance](./Documentation/Appearance.md)。\n\n## 2.自定义组件\n\n下面展示如何自定义礼物弹幕视图cell。\n\n```swift\nclass CustomGiftMessageViewCell: GiftMessageCell {\n    lazy var redDot: UIView = {\n        UIView().backgroundColor(.red).cornerRadius(.large)\n    }()\n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        self.addSubview(redDot)\n    }\n\n    override func refresh(item: GiftEntityProtocol) {\n        super.refresh(item: item)\n        self.redDot.isHidden = item.selected\n    }\n}\n//在ChatroomUIKit中注册继承原有类的自定义类来替换原来的类。\n//在创建ChatroomView或使用其他UI组件之前调用此方法。\nComponentsRegister.shared.GiftMessageViewCell = CustomGiftMessageViewCell.self\n```\n\n详情请参见[ComponentsRegister](./Documentation/ComponentRegister.md)\n\n## 3.切换原创或自定义主题\n- 切换到 ChatroomUIKit 附带的浅色或深色主题。在初始化聊天室UIKit视图之前切换主题切换主题即可更改默认主题，在视图使用中也可以切换由开发者判断系统当前主题后切换你想对应的主题即可。\n\n```swift\nTheme.switchTheme(style: .dark)\n// 或\nTheme.switchTheme(style: .light)\n```\n\n- 切换到自定义主题。\n\n```swift\n/**\n如何定制主题？\n\n自定义主题时，需要参考设计文档的主题色定义以下五种主题色的色相值。\n\nChatroomUIKit 中的所有颜色都是使用 HSLA 颜色模型定义的，该模型是一种使用色调、饱和度、亮度和 alpha 表示颜色的方式。\n\nH（Hue）：色相，颜色的基本属性，是色轮上从0到360的一个度数。0是红色，120是绿色，240是蓝色。\n\nS（饱和度）：饱和度是颜色的强度和纯度。 饱和度越高，颜色越鲜艳； 饱和度越低，颜色越接近灰色。 饱和度以百分比值表示，范围从 0% 到 100%。 0% 表示灰度，100% 表示全色。\n\nL（明度）：明度是颜色的亮度或暗度。 亮度越高，颜色越亮； 亮度越低，颜色越深。 亮度以百分比值表示，范围从 0% 到 100%。 0% 表示黑色，100% 表示白色。\n\nA（Alpha）：Alpha是颜色的透明度。 值 1 表示完全不透明，0 表示完全透明。\n\n通过调整HSLA模型的各个分量的值，您可以实现精确的色彩控制。\n  */\nAppearance.primaryHue = 191/360.0\nAppearance.secondaryHue = 210/360.0\nAppearance.errorHue = 189/360.0\nAppearance.neutralHue = 191/360.0\nAppearance.neutralSpecialHue = 199/360.0\nTheme.switchTheme(style: .custom)\n```\n\n# 业务流程图\n下图展示了业务请求和回调的整个逻辑。\n![业务逻辑整体流程图](/Documentation/BusinessFlowchart.png)\n\n# Api时序图\n\n下图是Example项目中最佳实践的API调用时序图。\n\n![APIUML](/Documentation/Api.png)\n\n# 设计指南\n\n如果您对设计指南和细节有任何疑问，您可以在 Figma 设计稿中添加评论并提及我们的设计师 Stevie Jiang。\n\n参见[设计图](https://www.figma.com/community/file/1322495388317476706/chatroom-uikit)。\n\n请参阅[UI设计指南](https://docs-im-beta.easemob.com/uikit/chatroomuikit/ios/design_guide.html)\n\n# 贡献\n\n欢迎贡献和反馈！ 对于任何问题或改进建议，您可以提出问题或提交拉取请求。\n\n## 作者\n\nzjc19891106, [984065974@qq.com](mailto:984065974@qq.com)\n\n## 许可证\n\nChatroomUIKit 可在 MIT 许可下使用。 有关详细信息，请参阅许可证文件。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasemob%2Fuikit_chatroom_ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feasemob%2Fuikit_chatroom_ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasemob%2Fuikit_chatroom_ios/lists"}