差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
im:ios:sdk:prepare [2022/02/25 11:18] jennifer.zeng [iOS SDK 快速集成] |
im:ios:sdk:prepare [2022/08/03 07:27] jennifer.zeng [iOS SDK 快速集成] |
||
---|---|---|---|
行 1: | 行 1: | ||
====== iOS SDK 快速集成 ====== | ====== iOS SDK 快速集成 ====== | ||
- | 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念,最新版本的 SDK 只支持 **iOS 9** 及以上 iOS 系统版本。 | + | 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念,最新版本的 SDK 只支持 **iOS 10** 及以上 iOS 系统版本。 |
行 12: | 行 12: | ||
[[https://github.com/easemob/chat-ios.git |EaseIM 源码地址]] | [[https://github.com/easemob/chat-ios.git |EaseIM 源码地址]] | ||
- | **注:**更多Demo体验,请前往[[http://www.easemob.com/download/im|下载页]] | + | **注:**更多 Demo 体验,请前往[[http://www.easemob.com/download/im|下载页]] |
===== 注册并创建应用 ===== | ===== 注册并创建应用 ===== | ||
行 22: | 行 22: | ||
Appkey:一个 APP 的唯一标识 | Appkey:一个 APP 的唯一标识 | ||
- | IM 用户:一个 appkey 下的唯一标识用户,用来登录环信服务器进行收发消息的用户。 | + | IM 用户:一个 Appkey 下的唯一标识用户,用来登录环信服务器进行收发消息的用户。 |
- | 可以在创建好的应用内注册两个 IM 用户(也可以称为环信 id),例如: 账号:user1,密码:123 ; 账号:user2,密码:123,用来通过 SDK 登录环信服务器,收发消息测试。 | + | 可以在创建好的应用内注册两个 IM 用户(也可以称为环信 ID),例如: 账号:user1,密码:123 ; 账号:user2,密码:123,用来通过 SDK 登录环信服务器,收发消息测试。 |
行 65: | 行 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 升级文档]]。 |
行 73: | 行 73: | ||
===== 集成 SDK ===== | ===== 集成 SDK ===== | ||
- | 环信 SDK 支持**pod 方式导入**,**手动导入**两种方式任选其一即可,下面分别介绍两种导入方式。 | + | 环信 SDK 支持 **pod 方式导入**,**手动导入**两种方式任选其一即可,下面分别介绍两种导入方式。 |
- | ''从3.6.0版本开始,sdk只支持ios9.0及以上版本。'' | + | ''从 3.6.0 版本开始,SDK 只支持 iOS 9.0 及以上版本。'' |
- | ==== Pod 导入SDK ==== | + | ==== 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> | ||
行 92: | 行 92: | ||
在 ''Podfile'' 目录下,执行以下指令: | 在 ''Podfile'' 目录下,执行以下指令: | ||
+ | |||
<code> | <code> | ||
pod install --repo-update | pod install --repo-update | ||
行 98: | 行 99: | ||
- | 执行完pod install,打开工程目录,找到.xcworkspace文件运行即可。 | + | 执行完 pod install,打开工程目录,找到 .xcworkspace 文件运行即可。 |
---- | ---- | ||
行 106: | 行 107: | ||
- | * HyphenateChat 开发使用SDK | + | * HyphenateChat 开发使用 SDK |
- | 开发者最开始集成,如果选择手动导入文件集成的方式,只需要向工程中添''HyphenateChat''就可以,下面会介绍具体的集成方式。 | + | 开发者最开始集成,如果选择手动导入文件集成的方式,只需要向工程中添 ''HyphenateChat'' 就可以,下面会介绍具体的集成方式。 |
- | demo 中的SDK文件夹为Hyphenate SDK,将SDK 文件夹拖入到工程中,并勾选截图中标注的三项。 | + | demo 中的 SDK 文件夹为 Hyphenate SDK,将 SDK 文件夹拖入到工程中,并勾选截图中标注的三项。 |
{{:im:ios:sdk:选项.png?direct|}} | {{:im:ios:sdk:选项.png?direct|}} | ||
行 116: | 行 117: | ||
=== 设置工程属性 === | === 设置工程属性 === | ||
- | Xcode中,向 General → Embedded Binaries 中添加依赖库。 | + | Xcode 中,向 General → Embedded Binaries 中添加依赖库。 |
- | **注意要将'Do Not Embed'改成'Embed & Sign'** | + | **注意要将 'Do Not Embed' 改成 'Embed & Sign'** |
{{:im:ios:sdk:04380a97-8a50-4e50-bcb0-5c9d6d4d9818.png?600|}} | {{:im:ios:sdk:04380a97-8a50-4e50-bcb0-5c9d6d4d9818.png?600|}} | ||
---- | ---- | ||
行 130: | 行 131: | ||
* Account:主要是 demo 的注册,登录 | * Account:主要是 demo 的注册,登录 | ||
| | ||
- | * AppDelegate:主要是 demo 中初始化环信SDK,注册推送等 | + | * AppDelegate:主要是 demo 中初始化环信 SDK,注册推送等 |
| | ||
- | * Communicate:demo 的语音视频通话功能页面(包含 1v1 实时通话以及多人实时通话的功能) | + | * Communicate:demo 的语音视频通话功能页面(包含 1v1 实时通话以及多人实时通话的功能) |
| | ||
* Chat:demo 的聊天功能页面 | * Chat:demo 的聊天功能页面 | ||
行 207: | 行 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''。 | ||
行 253: | 行 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推送时在传入证书名称 | ||
行 263: | 行 261: | ||
==== 登录环信服务器 ==== | ==== 登录环信服务器 ==== | ||
- | 建议使用异步登录方法,防止网络不好的情况下,出现卡UI主线程的情况出现。 | + | |
+ | 建议使用异步登录方法,防止网络不好的情况下,出现卡 UI 主线程的情况出现。 | ||
<code> | <code> | ||
// 传入在应用(appkey)下注册的IM用户user1,密码123,用于登录环信服务器 | // 传入在应用(appkey)下注册的IM用户user1,密码123,用于登录环信服务器 | ||
行 278: | 行 278: | ||
* 如果在集成调试阶段,可以在初始化环信 SDK 完成之后,就调用登录方法。 | * 如果在集成调试阶段,可以在初始化环信 SDK 完成之后,就调用登录方法。 | ||
- | * 如果项目上线,建议开发者在登录自己服务器成功之后,再调用环信 SDK 登录方法使用用户绑定的环信id登录环信服务器(开发者给自己用户在自己服务器创建账号的同时,调用环信的 rest 接口在给用户授权注册一个环信 id,一起返回给 app 端,app 端拿到用户的账号密码以及环信 id 密码分别登录自己的服务器以及环信服务器)。 | + | * 如果项目上线,建议开发者在登录自己服务器成功之后,再调用环信 SDK 登录方法使用用户绑定的环信 ID 登录环信服务器(开发者给自己用户在自己服务器创建账号的同时,调用环信的 REST 接口在给用户授权注册一个环信 ID,一起返回给 App 端,App 端拿到用户的账号密码以及环信 ID 密码分别登录自己的服务器以及环信服务器)。 |
---- | ---- | ||
行 284: | 行 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" conversationType:EMConversationTypeChat createIfNotExist:YES]; | EMChatViewController *chatController = [[EMChatViewController alloc] initWithConversationId:@"user2" conversationType:EMConversationTypeChat createIfNotExist:YES]; | ||
行 299: | 行 301: | ||
===== 集成实时音视频通话 ===== | ===== 集成实时音视频通话 ===== | ||
+ | |||
向工程中导入 ''Communicate'' 文件 | 向工程中导入 ''Communicate'' 文件 | ||
在初始化 SDK 完成之后,在初始化SDK所在的类引入头文件: | 在初始化 SDK 完成之后,在初始化SDK所在的类引入头文件: | ||
+ | |||
<code> | <code> | ||
- | #import "SingleCallController.h" // 1v1实时通话功能的头文件 | + | #import "SingleCallController.h" // 1v1 实时通话功能的头文件 |
#import "ConferenceController.h" // 多人实时通话功能的头文件 | #import "ConferenceController.h" // 多人实时通话功能的头文件 | ||
添加: | 添加: | ||
- | [SingleCallController sharedManager]; // 初始化1v1实时通话功能的单例 | + | [SingleCallController sharedManager]; // 初始化 1v1 实时通话功能的单例 |
[ConferenceController sharedManager]; // 初始化多人实时通话功能的单例 | [ConferenceController sharedManager]; // 初始化多人实时通话功能的单例 | ||
</code> | </code> | ||
+ | |||
在聊天页面中下方,点击视频通话图标按钮即可使用。 | 在聊天页面中下方,点击视频通话图标按钮即可使用。 | ||
行 315: | 行 320: | ||
===== 集成其他模块 ===== | ===== 集成其他模块 ===== | ||
- | 集成这些模块,涉及到一些回调方法的监听与页面的跳转,需要在初始化环信SDK之后,添加 [EMDemoHelper shareHelper]; | + | 集成这些模块,涉及到一些回调方法的监听与页面的跳转,需要在初始化环信 SDK 之后,添加 [EMDemoHelper shareHelper]; |
==== 会话列表 ==== | ==== 会话列表 ==== | ||
向工程中导入 ''Conversation'' 文件 | 向工程中导入 ''Conversation'' 文件 | ||
行 322: | 行 328: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMConversationsViewController *conversationVC = [[EMConversationsViewController alloc] init]; | EMConversationsViewController *conversationVC = [[EMConversationsViewController alloc] init]; | ||
行 328: | 行 335: | ||
==== 好友列表 ==== | ==== 好友列表 ==== | ||
+ | |||
向工程中导入 ''Contact'' 文件 | 向工程中导入 ''Contact'' 文件 | ||
行 333: | 行 341: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMContactsViewController *contactVC= [[EMContactsViewController alloc] init]; | EMContactsViewController *contactVC= [[EMContactsViewController alloc] init]; | ||
行 339: | 行 348: | ||
==== 群组 ==== | ==== 群组 ==== | ||
+ | |||
向工程中导入 ''Group'' 文件 | 向工程中导入 ''Group'' 文件 | ||
行 344: | 行 354: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMGroupsViewController *groupVC= [[EMContactsViewController alloc] init]; | EMGroupsViewController *groupVC= [[EMContactsViewController alloc] init]; | ||
行 350: | 行 361: | ||
==== 聊天室 ==== | ==== 聊天室 ==== | ||
+ | |||
向工程中导入 ''Chatroom'' 文件 | 向工程中导入 ''Chatroom'' 文件 | ||
行 355: | 行 367: | ||
初始化页面跳转(导航跳转示例): | 初始化页面跳转(导航跳转示例): | ||
+ | |||
<code> | <code> | ||
EMChatroomsViewController *chatRoomVC= [[EMChatroomsViewController alloc] init]; | EMChatroomsViewController *chatRoomVC= [[EMChatroomsViewController alloc] init]; | ||
行 363: | 行 376: | ||
- | ===== 集成动态库上传AppStore ===== | + | ===== 集成动态库上传 AppStore ===== |
- | 从3.7.4版本SDK开始支持bitcode打包,并且不再支持armv7,i386指令集,打包时需去除armv7指令。\\ | + | 从 3.7.4 版本 SDK 开始支持 bitcode 打包,并且不再支持 armv7,i386 指令集,打包时需去除 armv7 指令。\\ |
- | Xcode11需在Build Settings - Valid Architectures 设置项去除armv7指令;\\ | + | Xcode11 需在 Build Settings - Valid Architectures 设置项去除 armv7 指令;\\ |
- | Xcode12需在Build Settings - Excluded Architectures 设置项添加armv7指令,若是iOS11以上无需此操作; | + | Xcode12 需在 Build Settings - Excluded Architectures 设置项添加 armv7 指令,若是 iOS11 以上无需此操作; |
- | 由于 iOS 编译的特殊性,为了方便开发者使用,我们将''x86_64'',''arm64'' 两个平台都合并到了一起,所以使用动态库上传 appstore 时需要将''x86_64'' 平台删除后,才能正常提交审核。\\ | + | 由于 iOS 编译的特殊性,为了方便开发者使用,我们将 ''x86_64'',''arm64'' 两个平台都合并到了一起,所以使用动态库上传 AppStore 时需要将 ''x86_64'' 平台删除后,才能正常提交审核。\\ |
- | 首先将SDK进行备份。因为剔除过SDK的项目只能真机运行,要想继续模拟器运行,要换回未剔除的SDK。 | + | 首先将 SDK 进行备份。因为剔除过 SDK 的项目只能真机运行,要想继续模拟器运行,要换回未剔除的 SDK。 |
- | 然后进入到Launchpad中,找到其他---打开终端,然后cd到SDK的所在目录。\\ | + | 然后进入到 Launchpad 中,找到其他---打开终端,然后 cd 到 SDK 的所在目录。\\ |
- | 简单的方式就是找到项目中的环信SDK,然后终端先输入cd,然后按空格键,将环信SDK拖拽到终端内,会自动生成SDK的路径,然后环信SDK名称.framework删除掉,不要cd到环信SDK,只cd到SDK所在的目录下即可。\\ | + | 简单的方式就是找到项目中的环信 SDK,然后终端先输入 cd,然后按空格键,将环信 SDK 拖拽到终端内,会自动生成SDK的路径,然后环信 SDK 名称 .framework 删除掉,不要 cd 到环信 SDK,只 cd 到 SDK 所在的目录下即可。\\ |
示例:\\ | 示例:\\ | ||
- | 比如环信SDK的路径是\\ | + | 比如环信 SDK 的路径是\\ |
/Users/easemob-dn0164/Desktop/iOS_IM_SDK_V3.6.0/HyphenateFullSDK/Hyphenate.framework\\ | /Users/easemob-dn0164/Desktop/iOS_IM_SDK_V3.6.0/HyphenateFullSDK/Hyphenate.framework\\ | ||
- | 那么只需要cd到\\ | + | 那么只需要 cd 到\\ |
/Users/easemob-dn0164/Desktop/iOS_IM_SDK_V3.6.0/HyphenateFullSDK/\\ | /Users/easemob-dn0164/Desktop/iOS_IM_SDK_V3.6.0/HyphenateFullSDK/\\ | ||
就可以了。 | 就可以了。 | ||
- | 后续在 SDK 当前路径下执行以下命令删除x86_64平台\\ | + | 后续在 SDK 当前路径下执行以下命令删除 x86_64 平台\\ |
实时音视频版本''Hyphenate.framework'' | 实时音视频版本''Hyphenate.framework'' | ||
+ | |||
<code> | <code> | ||
【首先进入Hyphenate.framework所在目录】 | 【首先进入Hyphenate.framework所在目录】 | ||
- | // 移除支持x86_64的二进制文件 | + | // 移除支持 x86_64 的二进制文件 |
lipo Hyphenate.framework/Hyphenate -remove x86_64 -output Hyphenate | lipo Hyphenate.framework/Hyphenate -remove x86_64 -output Hyphenate | ||
//替换framwork内部二进制文件 | //替换framwork内部二进制文件 | ||
mv Hyphenate Hyphenate.framework/Hyphenate | mv Hyphenate Hyphenate.framework/Hyphenate | ||
- | //查看剥离后的二进制文件支持的CPU架构,如果显示arm64,就完成剥离,可上传AppStore | + | //查看剥离后的二进制文件支持的CPU架构,如果显示 arm64,就完成剥离,可上传AppStore |
lipo -info Hyphenate.framework/Hyphenate | lipo -info Hyphenate.framework/Hyphenate | ||
</code> | </code> | ||
不包含实时音视频版本 ''HyphenateLite.framework'' | 不包含实时音视频版本 ''HyphenateLite.framework'' | ||
+ | |||
<code> | <code> | ||
【首先进入HyphenateLite.framework所在目录】 | 【首先进入HyphenateLite.framework所在目录】 | ||
- | // 移除支持x86_64的二进制文件 | + | // 移除支持 x86_64 的二进制文件 |
lipo HyphenateLite.framework/HyphenateLite -remove x86_64 -output HyphenateLite | lipo HyphenateLite.framework/HyphenateLite -remove x86_64 -output HyphenateLite | ||
- | //替换framwork内部二进制文件[记得备份] | + | //替换 framwork 内部二进制文件[记得备份] |
mv HyphenateLite HyphenateLite.framework/HyphenateLite | mv HyphenateLite HyphenateLite.framework/HyphenateLite | ||
- | //查看剥离后的二进制文件支持的CPU架构,如果显示arm64,就完成剥离,可上传AppStore | + | //查看剥离后的二进制文件支持的CPU架构,如果显示 arm64,就完成剥离,可上传 AppStore |
lipo -info HyphenateLite.framework/HyphenateLite | lipo -info HyphenateLite.framework/HyphenateLite | ||
</code> | </code> |