差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
im:ios:sdk:prepare [2019/07/12 04:26]
huanxinfudh [iOS SDK 快速集成]
im:ios:sdk:prepare [2022/08/03 07:27] (当前版本)
jennifer.zeng [iOS SDK 快速集成]
行 1: 行 1:
 ====== iOS SDK 快速集成 ====== ====== iOS SDK 快速集成 ======
-在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念,最新版本的SDK 只支持 **iOS9** 及以上 iOS 系统版本。+在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念,最新版本的 SDK 只支持 **iOS 10** 及以上 iOS 系统版本。 
  
 **注:**此文档对之前的文档进行了优化,结构更清晰,帮助您更快的集成环信 iOS SDK,且对UI进行了改版优化。如果您已集成环信 iOS SDK ,并习惯于之前文档的结构,希望再次了解其集成方式,可参考之前的[[im:​ios:​sdk:​import|旧文档]]。 **注:**此文档对之前的文档进行了优化,结构更清晰,帮助您更快的集成环信 iOS SDK,且对UI进行了改版优化。如果您已集成环信 iOS SDK ,并习惯于之前文档的结构,希望再次了解其集成方式,可参考之前的[[im:​ios:​sdk:​import|旧文档]]。
 +
 +''​特殊提示:如果使用的是 xcode11 打包,那么需要先将环信 SDK 内的模拟器框架去掉,否则会报 "IPA processing failed"​ 的错误。''​ (如何剔除 SDK 内的模拟器框架,见 iOS SDK 快速集成中的'​集成动态库上传 AppStore'​)
 ---- ----
 +
 +===== DEMO 体验 =====
 +
 +[[https://​github.com/​easemob/​chat-ios.git |EaseIM 源码地址]]
 +
 +**注:**更多 Demo 体验,请前往[[http://​www.easemob.com/​download/​im|下载页]]
  
 ===== 注册并创建应用 ===== ===== 注册并创建应用 =====
行 13: 行 22:
 Appkey:一个 APP 的唯一标识 Appkey:一个 APP 的唯一标识
  
-IM 用户:一个 ​appkey ​下的唯一标识用户,用来登录环信服务器进行收发消息的用户。 +IM 用户:一个 ​Appkey ​下的唯一标识用户,用来登录环信服务器进行收发消息的用户。 
-可以在创建好的应用内注册两个 IM 用户(也可以称为环信 ​id),例如: 账号:user1,密码:123 ; 账号:user2,密码:123,用来通过 SDK 登录环信服务器,收发消息测试。+可以在创建好的应用内注册两个 IM 用户(也可以称为环信 ​ID),例如: 账号:user1,密码:123 ; 账号:user2,密码:123,用来通过 SDK 登录环信服务器,收发消息测试。
  
  
行 56: 行 65:
   * EMChatroomManager:​ 负责聊天室的管理。   * EMChatroomManager:​ 负责聊天室的管理。
  
-注意:如果您是从 SDK2.x 升级到 3.0,可以参考[[im:​ios:​sdk:​upgradeguide|环信 SDK 2.x到3.0升级文档]]。+注意:如果您是从 SDK2.x 升级到 3.0,可以参考[[im:​ios:​sdk:​upgradeguide|环信 SDK 2.x 到 3.0 升级文档]]。
  
  
行 64: 行 73:
 ===== 集成 SDK ===== ===== 集成 SDK =====
  
-环信 SDK 支持**pod 方式导入**,**手动导入**两种方式任选其一即可,下面分别介绍两种导入方式。+环信 SDK 支持 **pod 方式导入**,**手动导入**两种方式任选其一即可,下面分别介绍两种导入方式。
  
-==== Pod 导入SDK ====+''​从 3.6.0 版本开始,SDK 只支持 iOS 9.0 及以上版本。''​ 
 +==== Pod 导入 SDK ====
  
-推荐使用 ''​Cocoapods''​ 集成环信 SDK。 Cocoapods 提供了一个简单的依赖管理系统,避免手动导入产生的错误(首先需要确认已经安装了 Cocoapods,如果没有安装过Cocoapods,参考安装使用指南:https://​www.cnblogs.com/​wangluochong/​p/​5567082.html)。+推荐使用 ''​Cocoapods''​ 集成环信 SDK。 Cocoapods 提供了一个简单的依赖管理系统,避免手动导入产生的错误(首先需要确认已经安装了 Cocoapods,如果没有安装过 Cocoapods,参考安装使用指南:https://​www.cnblogs.com/​wangluochong/​p/​5567082.html)。
  
 <​code>​ <​code>​
行 75: 行 85:
 </​code>​ </​code>​
  
-在 ''​Xcode''​ 项目的根目录下,新建一个空文件,命名为 ''​Podfile''​,向此文件添加以下行( Lite 版与 Full 版,根据自己是否需要实时音视频功能二选一添加即可)+在 ''​Xcode''​ 项目的根目录下,新建一个空文件,命名为 ''​Podfile''​,向此文件添加以下行:
  
 <​code>​ <​code>​
-#​Lite版本(不带实时音视频通话功能) +pod 'HyphenateChat'
-pod 'HyphenateLite'​ +
-#​Full版本(带实时音视频通话功能) +
-pod '​Hyphenate'+
 </​code>​ </​code>​
  
行 87: 行 94:
  
 <​code>​ <​code>​
-pod install+pod install ​--repo-update ​
 </​code>​ </​code>​
  
-执行完pod install,打开工程目录,找到.xcworkspace文件运行即可。+ 
 + 
 +执行完 pod install,打开工程目录,找到 .xcworkspace 文件运行即可。
 ---- ----
  
 ==== 手动导入 SDK ==== ==== 手动导入 SDK ====
  
-[[https://download-sdk.oss-cn-beijing.aliyuncs.com/downloads/iOS_IM_SDK_V3.5.3.zip|下载环信demo]]+[[http://www.easemob.com/download/im|下载环信demo]]
  
  
-  * HyphenateFullSDK ​   ​开发使用(包含实时通话功能的 ​SDK+  * HyphenateChat ​  开发使用 SDK
  
-  * HyphenateSDK ​  开发使用(不包含实时通话功能的 SDK)+开发者最开始集成,如果选择手动导入文件集成的方式,只需要向工程中添 ''​HyphenateChat''​ 就可以,下面会介绍具体集成方式。
  
-开发者最开始集成,如果选择手动导入文件集成的方式,只需要向工程添''​HyphenateFullSDK''​或者''​HyphenateSDK''​文件就可以,下面会介绍具体集成方式。 +demo 中的 SDK 文件夹为 Hyphenate ​SDK,将 SDK 文件夹拖入到工程中,并勾选截图中标注的三项。
- +
-demo 中有两个 ​SDK 文件夹: +
- +
-  * HyphenateSDK ​  ​开发使用(不包含实时语音视频通话功能) +
- +
-  * HyphenateFullSDK ​  ​开发使用(包含实时语音视频通话功能) +
- +
-两个 ​SDK 除了是否带有实时语音视频通话功能其他功能都是相同的。 +
- +
-两者中选择一个 ​SDK 文件夹拖入到工程中,以导入 HyphenateSDK 为例,并勾选截图中标注的三项。+
  
 {{:​im:​ios:​sdk:​选项.png?​direct|}} {{:​im:​ios:​sdk:​选项.png?​direct|}}
行 118: 行 117:
 === 设置工程属性 === === 设置工程属性 ===
  
-向 General → Embedded Binaries 中添加依赖库。 +Xcode 中,向 General → Embedded Binaries 中添加依赖库。
- +
-{{:​im:​ios:​sdk:​依赖库.png?​direct|}}+
  
 +**注意要将 'Do Not Embed' 改成 'Embed & Sign'​**
 +{{:​im:​ios:​sdk:​04380a97-8a50-4e50-bcb0-5c9d6d4d9818.png?​600|}}
 ---- ----
  
  
 ==== Demo 目录介绍 ==== ==== Demo 目录介绍 ====
-目录 ​EMiOSDemo ​—>​Class 中的 Demo 目录介绍+目录 ​EaseIM ​—>​Class 中的 Demo 目录介绍
  
-{{:​im:​ios:​sdk:​目录.jpg?nolink|}}+{{:​im:​ios:​sdk:​2e702406-82da-4f6b-9ae7-a2c42850f39b.png?600|}}
  
   * Account:主要是 demo 的注册,登录   * Account:主要是 demo 的注册,登录
   ​   ​
-  * AppDelegate:主要是 demo 中初始化环信SDK,注册推送等+  * AppDelegate:主要是 demo 中初始化环信 SDK,注册推送等
   ​   ​
-  * Call:demo 的语音视频通话功能页面(包含 ​ 1v1 实时通话以及多人实时通话的功能) ​+  * Communicate:demo 的语音视频通话功能页面(包含 1v1 实时通话以及多人实时通话的功能) ​
   ​   ​
   * Chat:demo 的聊天功能页面   * Chat:demo 的聊天功能页面
行 142: 行 141:
   * Conversation:demo 的会话列表功能页面   * Conversation:demo 的会话列表功能页面
   ​   ​
-  * EMDemoHelper:demo 的单例类,主要是全局监听接收消息,好友,群组,聊天室等相关事件的回调,从而进行对应的处理+  * EaseIMHelper:demo 的单例类,主要是全局监听接收消息,好友,群组,聊天室等相关事件的回调,从而进行对应的处理
   ​   ​
   * Group:demo 的群组功能页面   * Group:demo 的群组功能页面
行 161: 行 160:
 ===== 集成 UI ===== ===== 集成 UI =====
  
-环信的 UI 模块在 demo 中的该路径下 ​EMiOSDemo---Class+环信的 UI 模块在 demo 中的该路径下 ​EaseIM---Class
  
 demo 中有几大 UI 功能模块,在集成时将对应的模块添加到工程中即可。 demo 中有几大 UI 功能模块,在集成时将对应的模块添加到工程中即可。
行 170: 行 169:
   * Conversation------会话列表模块   * Conversation------会话列表模块
   ​   ​
-  * Call------实时音视频模块(包含 1v1 实时通话以及多人实时通话的功能)+  * Communicate------实时音视频模块(包含 1v1 实时通话以及多人实时通话的功能)
   ​   ​
   * Contact------好友列表模块   * Contact------好友列表模块
行 188: 行 187:
   ​   ​
   * SDWebImage   * SDWebImage
-  ​ 
-  * SDWebImage/​GIF 
   ​   ​
   * FLAnimatedImage   * FLAnimatedImage
行 211: 行 208:
   * Privacy - Camera Usage Description 需要访问您的摄像机   * Privacy - Camera Usage Description 需要访问您的摄像机
  
-  * Privacy - Location Always ​Usage Description 需要您的同意,​才能在使用期间访问位置 +  * Privacy - Location Always Usage Description 需要您的同意,​才能始终访问位置
- +
-  * Privacy - Location When In Use Usage Description 需要您的同意,​才能始终访问位置 +
  
 ---- ----
  
-===== 添加SDK以及UI头文件 =====+===== 添加 SDK 以及 UI 头文件 =====
  
 建议在 ''​PCH''​ 文件中引入 SDK 以及 UI 的头文件。如果工程中没有 ''​pch''​ 文件,需要新建一个,并在 ''​Build Settings''​ 中设置 ''​Prefix Header''​ 为该 pch 文件,例如:''​iOS/​PrefixHeader.pch''​。 建议在 ''​PCH''​ 文件中引入 SDK 以及 UI 的头文件。如果工程中没有 ''​pch''​ 文件,需要新建一个,并在 ''​Build Settings''​ 中设置 ''​Prefix Header''​ 为该 pch 文件,例如:''​iOS/​PrefixHeader.pch''​。
行 226: 行 220:
 <​code>​ <​code>​
 #ifdef __OBJC__ #ifdef __OBJC__
-// 包含实时音视频功能 SDK 的头文件 +#import <HyphenateChat/HyphenateChat.h>
-#import <​Hyphenate/​Hyphenate.h>​ +
-// UI 头文件 +
-#import "​EMHeaders.h"​ +
-#endif +
-</​code>​ +
- +
-或者 +
- +
-<​code>​ +
-#ifdef __OBJC__ +
-//​不包含实时音视频功能 SDK 的头文件 +
-#import <HyphenateLite/HyphenateLite.h>+
 // UI 头文件 // UI 头文件
 #import "​EMHeaders.h"​ #import "​EMHeaders.h"​
行 269: 行 251:
 - (BOOL)application:​(UIApplication *)application didFinishLaunchingWithOptions:​(NSDictionary *)launchOptions - (BOOL)application:​(UIApplication *)application didFinishLaunchingWithOptions:​(NSDictionary *)launchOptions
 { {
-    // appkey替换成自己在环信管理后台注册应用中的appkey+    // Appkey ​替换成自己在环信管理后台注册应用中的 ​Appkey
 EMOptions *options = [EMOptions optionsWithAppkey:​@"​appkey"​];​ EMOptions *options = [EMOptions optionsWithAppkey:​@"​appkey"​];​
 // apnsCertName是证书名称,可以先传nil,等后期配置apns推送时在传入证书名称 // apnsCertName是证书名称,可以先传nil,等后期配置apns推送时在传入证书名称
行 279: 行 261:
  
 ==== 登录环信服务器 ==== ==== 登录环信服务器 ====
 +
 +建议使用异步登录方法,防止网络不好的情况下,出现卡 UI 主线程的情况出现。
  
 <​code>​ <​code>​
 // 传入在应用(appkey)下注册的IM用户user1,密码123,用于登录环信服务器 // 传入在应用(appkey)下注册的IM用户user1,密码123,用于登录环信服务器
-EMError *error = [[EMClient sharedClient] loginWithUsername:​@"​user1"​ password:​@"​123"​]; + 
-if (!error) { +[[EMClient sharedClient] loginWithUsername:​@"​user1"​ password:​@"​123" ​completion:​^(NSString *aUsername, EMError *aError) { 
-    NSLog(@"​登录成功"​);​ +    if (!aError) { 
-}+        NSLog(@"​登录成功"​);​ 
 +    else { 
 +        NSLog(@"​登录失败的原因---%@",​ aError.errorDescription);​ 
 +    } 
 +}];
 </​code>​ </​code>​
  
   * 如果在集成调试阶段,可以在初始化环信 SDK 完成之后,就调用登录方法。   * 如果在集成调试阶段,可以在初始化环信 SDK 完成之后,就调用登录方法。
  
-  * 如果项目上线,建议开发者在登录自己服务器成功之后,再调用环信 SDK 登录方法使用用户绑定的环信id登录环信服务器(开发者给自己用户在自己服务器创建账号的同时,调用环信的 ​rest 接口在给用户授权注册一个环信 ​id,一起返回给 ​app 端,app 端拿到用户的账号密码以及环信 ​id 密码分别登录自己的服务器以及环信服务器)。+  * 如果项目上线,建议开发者在登录自己服务器成功之后,再调用环信 SDK 登录方法使用用户绑定的环信 ​ID 登录环信服务器(开发者给自己用户在自己服务器创建账号的同时,调用环信的 ​REST 接口在给用户授权注册一个环信 ​ID,一起返回给 ​App 端,App 端拿到用户的账号密码以及环信 ​ID 密码分别登录自己的服务器以及环信服务器)。
  
 ---- ----
行 296: 行 284:
  
 ===== 初始化聊天页面 ===== ===== 初始化聊天页面 =====
 +
 向工程中导入 ''​Chat''​ 文件 向工程中导入 ''​Chat''​ 文件
 +
 <​code>​ <​code>​
-// ConversationId接收消息方的环信ID:​@"​user2"​ +// ConversationId 接收消息方的环信 ID:​@"​user2"​ 
-// type聊天类型:​EMConversationTypeChat ​   单聊类型+// type 聊天类型:​EMConversationTypeChat ​   单聊类型
 // createIfNotExist 如果会话不存在是否创建会话:YES // createIfNotExist 如果会话不存在是否创建会话:YES
-EMChatViewController *chatController = [[EMChatViewController alloc] initWithConversationId:​@"​user2" ​type:​EMConversationTypeChat createIfNotExist:​YES];​+EMChatViewController *chatController = [[EMChatViewController alloc] initWithConversationId:​@"​user2" ​conversationType:​EMConversationTypeChat createIfNotExist:​YES];​
  
 [self.navigationController pushViewController:​chatController animated:​YES];​ [self.navigationController pushViewController:​chatController animated:​YES];​
行 311: 行 301:
  
 ===== 集成实时音视频通话 ===== ===== 集成实时音视频通话 =====
-向工程中导入 ''​Call''​ 文件+ 
 +向工程中导入 ''​Communicate''​ 文件
  
 在初始化 SDK 完成之后,在初始化SDK所在的类引入头文件: 在初始化 SDK 完成之后,在初始化SDK所在的类引入头文件:
 +
 <​code>​ <​code>​
-#import "DemoCallManager.h" ​ // 1v1实时通话功能的头文件 +#import "SingleCallController.h" ​ // 1v1 实时通话功能的头文件 
-#import "DemoConfManager.h" ​ // 多人实时通话功能的头文件+#import "ConferenceController.h" ​ // 多人实时通话功能的头文件
  ​添加:  ​添加:
- [DemoCallManager ​sharedManager]; ​ // 初始化1v1实时通话功能的单例 +[SingleCallController ​sharedManager]; ​ // 初始化 1v1 实时通话功能的单例 
- [DemoConfManager ​sharedManager]; ​ // 初始化多人实时通话功能的单例+[ConferenceController ​sharedManager]; ​ // 初始化多人实时通话功能的单例
 </​code>​ </​code>​
-在聊天页面中下方,点击语音,视频通话图标按钮即可使用。+ 
 +在聊天页面中下方,点击视频通话图标按钮即可使用。
  
 ---- ----
  
 ===== 集成其他模块 ===== ===== 集成其他模块 =====
 +
 +集成这些模块,涉及到一些回调方法的监听与页面的跳转,需要在初始化环信 SDK 之后,添加 [EMDemoHelper shareHelper];​
  
 ==== 会话列表 ==== ==== 会话列表 ====
行 333: 行 328:
  
 初始化页面跳转(导航跳转示例): 初始化页面跳转(导航跳转示例):
 +
 <​code>​ <​code>​
 EMConversationsViewController *conversationVC = [[EMConversationsViewController alloc] init]; EMConversationsViewController *conversationVC = [[EMConversationsViewController alloc] init];
行 339: 行 335:
  
 ==== 好友列表 ==== ==== 好友列表 ====
 +
 向工程中导入 ''​Contact''​ 文件 向工程中导入 ''​Contact''​ 文件
  
行 344: 行 341:
  
 初始化页面跳转(导航跳转示例): 初始化页面跳转(导航跳转示例):
 +
 <​code>​ <​code>​
 EMContactsViewController *contactVC= [[EMContactsViewController alloc] init]; EMContactsViewController *contactVC= [[EMContactsViewController alloc] init];
行 350: 行 348:
  
 ==== 群组 ==== ==== 群组 ====
 +
 向工程中导入 ''​Group''​ 文件 向工程中导入 ''​Group''​ 文件
  
行 355: 行 354:
  
 初始化页面跳转(导航跳转示例): 初始化页面跳转(导航跳转示例):
 +
 <​code>​ <​code>​
 EMGroupsViewController *groupVC= [[EMContactsViewController alloc] init]; EMGroupsViewController *groupVC= [[EMContactsViewController alloc] init];
行 361: 行 361:
  
 ==== 聊天室 ==== ==== 聊天室 ====
 +
 向工程中导入 ''​Chatroom''​ 文件 向工程中导入 ''​Chatroom''​ 文件
  
行 366: 行 367:
  
 初始化页面跳转(导航跳转示例): 初始化页面跳转(导航跳转示例):
 +
 <​code>​ <​code>​
 EMChatroomsViewController *chatRoomVC= [[EMChatroomsViewController alloc] init]; EMChatroomsViewController *chatRoomVC= [[EMChatroomsViewController alloc] init];
行 374: 行 376:
  
  
-===== 集成动态库上传AppStore =====+===== 集成动态库上传 AppStore =====
  
-由于 iOS 编译的特殊性,为了方便发者使用我们将 ''​i386'',​ ''​x86_64'',​ ''​armv7''​''​arm64''​ 几个平台都合并到了一起所以使用动态库上传 appstore ​时需要将 ''​i386''​ , ''​x86_64''​ 两个平台删后,才能正常提交审核\\+从 3.7.4 版本 SDK 始支持 bitcode 打包并且不再支持 ​armv7,i386 指令集打包时需除 armv7 指令。\\ 
 +Xcode11 需在 Build Settings - Valid Architectures 设置项去除 armv7 指令;\\ 
 +Xcode12 需在 Build Settings - Excluded Architectures 设置项添加 armv7 指令,若是 iOS11 以上无需此操作;
  
-在 SDK 当前路径下执行以下命令删除i386, ​x86_64两个平台\\ +由于 iOS 编译的特殊性,为了方便开发者使用,我们将 ''​x86_64'',''​arm64'' ​两个平台都合并到了一起,所以使用动态库上传 AppStore 时需要将 ''​x86_64''​ 平台删除后,才能正常提交审核。\\ 
-bak 文件是备份目上传appstore之后需换回 ​bak 目录下的 SDK\\+ 
 +首先将 SDK 进行备份。因为剔除过 SDK 的项只能真机运行,要想继续模拟器运行,要换回未剔除的 SDK。 
 + 
 +然后进入到 Launchpad 中,找到其他---打开终端,然后 cd 到 SDK 的所在目录。\\ 
 +简单的方式就是找到项目中的环信 SDK,然后终端先输入 cd,然后按空格键,将环信 SDK 拖拽到终端内,会自动生成SDK的路径,然后环信 SDK 名称 .framework 删除掉,不要 cd 到环信 SDK,只 cd 到 SDK 所在的目录下即可。\\ 
 +示例:\\ 
 +比如环信 SDK 路径是\\ 
 +/​Users/​easemob-dn0164/​Desktop/​iOS_IM_SDK_V3.6.0/​HyphenateFullSDK/​Hyphenate.framework\\ 
 +那么只需要 cd 到\\ 
 +/​Users/​easemob-dn0164/​Desktop/​iOS_IM_SDK_V3.6.0/​HyphenateFullSDK/​\\  
 +就可以了。 
 + 
 +后续在 ​SDK 当前路径下执行以下命令删除 x86_64 平台\\
 实时音视频版本''​Hyphenate.framework''​ 实时音视频版本''​Hyphenate.framework''​
 +
 <​code>​ <​code>​
-mkdir ./bak +【首先进入Hyphenate.framework所在目录】 
-cp -r Hyphenate.framework ​./bak +// 移除支持 x86_64 的二进制文件 
-lipo Hyphenate.framework/​Hyphenate -thin armv7 -output ​Hyphenate_armv7 +lipo Hyphenate.framework/​Hyphenate -remove x86_64 ​-output ​Hyphenate 
-lipo Hyphenate.framework/​Hyphenate ​-thin arm64 -output Hyphenate_arm64 +//​替换framwork内部二进制文件 
-lipo -create Hyphenate_armv7 Hyphenate_arm64 -output Hyphenate +mv Hyphenate ​Hyphenate.framework/​Hyphenate 
-mv Hyphenate ​Hyphenate.framework/​+//​查看剥离后的二进制文件支持的CPU架构,如果显示 ​arm64,就完成剥离,可上传AppStore 
 +lipo -info Hyphenate.framework/​Hyphenate
 </​code>​ </​code>​
  
 不包含实时音视频版本 ''​HyphenateLite.framework''​ 不包含实时音视频版本 ''​HyphenateLite.framework''​
 +
 <​code>​ <​code>​
-mkdir ./bak +【首先进入HyphenateLite.framework所在目录】 
-cp -r HyphenateLite.framework ​./bak +// 移除支持 x86_64 的二进制文件 
-lipo HyphenateLite.framework/​HyphenateLite -thin armv7 -output ​HyphenateLite_armv7 +lipo HyphenateLite.framework/​HyphenateLite -remove x86_64 ​-output ​HyphenateLite 
-lipo HyphenateLite.framework/​HyphenateLite ​-thin arm64 -output HyphenateLite_arm64 +//替换 framwork 内部二进制文件[记得备份] 
-lipo -create HyphenateLite_armv7 HyphenateLite_arm64 -output HyphenateLite +mv HyphenateLite ​HyphenateLite.framework/​HyphenateLite 
-mv HyphenateLite ​HyphenateLite.framework/​+//​查看剥离后的二进制文件支持的CPU架构,如果显示 ​arm64,就完成剥离,可上传 AppStore 
 +lipo -info HyphenateLite.framework/​HyphenateLite
 </​code>​ </​code>​
- 
-===== DEMO 体验 ===== 
-[[https://​pan.baidu.com/​s/​1LurYGr81Dt8G_W-UzlNm-w |下载地址]],提取码 **ehil** 
- 
-**注:**此 Demo 为精简版 Demo,但已涵盖了主要功能。如需更全面的功能,请前往[[http://​www.easemob.com/​download/​im|下载页]] 
- 
- 
 ---- ----
 <WRAP group> <WRAP group>