iOS Demo 源码导读

目录

1. 目的
2. 架构设计与说明
3. NIM 工程与架构图对应关系
4. NIMKit 设计说明
    4.1 NIMKit 目录介绍
    4.2 NIMKit 主要类介绍
5. Demo 主体业务介绍
    5.1 登录、注册业务介绍
    5.2 消息推送业务介绍
    5.3 会话业务介绍
       5.3.1 红包消息业务介绍
       5.3.2 智能机器人业务介绍
    5.4 最近会话业务介绍
    5.5 在线状态业务介绍
    5.6 聊天室业务介绍
    5.7 通讯录业务介绍

1. 目的

本文档介绍了 NIMSDK 的 Demo 整体框架,以及核心流程,并为其他使用 NIM SDK 的开发者了解 SDK 的主要功能提供指导性说明。

2. 架构设计与说明

应用基于系统,自底向上进行三层划分:

1)App 核心服务层:对外提供 IM 相关功能的核心接口;

2)业务逻辑适配层:App 根据自身的业务需求,将 Core Service 提供的功能亮点进行封装,命名为NIM Kit,以提供给开发者使用;

3)UI 层:

a. Custom UI:可以自定义的 UI 层,主要作用是把界面上个各个模块进行拆分,并在更小的模块里进行实现和封装,该部分可以供开发者复用;

b. App UI:该层对应界面上的整体模块,主要负责界面内部各个子 UI 模块的布局和调度;

c. Common Library:该层是一些公用的基础工具类,提供后期开发复用。

App 分层通信模型如下图:

call : 调用; callback : 回调; broadcast : 广播;support : 支持

framework.png

3. NIM 工程与架构图对应关系

work.png

4. NIMKit 设计说明

NIMKit 工程是网易云信 NIMSDK Demo 中针对 NIMSDK 的 iOS 客户端的再一次封装,主要覆盖基本的聊天以及联系人功能,为方便开发者进行二次开发或是扩展自身的 App 业务逻辑,此处进行设计思路的介绍,开发者可根据自身需求进行自定义的扩展。

实际开发过程中,用户 App 的逻辑与Demo 的业务逻辑可能不尽相同,这里建议开发者通过继承重写某些类与自身逻辑不一致的方法,来增加新方法以扩展自身的业务逻辑,这样如果 NIMKit 有新的版本更新的时候,用工具对比 NIMKit 即可。

复用 NIMKit 的好处是:

4.1 NIMKit 目录介绍

NIMKit 目录以及对应功能介绍(以下说明中的目录对应 IMSDK 4.0.0版本,请读者注意,4.0.0前版本思路基本相同)

这里主要介绍 Classes 目录

目录或文件 说明 注意事项
NIMKit.h NIMKit 所需的头文件索引,以及一些基本配置 头文件中有详细的注释说明具体的配置方式
Global 宏定义以及提供给 NIMKit UI 复用的通用配置 具体使用方式可以参考 NIMKit 里的使用方式
Protocols 定义了一套针对 session 相关的标准协议,方便上层进行统一的接口实现
Session Demo 需要用到的聊天相关处理
Model 对 SDK 中的基本数据类型的封装,如用户、消息、会话 复用时开发者可根据自己需求选择性使用
Contact Demo 需要的联系人相关处理
Team Demo 需要的群组相关逻辑
Util 提供给 NIMKit 的通用方法
Common 提供给 NIMKit 使用的自定义控件 开发者可根据自己需求选择性使用
Input 输入相关 UI 以及逻辑处理
SessionList Demo 需要的会话列表相关处理
Category 系统类的自定义扩展 开发者可根据自己需求选择性使用

4.2 NIMKit 主要类介绍

这一小节针对 NIMKit 中的主要类,即会话类模块进行相关介绍。

Session 模块基本基于 MVC 架构进行设计,其中 NIMSessionViewController 类作为会话类的主要视图控制器,与其相关的类的继承与组合关系如下图所示:

这张图详细描述了 NIMSessionViewController 的数据更新、布局更新以及消息处理的解耦方式。

图中 NIMSessionViewController 通过实现 NIMSDK 中 NIMConversationManager 、NIMChatManager 的相关回调,触发界面布局以及相关会话消息数据的更新;

同时关联了 NIMSessionInteractor 和 NIMSessionConfigurator 类解耦,用以进行具体消息数据和布局相关的处理。

由图可知,NIMSessionContentConfig 提供了消息类型扩展,通过简单工厂模式构建不同类型消息的 cell,实现统一配置接口 NIMSessionContentConfig,因此当需要扩展新的消息类型时,只需要新增相应的 config 类,并实现 NIMCellLayoutConfig 相关接口,具体流程可参考现有的 cell 复用流程。

5. Demo 主体业务介绍

Demo目录如下图所示:

NIM Demo 代码主体业务逻辑在 Section 文件夹里,分为联系人(Contact),名片(Card),会话(Session), 最近会话(SessionList), 登录(Login)和设置(Setting)。每个模块按照 MVC 的设计思路进行进一步划分,部分模块还有一些工具类。由于 NIM SDK 已经提供比较完善的数据管理,所以上层无需做管理模类。

5.1 登录、注册业务介绍

登录有自动登录和手动登录两种登录方式。

自动登录的意义在于提供一种用户友好的登录形式,当应用启动时检测到本地游用户的账号和密码的缓存,则自动登录并直接进入主界面,用户不需要再进行登录的确认,并能在无网络的情况下获得会话列表信息。

自动登录接口以及相关实现逻辑如下图

需要注意的是这里需要有对象监听自动登录的回调,并在某些情况下给出相应操作(相关回调见下图)。在 Demo 中我们使用 AppDelegate 作为监听者。

相关联的回调

手动登录的流程可以参考 NTESLoginViewController 的代码,它接受用户输入并调用登录相关接口。

如图

注册业务

注册业务和IM SDK并没有直接关系,因此注册账号的业务只是纯应用层的演示。这里给出接口示例

5.2 消息推送业务介绍

消息推送作为一个 IM 类应用必不可少的一部分,提供消息以及网络电话(VoIP)的推送服务。集成的方式在 AppDelegate 文件里。

如图

因为同时需要 APNs 和 PushKit 服务,所以都需要进行配置。同时要复写以下 delegate 回调,以提供给服务器最新的 APNs 服务的 deviceToken。

PushKit 相关回调也要实现,来更新 PushKitToken,以及相应消息推送标志。

5.3 会话业务介绍

Demo 中会话相关包括最近会话列表以及具体的会话界面等相关业务,这一小节首先介绍会话主页面的业务逻辑。

处理会话逻辑的关键类有如下几个:

会话视图控制器的初始化流程

消息的发起

使用 SDK 发起消息的流程分为三步:

  1. 准备数据
  2. 调用 SDK 接口发送
  3. 处理发送回调

以发送图片为例,NTESSessionViewController 从 UIImagePickerController 获取 UIImage,通过 NTESSessionMsgConverter 相关方法将图片打包成一个可以发送的 NIMMessage,并调用

进行消息发送,之后在 NIMSessionViewController 处理相关的回调。

由上图可知,NTESSessionViewController 主要处理如下几个消息发送的回调

消息的接收

NIMSessionViewController 处理的是当前 session 里的消息,对于非当前 session 里的消息直接丢弃。对于带有附件的消息类型(图片、音频、视频等),SDK 在第一次收到消息时会自动获取对应的附件(图片的缩略图和音频的原文件),上层只需要监听获取到的附件的回调即可。如果发生错误,上层可以主动调用 fetchMessageAttach:error: 进行重试。

这里给出一个消息从接收到显示的流程图

5.3.1 红包消息业务介绍

根据以上业务介绍可知,红包也属于自定义消息的一种。在 NTESSessionConfig 中实现红包按钮的配置

并在 NTESSessionViewController 中实现相关点击事件回调。具体业务处理在 NTESRedPAcetManager 类中。

首先通过 NIMLoginManager 的登录回调(这里需要保证是线上环境,以隔离 AppKey)进行红包请求的初始化,获取红包服务的 token 。这里接入的是金融魔方的 SDK,以提供发红包、拆红包、查看红包领取详情等具体业务。如图

注意支付宝、微信支付相关逻辑需要在 AppDelegate 的相应回调进行处理,见下图

5.3.2 智能机器人业务介绍

机器人作为联系人的一部分,可以与之单独会话或者通过“@”点名功能进行选择并在点对点或群聊天中唤起,并走正常的消息收发回调。

NIMRobotManager 中提供获取所有机器人的接口,以及对于机器人是否为有效机器人的判断等。

机器人消息实例对象 NIMRobotObject 实现了接口 NIMMessageObject,具体消息实例通过 NIMMessageMaker 里的相应接口进行配置

需要注意的是,机器人消息是字符串类型,需要进行解析;可以自行进行解析,demo 对于后台提供的标准模版提供了 NIMKitRobotDefaultTemplateParser 进行解析,解析流程如下:

其中,NIMKitRobotTemplate 类定义如下,这个类实现了 NIMKitRobotTemplateContainer 接口,用于存放 NIMKitRobotTemplateItem,是一个嵌套结构。

在 NMSessionViewController 里通过输入“@”功能调起点名逻辑,若机器人被点名则显示机器人名称。

5.4 最近会话业务介绍

用户登录成功之后,首先默认进入 NTESSessionListViewController,最近会话列表的视图控制器。NIM SDK 中最近消息管理类为 NIMConversationManager,NTESSessionListViewController 继承自 NIMSessionListViewController,NIMSessionListViewController 实现 NIMConversationManager 中的最近消息相关回调。

最近消息在如下情况会发生变化(这里也可以发现最近消息和消息是两个概念,注意区分):

上层只需要管理最近消息变化即可,不需要关心引起变化的源头。在 NIMSessionListViewController 中可以看到对最近消息发生变化的回调处理,如下图

同时,NTESSessionViewController 还处理 NIMLoginManager 和 在线状态显示与更新的回调处理。

点击最近会话列表顶端的 NTESListHeader,进入 NTESClientsTableViewController 视图控制器,进行多端登录相关逻辑处理。

多端登录时要注意记得加上对登录相关回调的监听,来处理多端登录时踢出某一客户端的相关回调

5.5 在线状态业务介绍

好友在线状态的显示如下图

在线状态的管理主要是NIMSubscribeManager 这个类进行,具体处理方式如下流程图

最终在 NIMSessionViewController 里处理回调,更新好友在线状态。这里需要注意,更换了 appkey 之后,订阅开关默认是关闭的。

5.6 聊天室业务介绍

NIM SDK中管理聊天室的类是 NIMChatroomManager,Demo 将聊天室封装成了直播间的模式。直播间列表页为 NTESChatroomListViewController。页面将向服务器请求聊天室房间列表。具体的代码在 NTESDemoService 中。

直播间的视图控制器为 NTESLiveViewController,NTESLiveViewController 是一个父视图控制器容器,包含了三个子视图控制器:

视图控制器 NTESChatroomViewController 继承自 NIMSessionViewController,是一个特殊的会话页。这个会话页自己定义了部分会话设定和新的气泡排版样式。新的会话设定在 NTESChatroomConfig 中定义;新的气泡排版样式在 NTESChatroomCellLayoutConfig 中定义。目前会话页只处理文字和猜拳(自定义消息)两种消息类型。

视图控制器 NTESChatroomMemberListViewController 是一个聊天室成员列表,每次点击到这个列表的时候都会进行聊天室成员刷新。Demo 中,聊天室成员的排序为创建者,管理员,普通成员,受限成员,游客。由于 SDK 的接口无法直接给出所需要列表,Demo 中做了多次请求合并以及排序的操作。请求合并的摘录代码为

视图控制器 NTESLiveInfoViewController 是一个聊天室信息页面,点击到这个页面时会去抓去一遍聊天室信息和主播信息,相关代码如下:

5.7 通讯录业务介绍

通讯录相关业务逻辑主要在 Contact 文件夹里。Model 层 NTESGroupedContacts 提供侧边栏根据通讯录中联系人首字母排序的列表。NTESGRoupedUseInfo 则提供联系人和群组联系人按序排列的集合。

通讯录视图控制器 NTESContactViewController 需要监听 NIMUserManager,NIMSystemNotificationManager,NIMLoginManager,NIMEventSubscribeManager的回调。

通过 NIMEventSubscribeManager 回调进行在线状态的更改

通过 NIMLoginManager 回调进行界面 UI 刷新

同理 NIMSystemNotificationManager 回调更新页面未读数

NIMUserManager 回调中更新界面用户个人信息,黑名单,静音列表更改

其中 NIMContactFriendSelectConfig 提供好友选择的配置。具体关系如下图:

NIMContactSelectViewController 通过如下函数获取从 NIMContactSelectConfig 的回调获得联系人相关数据