差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
im:ios:sdk:prepare [2019/07/12 03:36] huanxinfudh [Pod 导入SDK] |
im:ios:sdk:prepare [2022/08/03 07:27] jennifer.zeng [iOS SDK 快速集成] |
||
---|---|---|---|
行 1: | 行 1: | ||
====== iOS SDK 快速集成 ====== | ====== iOS SDK 快速集成 ====== | ||
- | 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念,SDK 支持 **iOS8** 及以上 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> | ||
sudo gem install cocoapods | sudo gem install cocoapods | ||
行 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 文件运行即可。 | ||
---- | ---- | ||
==== 手动导入 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|}} | ||
行 117: | 行 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 的聊天功能页面 | ||
行 141: | 行 141: | ||
* Conversation:demo 的会话列表功能页面 | * Conversation:demo 的会话列表功能页面 | ||
| | ||
- | * EMDemoHelper:demo 的单例类,主要是全局监听接收消息,好友,群组,聊天室等相关事件的回调,从而进行对应的处理 | + | * EaseIMHelper:demo 的单例类,主要是全局监听接收消息,好友,群组,聊天室等相关事件的回调,从而进行对应的处理 |
| | ||
* Group:demo 的群组功能页面 | * Group:demo 的群组功能页面 | ||
行 160: | 行 160: | ||
===== 集成 UI ===== | ===== 集成 UI ===== | ||
- | 环信的 UI 模块在 demo 中的该路径下 EMiOSDemo---Class | + | 环信的 UI 模块在 demo 中的该路径下 EaseIM---Class |
demo 中有几大 UI 功能模块,在集成时将对应的模块添加到工程中即可。 | demo 中有几大 UI 功能模块,在集成时将对应的模块添加到工程中即可。 | ||
行 169: | 行 169: | ||
* Conversation------会话列表模块 | * Conversation------会话列表模块 | ||
| | ||
- | * Call------实时音视频模块(包含 1v1 实时通话以及多人实时通话的功能) | + | * Communicate------实时音视频模块(包含 1v1 实时通话以及多人实时通话的功能) |
| | ||
* Contact------好友列表模块 | * Contact------好友列表模块 | ||
行 187: | 行 187: | ||
| | ||
* SDWebImage | * SDWebImage | ||
- | | ||
- | * SDWebImage/GIF | ||
| | ||
* FLAnimatedImage | * FLAnimatedImage | ||
行 210: | 行 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''。 | ||
行 225: | 行 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" | ||
行 268: | 行 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推送时在传入证书名称 | ||
行 278: | 行 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 密码分别登录自己的服务器以及环信服务器)。 |
---- | ---- | ||
行 295: | 行 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]; | ||
行 310: | 行 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]; | ||
==== 会话列表 ==== | ==== 会话列表 ==== | ||
行 332: | 行 328: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMConversationsViewController *conversationVC = [[EMConversationsViewController alloc] init]; | EMConversationsViewController *conversationVC = [[EMConversationsViewController alloc] init]; | ||
行 338: | 行 335: | ||
==== 好友列表 ==== | ==== 好友列表 ==== | ||
+ | |||
向工程中导入 ''Contact'' 文件 | 向工程中导入 ''Contact'' 文件 | ||
行 343: | 行 341: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMContactsViewController *contactVC= [[EMContactsViewController alloc] init]; | EMContactsViewController *contactVC= [[EMContactsViewController alloc] init]; | ||
行 349: | 行 348: | ||
==== 群组 ==== | ==== 群组 ==== | ||
+ | |||
向工程中导入 ''Group'' 文件 | 向工程中导入 ''Group'' 文件 | ||
行 354: | 行 354: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMGroupsViewController *groupVC= [[EMContactsViewController alloc] init]; | EMGroupsViewController *groupVC= [[EMContactsViewController alloc] init]; | ||
行 360: | 行 361: | ||
==== 聊天室 ==== | ==== 聊天室 ==== | ||
+ | |||
向工程中导入 ''Chatroom'' 文件 | 向工程中导入 ''Chatroom'' 文件 | ||
行 365: | 行 367: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMChatroomsViewController *chatRoomVC= [[EMChatroomsViewController alloc] init]; | EMChatroomsViewController *chatRoomVC= [[EMChatroomsViewController alloc] init]; | ||
行 373: | 行 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> |