1 SDK 概述

       容能云SDK (RN SDK) 为移动应用提供完善的 IM 开发框架,屏蔽其内部复杂细节,对外提供较为简洁的 API 接口,方便第三方应用快速集成 IM 功能。

SDK 兼容 iOS 8.0+ ,Demo 兼容 iOS 8.0+ 。


2 前期准备

RN SDK目前只提供手动下载的方式, 下载SDK然后添加到您的项目中。

官网 SDK 下载入口


2.1 手动添加 SDK

√ 将RNSDK加入工程。

image.png

√  在 Build Settings -> Other Linker Flags 里,添加选项 -ObjC。

√  在需要使用即时通讯 SDK 的地方添加 #import "RNIMSDKHeaders.h"  。

√  在需要使用用户关系/用户能力的地方添加#import "RNUSDKHeaders.h"


2.2 SDK 类说明

RNIMSDK 主要提供了如下类(协议)与方法

√ RNIMSDK IM相关的功能总接口,单例,主要注册了以下的管理类,并提供了接口访问的方式

√  RNIMLoginManager 登录管理类,负责登录,注销

√  RNIMChatManager 聊天管理类,负责消息的收发

√  RNIMConversationManager 会话管理类,负责消息,最近会话的管理

√  RNIMGroupManager 群组管理类,负责群组各种操作

√  RNIMMediaManager 媒体管理类,负责多媒体相关的接口,比如录音

√  RNIMBuddyManager 好友管理,负责免打扰相关接口

√  RNFSTransportManager 文件传输管理类,负责文件的上传/下载

√  McNotifyCenter 验证提醒消息中心,负责验证提醒消息的相关操作

RNUSDK 主要提供了如下类(协议)与方法

√ RNUCompanyManager 包含企业员工关系和员工资料的相关接口

√ RNUUserManager 包含用户关系/用户资料/好友和黑名单的相关接口


2.3 初始化 SDK

√  在需要使用 SDK 的地方导入头文件 <RNSDK/RNSDK.h> 。

√  添加 SDK 初始化方法。

[[RNIMSDK sharedSDK]   registerWithAppKey:appKey appId:appId];
[[RNUSDK sharedSDK] registerWithAppKey:appKey   appId:appId templateCode:templateCode];
[[RNMediaSDK sharedSDK]   registerWithAppKey:appKey appId:appId];

1. 填充appKey/appId注册IM管理类。

2. 填充appKey/appId/templateCode注册用户管理类。

3. 填充appKey/appId注册音视频管理类。

说明:注册/找回密码等功能需要发送手机短信验证码,需要短信模版参数。


2.4 通过SDK注册管理类

#pragma mark - 注册各模块的管理类
// 说明:必须注册管理类,让管理类的通知中心运行并进行初始数据加载
- (void)registerManager
{
      // 注册群组管理单例
      [[RNIMSDK sharedSDK] groupManager];
      // 注册好友管理单例
      [[RNIMSDK sharedSDK] buddyManager];
}

说明:群组/免打扰等关键信息,第一次登录时需要全量加载,通过注册管理类, 在管理类中收到登录成功的通知后进行数据加载。

其他次登录为增量加载。


2.5 添加帐号变化通知(可选)

#pragma mark - 帐号变化通知
- (void)addAccountNotification
{
      __weak typeof(self) weakSelf = self;
 
      // 注册被踢通知
      [RNSDKNotificationHelp addNotification:RNSDKNotificationUserKickouted   
      object:nil usingBlock:^(NSNotification *note) {
          [weakSelf wasKicked:note];
      }];
     
      // 注册被下线通知
      [RNSDKNotificationHelp   addNotification:RNSDKNotificationUserWasLogouted 
      object:nil   usingBlock:^(NSNotification *note) {
          [weakSelf wasLogouted:note];
      }];
}

说明:

1. 移动端(安卓加iOS)只能允许一个连接,所以被踢下线时,为了安全,会跳到登录界面,需要重新输入用户密码进行登录。

2. 移动端收到下线通知,一般是服务端在需要到时候主动发出,同上,也需要重新登录。

3. 被踢的一段会弹出提示框,用户可以点击跳出到登录界面进行重登。


3 用户登录与登出

在调用登录接口前,先简单说明一下,根据容能云IM的设计框架,登录过程先要登录用户能力中心,获取到token后,再用token登录IM能力。

特殊流程:

1. 非托管用户(此处指开发者)自己实现登录流程并向im能力分享token信息。

2. 自动登录时,使用token作为用户名+密码进行登录,token有效期通过后台进行设置。

3. 手动登录使用用户名+密码进行登录,自动只要token即可。


3.1 手动登录

适用于第一次登录,或token过期失效以后执行

// 获取token和登录用户基本信息
[[[RNUSDK sharedSDK] userManager]   loginUserWithUserName:userName andPassWord:password 
        completion:^(RNUUser *   _Nullable user, NSString * _Nullable token, 
        NSError * _Nullable error) {
          [weakSelf hideProcessingHud];
          [RNMediaSDK sharedSDK].userId = user.userId;
         
          if (!error) {
            [weakSelf loginIMByToken:token   username:userName user:user];
          }else{
            NSString *errMsg = error.domain;
            if (!token) {
                errMsg = [NSString   stringWithFormat:@"登录失败,%@!", error.domain];
            }
            [weakSelf   showAlertWithMessage:errMsg];
          }
}];


3.2 自动登录

在安全的前提下,可以让用户的体验更好

//自动登录
[[[RNUSDK sharedSDK] userManager]   autoLogin:token completion:^(RNUUser * _Nullable user, 
NSString * _Nullable   token, NSError * _Nullable error) {
            if (!error)
            {
                [self loginIMByToken:token   serverUrl:serverUrl serverPort:serverPort 
                Success:success failure:failure];
            }else
            {
                NSError *reError = [[NSError   alloc] initWithDomain:@"登录用户中心失败,请检查网络并重试!"   code:RNRESULT_ERROR_LOGIN_USER userInfo:nil];
                failure(reError);
                return;
            }
}];

断线重连机制:容能云IM通过心跳和后台保持连接,在没有任何操作或者同步数据时,心跳可以保持连接状态。

类DDClientStateManager管理连接状态,类DDClientState监听网络状态变化。

1. 当网络状态变为正常时(网络变化并且非无网络时),启动重连(走自动登录)。

2. 当用户状态变为正常时(状态变化并且非离线时),启动重连(走自动登录)。



3.3 登出

在其他控制器可以通过调用appDelegate的方法进行登出,调用方式是调用appDelegate对象的go2LoginVC方法。

#define TheApp      ([UIApplication sharedApplication])
#define TheAppDel  ((AppDelegate *)([UIApplication sharedApplication].delegate))
[TheAppDel go2LoginVC];

容能云IM踢人策略为:移动端(Android与Android,iOS与iOS,Android与iOS)只能有一个连接,移动端和桌面端可以共存。


4 消息功能

4.1 消息功能概述

会话(session):一个聊天界面表示一个会话,用RNIMSession 来表示。

会话类型:包括单人会话,群组会话。

消息(message):聊天界面中每条聊天记录都是一个消息,用RNIMMessage来表示。

消息类型:普通文字消息,图片消息,音频消息/视频消息,地理位置消息,im内系统消息。

SDK 中用于表示消息的结构为 RNIMMessage,目前提供如下几种消息类型,不同的消息类型对应不同的 MessageObject



消息格式MessageObject
文本消息nil
图片消息RNIMImageObject
音频消息RNIMAudioObject
视频消息RNIMVideoObject
地理位置消息RNIMLocationObject
通知消息RNIMNotificationObject
提醒消息RNIMTipObject
自定义消息RNIMCustomObject



消息 RNIMMessage 定义了一些额外的状态属性,推荐只在主线程对这些属性进行读写:

√  消息的接收状态 isReceivedMsg

由于漫游消息的存在,所以自己发出的消息漫游下来后仍旧是 收到的消息 ,这个字段用于消息出错时,判断需要重发还是重收。

√  消息的排版状态 isOutgoingMsg

用于鉴别是否为发出去的消息。用户可以选择和自己发起对话,所以并不是所有来源是自己的消息都是往外发的消息,这个字段主要用于

判断头像排版位置,往外发的消息气泡放右边,其他消息气泡放左边。

√ 消息的状态 messageStatus

此状态仅对发送的消息有效。消息的状态有 正常 , 删除 , 撤回, 对方已读  四种。

√  消息附件的下载状态 attachmentDownloadState

此状态仅对收到的且带有附件的消息有效。 下载状态有 附件需要下载 , 附件收取失败 , 附件下载中 , 下载成功/无附件 4种。

√  消息的播放状态 isPlayed

用于鉴别音频类的消息是否播放过。 上层应用可以根据业务修改这个属性。注意不要频繁修改这个属性值,每次对这个属性做出修改,就会

自动更新一次数据库。

√  消息服务器扩展字段 remoteExt

此字段会发送到其他端,上层需要保证 NSDictionary 可以转换为 JSON。

√  消息本地扩展字段 localExt

此字段只在本地存储,不会发送至对端,上层需要保证 NSDictionary 可以转换为 JSON。

√  消息发送方的显示名 senderName

服务器内置的消息发送者名字,当发送者是自己时,这个值为空。在本地没法获取到相应发送者信息时推荐时使用这个值。

√  对端已读 isRemoteRead

接收对端已读回执后,所有小于已读回执时间戳的消息都会被置为 对端已读 。

√  @消息 atItems

@消息可以指定@一个人或者多个人,被@的人接收到消息会有标红提醒,并且消息窗口顶端会有横幅提醒,只有群主才能@所有人。

√  消息发送状态sendStatus

此状态仅针对发送的消息。 消息发送状态有 消息发送成功 , 消息发送失败, 消息发送中 3种。

√  消息附件上传/下载进度transferProgress

此参数仅针对(attachmentDownloadState == RNIMMessageAttachmentDownloadStateDownloading)。

√  发送者客户端类型senderClientType

此类型描述了客户端登录的类型,iOS类型为2。


4.2 发送消息

1.构造并发送消息

√  文本消息

构造消息

RNIMMessage *message = [[RNIMMessage   alloc] init]; message.text    = text;

构造会话

发送消息

[[RNIMSDK sharedSDK].chatManager   sendMessage:message toSession:session error:nil];

√  图片消息

构造消息

RNIMImageObject * imageObject = [[RNIMImageObject   alloc] initWithImage:image];
RNIMMessage *message          = [[RNIMMessage alloc] init];   
message.messageObject        =   imageObject;

构造会话

RNIMSession *session = [RNIMSession sessionId:userId   sessionType:RNIMSessionTypeP2P];

发送消息

[[RNIMSDK sharedSDK].chatManager sendMessage:message   toSession:session error:nil];

√  音频消息

构造消息

RNIMAudioObject *audioObject = [[RNIMAudioObject   alloc] initWithFilePath:filePath];
RNIMMessage *message        = [[RNIMMessage alloc] init];   
message.messageObject      =   audioObject;

构造会话

RNIMSession *session = [RNIMSession sessionId:userId   sessionType:RNIMSessionTypeP2P];

发送消息

[[RNIMSDK sharedSDK].chatManager sendMessage:message   toSession:session error:nil];

√  视频消息

构造消息

RNIMVideoObject *videoObject = [[RNIMVideoObject   alloc] initWithFilePath:filePath];
RNIMMessage *message         = [[RNIMMessage alloc] init];   
message.messageObject       =   videoObject;

构造会话

RNIMSession *session = [RNIMSession sessionId:userId   sessionType:RNIMSessionTypeP2P];

发送消息

[[RNIMSDK sharedSDK].chatManager sendMessage:message   toSession:session error:nil];

√  地理位置消息

构造消息,其中,latitude为纬度,longitude为经度,title为位置的描述字段

RNIMLocationObject *locationObject = 
    [[RNIMLocationObject   alloc] initWithLatitude:latitude longitude:longitude title:title];
RNIMMessage *message               = [[RNIMMessage alloc] init];
message.messageObject             = locationObject;

构造会话

RNIMSession *session = [RNIMSession sessionId:userId   sessionType:RNIMSessionTypeP2P];

发送消息

[[RNIMSDK sharedSDK].chatManager sendMessage:message   toSession:session error:nil];

√  通知消息 

基于业务需要,在特定场景下,容能云通讯服务器预置了一些通知消息。通知消息也是一种特定消息,开发者需要解析消息中附带的信息,

来获取通知内容,具体步骤为:

√  解析 RNIMMessage 中的 messageObject 字段,强类型转换为 RNIMNotificationObject。

√  解析 NIMNotificationObject 中的 content 字段,得到父类 RNIMNotificationContent。 

√  根据 RNIMNotificationContent 中的 notificationType 字段,将父类 RNIMNotificationContent 强类型转化成

具体子类型。 所有 content 类型如下:


通知类型RNIMNotificationContent
群通知RNIMTeamNotificationContent
撤回消息通知RNIMNotificationTypeRevokeMessage
未被支持类型通知RNIMNotificationTypeUndefine


不支持从客户端发出通知消息。

√  提醒消息

提醒消息用于会话内的状态提醒,如进入会话时出现的欢迎消息,会话命中敏感词后的提示消息等。

构造消息

RNIMTipObject *tipObject = [[RNIMTipObject   alloc]; 
RNIMMessage *message     = [[RNIMMessage   alloc] init]; 
message.messageObject   =   tipObject;

构造会话

RNIMSession *session = [RNIMSession   sessionId:userId sessionType:RNIMSessionTypeP2P];

发送消息

[[RNIMSDK sharedSDK].chatManager   sendMessage:message toSession:session error:nil];

√  自定义消息 

自定义消息用于 APP 拓展自己的消息类型,实现不同业务逻辑。自定义消息的 MessageObject(RNIMCustomObject) 仅有一个 id 字段,

SDK 会负责透传这个对象序列化后的结果。NIMCustomAttachment 协议包括一个必须实现的序列化接口和三个与上传相关的可选接口。

如果需要在自定义消息中上传文件作为附件的一部分,必须实现这三个上传接口,缺一不可。实现自定义消息。

构造消息

RNIMCustomObject *customObject     = [[RNIMCustomObject alloc] init]; 
customObject.attachment           = attachment;
RNIMMessage *message  = [[RNIMMessage alloc] init]; 
message.messageObject             = customObject;

构造会话

RNIMSession *session = [RNIMSession   sessionId:userId sessionType:RNIMSessionTypeP2P];

发送消息

[[RNIMSDK sharedSDK].chatManager   sendMessage:message toSession:session error:nil];

2.检查调用状态 

正常情况这一步可以省略,但刚开始集成 SDK 时,因为上层开发对 API 不熟悉有可能传入一些无效参数,推荐在开发前期务必检查

 sendMessage:toSession:error 的返回值和 error 信息,并以此为依据排查问题。

3.处理回调

在调用完发送消息接口后,通常会收到如下回调

√  即将发送消息回调

(void)willSendMessage:(RNIMMessage *)message;

建议开发者仅在收到这个回调后才将消息加入显示用的数据源中。


√  消息发送进度回调

- (void)sendMessage:(RNIMMessage *)message            progress:(CGFloat)progress;

图片,视频等需要上传附件的消息会有比较详细的进度回调,文本消息则没有这个回调。

√  消息发送完毕回调

- (void)sendMessage:(RNIMMessage *)message   didCompleteWithError:(NSError *)error;

如果消息发送成功 error 为 nil,反之 error 会被填充具体的失败原因。

4.重发

因为网络原因等导致的发送消息失败而需要重发的情况,直接调用

- (BOOL)resendMessage:(RNIMMessage *)message                 error:(NSError **)error;

此时如果再次调用 sendMessage,则会被 RNIM SDK 认作新消息。

4.3 接收消息

√  回调处理 收消息过程会通过 chatManager 的回调函数通知上层

- (void)onRecvMessages:(NSArray<RNIMMessage   *> *)messages;

如果收到的是图片,视频等需要下载附件的消息,在回调的处理中还需要调用(SDK 默认会在第一次收到消息时自动调用)

- (BOOL)fetchMessageAttachment:(RNIMMessage   *)message           didCompleteWithError:(NSError   *)error;

进行附件的下载,附件的下载过程会通过

- (void)fetchMessageAttachment:(RNIMMessage   *)message                       progress:(CGFloat)progress;
- (void)fetchMessageAttachment:(NIMMessage   *)message             didCompleteWithError:(NSError *)error;

这两个回调返回进度和结果。

4.4 消息转发

除了通知消息之外,其他类型消息均支持转发给其他会话。

- (BOOL)forwardMessage:(RNIMMessage *)message              toSession:(NIMSession *)session                  error:(NSError *)error;

这里返回的 error 参数只是表示当前这个函数调用是否成功,需要后续的回调才能够判断消息是否已经发送至服务器。后续回调和普通消息发送流程相同。


4.5 已读回执

在会话界面中调用发送已读回执的接口并传入最后一条消息,即表示这之前的消息都已读,对端将收到此回执。

发送已读回执

- (void)sendMessageReceipt:(RNIMReadMsgReceipt   *)receipt                 completion:(nullable   void(^)(NSError * __nullable error))completion;

在发送端 RNIMReadMsgReceipt需要通过最后一条消息 RNIMMessage 进行初始化并进行发送给服务端。


4.6 消息撤回

在会话时,允许用户撤回一定时间内发送过的消息。

- (void)revokeMessage:(RNIMMessage *)message            completion:(nullable void(^)(NSError   * __nullable error, RNIMMessage * __nullable revokeMessage))completion;

以下情况消息撤回会失败

√  消息超过撤回时限

√  撤回时网络异常

当有消息撤回发生时,被撤回方 SDK 会触发回调:

- (void)onRecvRevokeMessageNotification:(RNIMRevokeMessageNotificationContent   *)notification;

SDK 在收到消息撤回后,会先从本地数据库中找到对应消息并进行替换,之后通知上层消息已删除,替换的消息已经定义好,不需要用户设置。


4.7 最近会话

√  最近会话的通知


作用通知名称通知携带信息
添加会话RNIMDidAddRecentSessionNotification新的会话
更新会话RNIMDidUpdateRecentSessionNotification新的会话
删除会话RNIMDidRemoveRecentSessionNotification需要删除的会话
删除一个会话中的所有消息RNIMDidRemoveSessionAllMessageNotification目标会话
删除所有会话的消息RNIMDidRemoveAllMessageNotificationNil


RNIMConversationManager 提供最近消息的本地存储管理功能。

最近会话 RNIMRecentSession 用于表示会话列表页的数据模型。当用户发送,收取及删除消息时,都会同时去修改最近会话。

当收到一条消息时,会自动生成这个消息对应的最近会话。最近会话可以删除,也可以重新创建。

√  获取最近会话,一般用于首页显示会话列表 

- (NSArray<RNIMRecentSession *> *)allRecentSessions;

√  最近会话的通知

√  最近消息添加

最近消息会在发送或者收到消息的时候自动添加,并触发增加最近会话的回调。

√  消息/会话的删除

单条消息的删除

- (void)deleteMessage:(RNIMMessage *)message   completion:(nullable void(^)(NSError * __nullable error))completion;

调用此方法时,先去服务端请求删除消息,请求成功后再更新到数据库,消息到状态被修改为删除状态,不直接删除。

单个会话批量消息删除 

- (void)deleteAllmessagesInSession:(RNIMSession   *)session                  removeRecentSession:(BOOL)removeRecentSession;

removeRecentSession 标记了最近会话是否会被保留,会话内消息将会标记为已删除。如果选择保留最近会话, lastMessage 属性将会被

置成一条空消息。

√  最近会话的删除 

- (void)deleteRecentSession:(NSArray<RNIMSession   *> *)sessions completion:(nullable void(^)(NSError * __nullable   error))completion;

只会删除最近会话,但保留会话内消息。调用时,总未读消息数会减去当前会话的未读数。

√  清空所有会话的消息

- (void)deleteAllMessages:(BOOL)removeRecentSessions;

removeRecentSession 标记了最近会话是否会被保留。

√  总未读数获取: 遍历所有会话,包括个人聊天和群组聊天,累加未读书得到总未读书的值。 

√  最近会话的本地扩展

开发者可以通过 RecentSession 的 localExt 接口读取扩展。并通过调用 RNIMConversationManager 修改本地扩展信息,用户可以直接修改

localExt 并更新RNIMRecentSession对象到服务端。当前localExt 字段只支持json格式,可以通过字段真json的方式实现扩展字段的多样性。


4.8 历史记录

4.8.1 云端记录

RNIMConversationManager 支持从云信服务器上远程获取之前的聊天历史记录。

/**
 从服务端拉取消息列表
 
 @param session 会话
 @param startMessageTime 开始的时间节点
 @param limit 数量
 @param direction 方向(0:往旧的查;1:往新的查)
 @param isCotainStartTime 是否包含节点数据
 @param result 结果回调(成功error == nil,失败messages == nil)
 */
- (void)fetchMessagesInSession:(RNIMSession   *)session                      startMessageTime:(uint64_t)startMessageTime   limit:(NSUInteger)limit direction:(NSUInteger)direction isCotainStartTime:(BOOL)isCotainStartTime   result:(void(^)(NSError * error, NSArray<RNIMMessage *> *   messages))result;

 搜索方向: 从当前消息开始,正向或反向查询消息历史。此参数对聊天室会话无效

 搜索条数: 搜索的范围由 startMessageTime 和 limit 参数共同限制,limit 为非零整数,上限为 50 条。

 同步数据: 是否在远程获取消息成功之后同步到本地数据库,同步只会保证消息数据写入本地但不触发回调。默认不同步。


4.8.2 本地记录

 RNIMConversationManager 支持本地查询消息

- (NSArray<NIMMessage *> *)messagesInSession:(RNIMSession   *)session startMessageTime:(uint64_t)startMessageTime limit:(NSUInteger)limit   direction:(NSUInteger)direction isCotainStartTime:(BOOL)isCotainStartTime result:(void(^)(NSArray<RNIMMessage   *> * dbMessages))result;

 搜索方向: 从当前消息开始,正向或反向查询消息历史。此参数对聊天室会话无效

 搜索条数: 搜索的范围由 startMessageTime 和 limit 参数共同限制,limit 为非零整数,上限为 50 条。


4.9 语音录制及播放

多媒体管理 RNIMMediaManager 提供了音频播放、高清语音录制的功能。需要注意的是 RNIM SDK 中的语音播放和录制仅支持 aac 和 ogg, 

但容能云im安卓只支持ogg格式,如果需要更多格式的支持,APP 需要自己实现,但并不推荐。


4.9.1 播放音频

 切换音频的输出设备。

- (BOOL)switchAudioOutputDevice:(RNIMAudioOutputDevice)outputDevice;

判断是否正在播放音频

- (BOOL)isPlayingFilePath:(NSString   *)filePath;

播放音频

- (void)play:(NSString *)filepath;

其中 filePath 为音频文件的路径,该操作会触发以下回调:

初始化工作完成,准备开始播放音频的时候会触发

- (void)playAudio:(NSString *)filePath   didBeganWithError:(NSError *)error;

音频播放结束的时候会触发

- (void)playAudio:(NSString *)filePath   didCompletedWithError:(NSError *)error;

停止播放音频

- (void)stopPlay;

该操作会触发回调:

- (void)playAudio:(NSString *)filePath   didCompletedWithError:(NSError *)error;

4.9.2 录制音频

录制音频

- (void)recordForDuration:(NSTimeInterval)duration;

其中 duration 限制了录音的最大时长,该操作会触发以下回调:

初始化工作完成,准备开始录制的时候会触发

- (void)recordAudio:(nullable NSString *)filePath   didBeganWithError:(nullable NSError *)error;

当到录音时长达到设置的最大时长,或者手动停止录音会触发

- (void)recordAudio:(nullable NSString   *)filePath duration:(NSTimeInterval)duration didCompletedWithError:(nullable   NSError *)error;

停止录制音频

- (void)finishRecord;

该操作会触发

- (void)recordAudio:(nullable NSString   *)filePath duration:(NSTimeInterval)duration didCompletedWithError:(nullable   NSError *)error;

取消录音

- (void)cancelRecord;

该操作会触发

- (void)recordAudioDidCancelled;


5 群组功能

5.1 群组功能概述

群组功能对应的管理类为 IMGroupManager 。RNIMGroupManagerProtocol文件中提供了对外的接口,目前只定义了高级群,高级群拥有群的所有权限。对应“个人版本”“企业版本”,两个版本的区别如下:


区别创建群组拉人入群主动加群(非成员)搜索群功能
个人版本

必须是创建者的好友。

无需对方同意

管理员和群主才有权限

必须是好友关系。

需要对方同意

需要管理员或群主同意。可以搜索未加入的群并申请加入群
企业版本

必须和创建者在同一个企业内

无需对方同意

管理员和群主才有权限

必须是群所在的企业。

无需对方同意

不能主动加群,没有搜索入口,只能管理员或群主拉人只能搜索已加入的群,不能搜索未加入的群


5.2 获取群组

RNIM SDK 在app登录成功后会增量同步当前用户加入的所有群,确保了数据的完整性。 SDK 提供了对群对增删改查操作,根据实际需求衍生了多个接口,比如获取自己对所有群,批量获取制定id列表的群,退群,群的各种属性修改的接口。一般用户使用获取本地数据的接口就可以完成业务功能,因为容能云注册了很多的同步通知,保证数据的实时性,当然我们也提供了直接查询服务器的接口。

本地获取

- (void)getGroupsFromDB:(void   (^)(NSArray<RNIMGroupEntity *> * __nullable groups))completion;

远程获取

- (void)getGroupsFromServer:(void   (^)(NSError * __nullable error,NSArray<RNIMGroupEntity *> * __nullable   groups)) completion;



5.3 创建群组

- (void)createGroup:(RNIMGroupEntity   *)group
users:(NSArray<NSString *> *)users completion:(void   (^)(NSError * __nullable error,NSString * __nullable groupId))completion;

创建群时,需要组装一个群对象,只要赋值群名,群类型,如果是企业群需要赋值企业ID,群头像使用默认头像,返回创建操作结果和群ID, 创建群的接口已经把群对组装并放到数据库中,用户只要根据群ID,即可从数据库中获得群对象。群信息修改:我们分别提供了修改群名/群头像/群介绍/群公告/群验证方式等群信息修改接口。


5.4 加入群组

用户可以通过被动接受邀请和主动加入两种方式进入群组。

邀请用户入群

- (void)addUsers:(NSArray<NSString   *> *)users toGroup:(NSString *)groupId completion:(void (^)(NSError *   __nullable error, NSArray<RNIMGroupMemberEntity *> * __nullable   error))completion;

请求完成后,如果是企业用户登录的群,被邀请者将直接入群;如果个人用户登录的群,服务器会下发一条验证提醒消息到目标用户,目标用户可以选择同意或者拒绝入群。同意/拒绝群邀请(仅限个人身份登录的群):参数choice 通过/拒绝/忽略 (1:接受;2:婉拒;3:忽略,4:过期)

- (void)inviteIntoGroup:(NSString   *)groupId inviteUserId:(NSString *)inviteUserId choice:(NSUInteger)choice completion:(void   (^)(NSError * __nullable error))completion;

主动申请入群(仅限个人身份登录)

- (void)applyJoinGroup:(NSString   *)groupId message:(NSString *)message completion:(void (^)(NSError *   __nullable error))completion;

请求完成后,服务器会下发一条验证提醒消息给群管理员,管理员可以选择通过或者拒绝申请。

主动申请入群(仅限个人身份登录)

- (void)applyJoinGroup:(NSString   *)groupId joinUserId:(NSString *)joinUserId choice:(NSUInteger)choice completion:(void   (^)(NSError * __nullable error))completion;



5.5 编辑群组资料

普通成员可以修改自己的群名片,管理员以上权限的群成员可以修改自己的群名片,以及群的信息。包括:

修改群成员(自己)昵称

- (void)updateUserNick:(NSString *)userId   newNick:(NSString *)newNick inGroup:(NSString *)groupId completion:(void   (^)(NSError * __nullable error))completion;

修改群名称:同时提供了修改到服务器并更新到本地和只更新到本地的接口

- (void)updateGroupName2Server:(NSString   *)groupName groupId:(NSString *)groupId completion:(void (^)(NSError *   __nullable error))completion;

修改群头像:同时提供了修改到服务器并更新到本地和只更新到本地的接口

- (void)updateGroupAvatar2Server:(NSString   *)groupAvatarUrl groupId:(NSString *)groupId completion:(void (^)(NSError *   __nullable error))completion;

修改群介绍

- (void)updateGroupIntro:(NSString   *)intro groupId:(NSString *)groupId completion:(void (^)(NSError * __nullable   error))completion;

修改群公告(暂缺)

修改群验证方式(暂缺)

修改被邀请人验证方式(暂缺)

修改谁可以邀请其他人入群(暂缺)

修改群自定义属性(目前只支持修改群名/群头像/群介绍,通过字段方式组装修改信息)

- (void)updateGroupCustomInfo:(NSDictionary<NSString*,   NSString *> *)values groupId:(NSString *)groupId completion:(void   (^)(NSError * __nullable error))completion;


5.6 群主的权限

群主可以对群进行权限管理,权限管理包括:

添加管理员

- (void)addManagersToGroup:(NSString   *)groupId users:(NSArray<NSString *> *)users completion:(void   (^)(NSError * __nullable error))completion;

移除管理员

- (void)removeManagersFromGroup:(NSString   *)groupId users:(NSArray<NSString *> *)users completion:(void   (^)(NSError * __nullable error))completion;

转让群

- (void)transferGroupWithGroupId:(NSString   *)groupId toUserId:(NSString *)userId isQuit:(BOOL)isQuit completion:(void(^)(BOOL   result))completion;

解散群:群主解散群后,群成员会收到一条系统同步消息,成员会删除这个群。

- (void)dismissGroup:(NSString *)groupId completion:(void   (^)(NSError * __nullable error))completion;

添加群成员(企业用户登录可以直接加人)管理员的权限(群主也包含管理员的权限)

- (void)addUsers:(NSArray<NSString   *> *)users toGroup:(NSString *)groupId completion:(void (^)(NSError *   __nullable error,NSArray<RNIMGroupMemberEntity *> * __nullable   members))completion;

添加群成员(个人用户登录需要发出邀请,等待通过后才能入群)

- (void)inviteIntoGroup:(NSString   *)groupId users:(NSArray<NSString *> *)users message:(NSString   *)message completion:(void (^)(NSError * __nullable error))completion;

删除群成员(管理员和群主可以直接踢人)

- (void)kickUsers:(NSArray<NSString   *> *)users fromGroup:(NSString *)groupId completion:(void (^)(NSError *   __nullable error))completion;

全员(整组)禁言/解除禁言 参数mute为YES禁言/NO解除禁言

- (void)updateMuteState2Server:(BOOL)mute   wholeGroup:(NSString *)groupId completion:(void (^)(NSError * __nullable   error))completion;

禁言/解除禁言某些成员(组内)参数mute为YES禁言/NO解除禁言

- (void)updateMuteState2Server:(BOOL)mute   userIds:(NSArray<NSString *> *)userIds inGroup:(NSString *)groupId completion:(void   (^)(NSError * __nullable error))completion;

获取成员禁言列表 参数lastTime表示上次加载的时间,值为0时表示拉取全部

- (void)fetchGroupMutedMembers:(NSString   *)groupId lastUpdateTime:(NSString *)lastTime 
completion:(void(^)(NSError *   __nullable error,NSArray<NSString *> * __nullable members, 
NSString *   __nullable time))completion;

普通成员权限(群主/管理员/普通成员都具有)

获取群成员列表

-   (void)getGroupMembersFromServer:(NSString *)groupId completion:(void   (^)(NSError * __nullable error,NSArray<RNIMGroupMemberEntity *> *   __nullable members))completion;

修改自己的群昵称

- (void)updateUserNick:(NSString *)userId   newNick:(NSString *)newNick inGroup:(NSString *)groupId completion:(void   (^)(NSError * __nullable error))completion;

修改自己的群成员自定义属性- 

-(void)updateGroupMemberCustomInfo:(NSDictionary<NSString   *,NSString *> *)values wholeGroup:(NSString *)groupId withUserId:(NSString   *)userId completion:(void (^)(NSError * __nullable error))completion;

修改后,其他在线用户通过系统同步通知自动同步获得修改后的属性。

用户退群

- (void)quitGroup:(NSString *)groupId completion:(void   (^)(NSError * __nullable error))completion;

用户退群成功后,移动端物理删除该群和群成员列表。

设置指定群为免打扰状态:免打扰设置后除了不推送不统计未读数,其他不变

- (void)updateShieldState2Server:(BOOL)shield   wholeGroup:(NSString *)groupId completion:(void (^)(NSError * __nullable   error))completion;


5.7 群组通知

作用通知名称通知携带信息
新群我被加入其中RNGroupNotificationGroupCreate群对象
我所在的群被解散RNGroupNotificationGroupRemove群id
已有的群里加了我RNGroupNotificationGroupWasJoined

群对象

添加成员后的群成员id列表

被添加的成员的id列表

我的加群申请被审批通过了RNGroupNotificationGroupWasPassMeJoined

群对象

添加用户id

当前用户id列表

自己被踢出群RNGroupNotificationGroupMeWasKicked

群id

被踢人员id列表

当前用户id列表

自己主动退群(多端同步)RNGroupNotificationGroupMeQuit群id
群主转让RNGroupNotificationGroupTransfer

群id

新的群主id

群全员禁言同步通知RNGroupNotificationGroupMute

群id

禁言/解禁言标志

群免打扰通知RNGroupNotificationGroupShieldStatus

群id

设置/解除免打扰状态

群信息变更RNGroupNotificationGroupInfoModify群对象
群自定义信息变更RNGroupNotificationGroupCustomInfoModify群对象
群名变更RNGroupNotificationGroupNameModify

群id

新的群名

群头像变更RNGroupNotificationGroupAvatarModify

群id

群新的头像

增加群管理员RNGroupNotificationGroupAdminAdd

群id

新增管理员id列表

删除群管理RNGroupNotificationGroupAdminDelete

群id

删除管理员id列表

我所在的群里加人RNGroupNotificationGroupAddMember

群id

新增的群成员id列表

我所在的群有人申请加群被审核通过了RNGroupNotificationGroupWasPassOtherJoined

群id

当前群成员数量

我所在的群有人被踢出群RNGroupNotificationGroupOtherWasKicked

群id

被踢出群的成员id列表

有人主动退群RNGroupNotificationGroupOtherQuit

群id

主动退群的成员id

群成员昵称变更RNGroupNotificationGroupMemberNickNameModify

群id

群成员id

群成员新的昵称

群成员自定义信息变更RNGroupNotificationGroupMemberCustomInfoModify

群id

群成员id

群成员自定义信息的字典

群成员被禁言RNGroupNotificationGroupMemberMute

群id

设置/解除禁言状态

被操作的群成员id列表

免打扰列表变化RNUSERNotificationShieldListModify

群id

设置/解除免打扰状态

被操作的群成员id列表

自己(我)主动踢人RNUSERNotificationShieldList

群id

当前成员个数

自己(我)主动加人RNGroupNotificationGroupMemberWasAdd

群id

当前成员个数


5.8 自定义拓展

SDK 提供了群信息的拓展接口,开发者可以自行定义内容。

- (void)updateTeamCustomInfo:(NSString *)info                       teamId:(NSString *)teamId                   completion:(RNIMTeamHandler)block;

开发者可以通过 RNIMTeam 的两个属性读取拓展信息:

应用方可以自行拓展这个字段做个性化配置,客户端不可以修改这个字段

@property (nonatomic,copy,readonly)  NSString *serverCustomInfo;

应用方可以自行拓展这个字段做个性化配置,客户端可以修改这个字段

@property (nonatomic,copy,readonly)  NSString *clientCustomInfo;


6 APNS 推送

6.1 前期准备

制作推送证书并在管理后台配置

客户端注册 APNS,并在获取到 APNS Token 时将值传给 SDK

// 设置推送服务
- (void)registerAPNs
{
      [[UIApplication sharedApplication] registerForRemoteNotifications];
     
      UIUserNotificationType types = UIUserNotificationTypeBadge |   UIUserNotificationTypeSound 
      | UIUserNotificationTypeAlert;
      UIUserNotificationSettings *settings = [UIUserNotificationSettings
         settingsForTypes:types  categories:nil];
      [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
 
/**
 *  更新APNS Token
 *
 *    @param token APNS Token
 */
-(void)updateApnsToken:(NSData *)token
{
      deviceToken = token;
     
      NSString *tokenStr = [NSString stringWithFormat:@"%@",   deviceToken];
      NSString *dt = [tokenStr   stringByTrimmingCharactersInSet:[NSCharacterSet
         characterSetWithCharactersInString:@"<>"]];
      NSString *dn = [dt stringByTrimmingCharactersInSet:[NSCharacterSet
         whitespaceAndNewlineCharacterSet]];
      tokenStr = [dn stringByReplacingOccurrencesOfString:@" "   withString:@""];
      [McNotifyLoginManager instance].deviceToken = tokenStr;
}


6.2 推送问题排查方案

推送配置后在后台仍收不到通知栏提醒可检查如下步骤:

云信iOS推送收不到问题排查方案 


6.3 黑名单

容能云中,黑名单和好友关系是互相独立的,即修改好友关系不会影响黑名单关系,同时,修改黑名单也不会对好友关系进行操作。

获取黑名单成员列表 

- (NSArray<RNIMUser *> *)myBlackList;

黑名单列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。接口返回的是黑名单对象对象。

添加用户到黑名单

- (void)addToBlackList:(NSString *)friendUserId             completion:(void(^)(NSError *   __nullable error))completion;

拉黑成功后,会同时修改本地数据库,并刷新最近联系人会话列表。

将用户从黑名单移除

- (void)deleteBlackBlackList:(NSString *)userId                       completion:(void(^)(NSError *   __nullable error))completion;

移除成功后,会同时修改本地数据库,并刷新最近联系人会话列表。

判断用户是否在自己的黑名单内

- (BOOL)isUserInBlackList:(NSString *)userId;

此接口是根据本地缓存数据来判断是否拉黑的,在调用时请保证本地缓存是正确的(登录后有正常完成数据同步)。


6.4 免打扰列表

容能云通信中,可以单独设置是否开启某个用户的消息提醒,即对某个用户静音。静音关系和好友关系是互相独立的,修改好友关系不会影响静音关系,同时,修改静音关系也不会对好友关系进行操作。

获取静音成员(免打扰)列表,提供了从服务器获取并更新数据库,和从本地数据库获取的接口

-(void)getShieldUserListFromServer:(void(^)(NSArray<RNIMShieldEntity*>   * shields))completion;
-(void)getShieldUserListFromCache:(void(^)(NSArray<RNIMShieldEntity*>   * shields))completion;

静音列表有本地存储,会在手动/自动登录后与服务器自动进行同步更新。接口返回的是 RNIMShieldEntity 列表。 RNIMShieldEntity 对象包含用户id和免打扰状态。

设置消息提醒

-   (void)setShieldStatus2ServerWithPeerUserId:(NSString *)userId   withStatus:(BOOL)status completion:(void(^)(BOOL success))completion;

设置成功之后,同时更新本地缓存数据。

用户是否有消息提醒

- (BOOL)isShieldFromCacheWithUserId:(NSString   *)userId;

此接口是根据本地数据库的数据来判断是否有消息提醒的,在调用时请保证本地缓存是正确的(登录后有正常完成数据同步)。

当操作了设置免打扰成功以后,会给自己发一个通知RNUSERNotificationShieldListModify,带上用户id和状态值。


7 用户关系托管

说明:该部分是托管用户相关,非托管用户需要自己实现接口和数据封装。

获取用户好友审核设置

-(void)friendUserSetCompletion:(void(^)(RNUUserSetStatus  userSet ,NSError * __nullable error))completion;

添加好友有几种验证方式:免验证/需要验证/拒绝被加好友,添加好友时,如果有需要可以先获取对方的验证方式,根据需要选择是否使用该接口。

更改用户好友审核设置信息

-   (void)changeFriendUserSet:(RNUUserSetStatus)set completion:(void(^)(NSError *   __nullable error))completion;

设置自己被添加为好友的验证方式,默认是需要验证。

添加好友申请

- (void)requestFriend:(NSString   *)friendUserId validInfo:(NSString *)validInfo nickName:(NSString *)nickName   friendNickName:(NSString *)friendNickName
completion:(nullable void(^)(NSError *   __nullable error))completion;

发送添加对方为好友的请求到服务器,并等待对方验证。

如果对方免验证,则直接建立好友关系。

删除好友

- (void)deleteFriend:(NSString   *)userFriendId
completion:(nullable void(^)(NSError *   __nullable error))completion;

解除好友关系,不需要经过验证或对方同意,可以直接删除好友(关系)。

批量删除好友。

- (void)deleteFriends:(NSArray   *)userFriendIdList
completion:(nullable void(^)(NSError *   __nullable error))completion;

批量操作时使用,可选接口。

返回我的好友列表

- (nullable NSArray<RNUUser *>   *)myFriends;

从本地数据中返回我的好友列表,当好友关系发生变化时,app运行状态或者启动时,会实时更新到数据库中。

根据userID获取本地数据库好友详细信息

- (RNUUserFriend *)friendInfo:(NSString   *)userId;

服务器同步拉取好友列表

- (void)fetchFriendListCompletion:(nullable   void(^)(NSArray<RNUUserFriend *> * __nullable friends,NSError *   __nullable error))completion;

需要刷新好友关系列表时,可以使用该接口。使用场景如:下拉刷新。

判断是否是我的好友

- (BOOL)isMyFriend:(NSString *)userId;

更新好友关系

- (void)updateMyFriend:(NSString *)friendId   andStatus:(RNUUserFriendOperation)status andNickName:(NSString *)nickName   completion:(nullable void(^)(NSError * __nullable error))completion;

status ( 0:表示申请 ,1表示通过 -1:忽略)

获取好友对我的昵称

- (void)getMyNickNameFromFriend:(NSString   *)friendUserId completion:(nullable void(^)(NSString *nickName,NSError *   __nullable error))completion;

如果需要在推送时,显示到对方的推送横幅消息中,可以先获取对方对自己对昵称,发送消息时,对方的横幅上就可以显示对方对自己对备注名称。

更新好友昵称

- (void)updateFriendNickName:(NSString   *)nickName friendUserId:(NSString *)friendUserId completion:(nullable   void(^)(NSError * __nullable error))completion;

可以通过该接口编辑我对别人的备注昵称,方便使用者管理好友。

获取本地所有好友申请列表

- (NSArray *)userFriendApplyList;

适合离线登录时,显示申请列表。

获取好友申请列表

-   (void)fetchUserFrienApplyAndCompletion:(nullable   void(^)(NSArray<RNUUserFriendApply *> * __nullable friendApplys,NSError   * __nullable error))completion;

增量获取好友申请的列表。


8 黑名单

说明:该部分是托管用户相关,非托管用户需要自己实现接口和数据封装。

添加用户到黑名单

- (void)addToBlackList:(NSString   *)friendUserId completion:(void(^)(NSError * __nullable error))completion;

处于黑名单中的用户,自己将不会收到对方的聊天信息,只有解除黑名单后才会正常。

将用户从黑名单移除

-(void)deleteBlackBlackList:(NSString   *)userId completion:(void(^)(NSError * __nullable error))completion;

移除黑名单的用户,可以恢复正常状态,除非对方已经解除好友关系或者自己还在对方的黑名单中。

批量将用户从黑名单移除

- (void)deleteUsersFromBlackList:(NSArray   *)userIds
completion:(void(^)(NSError * __nullable   error))completion;

判断用户是否已被拉黑

- (BOOL)isUserInBlackList:(NSString   *)userId;

返回所有在黑名单中的用户列表

- (nullable NSArray<RNUUserBlackList   *> *)myBlackList;

获取黑名单列表

-   (void)fetchBlackListCompletion:(nullable void(^)(NSArray<RNUUserBlackList   *> * __nullable userBlackList,NSError * __nullable error))completion;


9 用户资料托管

说明:该部分是托管用户相关,非托管用户需要自己实现接口和数据封装。RNUUserManager 提供了用户帐号资料的增删改查基本操作,用户管理能力也需要经历登录的过程,都封装在登录流程里了。RNUUserManager 里,使用 RNUUser 对用户进行封装。

用户注册时发送手机验证码

-   (void)fetchRegisterSMSCodeWithPhone:(NSString *)phone completion:(nullable   void(^)(NSString * uuid,NSError * __nullable error))completion;

接口返回uuid,作为下一步验证短信验证绑定对应手机时使用,服务端会调用接口给参数中的手机号码发送短信。

用户找回密码时发送手机验证码

-   (void)fetchBackPswSmsCodeWithPhone:(NSString *)phone completion:(nullable   void(^)(NSString * uuid,NSError * __nullable error))completion;

接口返回uuid,作为下一步验证短信验证绑定对应手机时使用,服务端会调用接口给参数中的手机号码发送短信。

用户注册时发送邮箱验证码

-   (void)fetchRegisterSMSCodeWithMail:(NSString *)mail completion:(nullable   void(^)(NSString * uuid,NSError * __nullable error))completion;

接口返回uuid,作为下一步验证邮箱验证码绑定对应邮箱时使用,服务端会调用接口给参数中的邮箱地址发送邮箱验证码。

用户找回密码时发送邮箱验证码

-   (void)fetchBackPswSmsCodeWithMail:(NSString *)mail completion:(nullable   void(^)(NSString * uuid,NSError * __nullable error))completion;

接口返回uuid,作为下一步验证邮箱验证码绑定对应邮箱时使用,服务端会调用接口给参数中的邮箱地址发送邮箱验证码。

创建注册用户

-             (void)addUserWithUser:(RNUAddUser *)user
completion:(nullable void(^)(NSError *
__nullable error))completion;

删除用户

- (void)deleteUser:(NSString *)userId   completion:(nullable void(^)(NSError * __nullable error))completion;

根据用户id删除用户,返回操作结果。

批量删除用户

- (void)deleteUsers:(NSArray *)userIds   completion:(nullable void(^)(NSError * __nullable error))completion;

根据用户id列表删除,返回操作结果。

用户登录(登录后台托管用户中心,获取token和用户信息)

- (void)loginUserWithUserName:(NSString   *)userName andPassWord:(NSString *)passWord completion:(nullable   void(^)(RNUUser * __nullable user ,NSString * __nullable token,NSError *   __nullable error))completion;

根据用户名和密码登录用户能力后台,返回token和登录用户的基本信息,错误返回错误对象。

Token用户以后的登录,可以代替账号&密码使用,避免密码在传输和存储过程中泄漏而造成信息安全问题。


自动登录

- (void)autoLogin:(NSString *)token   completion:(nullable void(^)(RNUUser * __nullable user ,NSString * __nullable   token,NSError * __nullable error))completion;

使用用户名和密码登录返回的token作为登录账号&密码使用,返回用户信息和新的token,错误返回错误对象。


修改密码

- (void)changeMyUserPassWord:(NSString   *)oldPassword newPassWord:(NSString *)newPassWord completion:(nullable   void(^)(NSError * __nullable error))completion;

修改密码只针对登录以后进行密码修改,实际用户id和鉴权相关信息已经填充在http头部。

修改自己的用户资料

-   (void)updateMyUserInfo:(NSDictionary<NSNumber *,NSString *> *)value completion:(nullable   void(^)(NSError * __nullable error))completion;

这个接口可以一次性修改多个属性,如昵称,头像等,传入的数据键值对是 {@(RNUUserInfoUpdateTag) : NSString}, *无效数据将被过滤。一些字段有修改限制,具体请参看 RNUUserInfoUpdateTag 的相关说明。

找回密码

-   (void)retrievePasswordWithNewPassword:(NSString *)newPassword andPhone:(NSString   *)phone andEmail:(NSString *)email andSmsCode:(NSString *)code
andUuid:(NSString *)uuid
completion:(nullable void(^)(NSError *   __nullable error))completion;

找回密码接口统一了邮箱和手机找回密码,其中手机找回时参数选择手机号,邮箱找回时参数填入邮箱地址,其他参数对应找回方式,该接口需要先请求验证码的接口,参数uuid就是接口返fetchBackPswSmsCodeWithPhonefetchBackPswSmsCodeWithMail返回的。

参数code对应邮箱验证码或者手机短信验证码。

修改用户头像

- (void)changeMyUserAvatar:(NSString   *)filed completion:(nullable void(^)(NSError * __nullable error))completion;

传入参数为文件id,调用接口前,需要先调用接口上传文件并返回文件id。

从服务器批量获取用户资料

-   (void)fetchUserInfos:(NSArray<NSString *> *)users
completion:(nullable   void(^)(NSArray<RNUUser *> * __nullable users,NSError * __nullable error))completion;

需要将用户信息交给服务端托管,此接口才有效。调用此接口,不会触发 - (void)onUserInfoChanged: 回调。

* 该接口会将获取到的用户信息缓存在本地,所以需要避免此接口的滥调,导致存储过多无用数据到本地而撑爆缓存。

* 本接口一次最多支持 150 个用户信息获取

 获取用户详细信息

-(void)getUser:(NSString *)userId   completion:(nullable void(^)(RNUUser * __nullable user,NSError * __nullable   error))completion;

根据指定用户id获取用户基本资料,错误时返回错误对象。

 从本地获取用户资料

- (nullable RNUUser *)userInfo:(NSString   *)userId;

需要将用户信息交给服务端托管,且数据已经正常缓存到本地,此接口才有效。

用户资料除自己之外,不保证其他用户资料实时更新

其他用户资料更新的时机为:

1.调用 - (void)fetchUserInfos:completion: 方法刷新用户

2.收到此用户发来消息

3.程序再次启动,此时会同步好友信息

获取本地所有用户信息

- (NSArray *)myUsers;

返回本地所有用户信息列表。

获取我的用户信息

- (RNUUser *)myUserInfo;

获取我(当前登录用户)的用户信息。

设置消息提醒

- (void)updateNotifyState:(BOOL)notify forUser:(NSString   *)userId completion:(nullable void(^)(NSError * __nullable error))completion;

可以设置是否打开/关闭apns推送,默认是推送是打开的,暂未实现。

根据关键字搜索用户(模糊搜索)

-   (void)searchUsersFromKeys:(NSDictionary<NSNumber *,NSString *> *)values   completion:(nullable void(^)(NSArray <RNUUser *>* users,NSError *   __nullable error))completion;

模糊搜索使用条件为关键字map(key:valve),返回用户信息数组。

根据关键字搜索用户(精确搜索)

- (void)getUsersFromKey:(NSString *)key   completion:(nullable void(^)(RNUUser * user,NSError * __nullable   error))completion;

模糊搜索使用条件为关键字key,返回用户信息对象。


10 公司组织架构管理

10.1 企业管理功能

说明:该部分是托管用户相关,非托管用户需要自己实现接口和数据封装,个人版本登录的用户企业功能受限,如:不能通过搜索并申请加入企业。

UCompanyManager用来管理用户加入的团队,团队/员工/岗位/部门之间的管理,容能云im提供了一整套完整的企业结构方案。

新建公司企业

- (void)createCompany:(NSString   *)companyName companyFullName:(NSString *)companyFullName
   forIndustry:(NSString *)industry forExtend:(NSString *)extend
   completion:(nullable void(^)(RNUCompany
   * __nullable company,RNUStaff *__nullable staff, NSError * __nullable   error))completion;

由于后台限制,目前创建企业最多三个,加入的企业最多五个,如果绑定账号发生合并账号的场景,也需要满足这种场景,否则会切换绑定失败。

删除公司

- (void)deleteCompany:(NSString   *)companyId completion:(nullable void(^)(NSError * __nullable   error))completion;

更新公司信息

- (void)updateCompany:(NSDictionary<NSString   *,NSString *> *)valuse companyId:(NSString *)companyId   completion:(nullable void(^)(RNUCompany    * __nullable company,NSError * __nullable error))completion;

根据公司ID获取公司信息

- (void)getCompany:(NSString *)companyId   completion:(nullable void(^)(RNUCompany    * __nullable company,NSError * __nullable error))completion;

搜索企业信息

- (void)searchCompany:(NSString *)key   completion:(nullable void(^)(NSArray  *   __nullable companys,NSError * __nullable error))completion;

申请加入企业

- (void)applyJoinInCompany:(NSString   *)companyId validInfo:(NSString *)validInfo    completion:(nullable void(^)(NSError * __nullable error))completion;

申请加入企业需要等待企业管理员通过申请才能加入企业。

根据用户ID获取所有企业申请列表(只有某一个企业以上的管理员才有数据)

-   (void)userVerifyListByUserIdCompletion:(nullable   void(^)(NSArray<RNUUserVerify *> * __nullable userVerifys,NSError *   __nullable error))completion;

获取企业待审批用户列表

- (void)userVerifyList:(NSString   *)companyId completion:(nullable void(^)(NSArray<RNUUserVerify *> *   __nullable userVerifys,NSError * __nullable error))completion;

管理员可以通过获取待审核列表并进行审核操作,后台会同步到对应的用户手机上。

从数据库获取公司信息

- (nullable NSArray<RNUCompany *>   *)myCompany;

自动登录或离线登录时,可以获取数据库数据进行展示,登录后会进行同步。

获取用户加入的所有共同加入公司

- (nullable NSArray<RNUCompany   *>*)userJoinCompanyList:(NSString *)userId;

容能云im规定只能在同一个公司才能加到群组里,并且查看用户资料时,不会显示没有共同所在公司的信息。

获取公司企业列表

- (void)companyListCompletion:(nullable   void(^)(NSArray  * __nullable   companys,NSError * __nullable error))completion;

仅能获取当前登录用户所在的企业列表,用户id等信息已经在http头部封装好了。

根据公司ID本地数据库获取公司信息

- (RNUCompany *)companyInfo:(NSString   *)companyId;

根据id从数据库中获取公司信息,登录以后会同步公司信息,如果有发生变更,也会实时更新。

更新公司设置

-   (void)updateCompanySet:(NSDictionary<NSString *,NSString *> *)valuse   companyId:(NSString *)companyId completion:(void(^)(RNUCompanySet  * __nullable companySet,NSError *   __nullable error))completion;

需要更新的公司信息键值 @{key:valuse} 从RNUCompanySet获取key,修改后会同步给公司内的所有成员。

创建部门

- (void)createDepartment:(NSString   *)departmentName parentId:(NSString *)parentId companyId:(NSString   *)companyId contactsStatus:(int)contactsStatus level:(int)level completion:(nullable   void(^)(RNUDepartment  * __nullable department,NSError   * __nullable error))completion;

在指定公司下添加部门,创建成功返回部门详细信息的对象,创建失败返回错误结果对象。

删除部门

- (void)deleteDepartment:(NSString   *)departmentId companyId:(NSString *)companyId completion:(nullable void(^)(NSError   * __nullable error))completion;

删除部门请求成功后,本地数据库也会删除该部门,部门内员工有其他部门挂靠就只是删除部门员工也删除了,但是不影响该员工

在其他部门内的展示。如果部门内的员工没有挂靠其他部门,删除部门,该员工会被挂靠到公司节点底下。

批量删除部门

- (void)deleteDepartments:(NSArray   *)departmentIds companyId:(NSString *)companyId completion:(nullable void(^)(NSError   * __nullable error))completion;

修改部门信息

-   (void)updateDepartment:(NSDictionary<NSString *,NSString *> *)valuse   departmentId:(NSString *)departmentId companyId:(NSString *)companyId   completion:(nullable void(^)(RNUDepartment    * __nullable department,NSError * __nullable error))completion;

需要更新的用户信息键值 @{key:valuse},key参考RNUDepartment字段名称。

根据公司ID获取部门列表

- (void)departmentList:(NSString   *)companyId completion:(nullable void(^)(NSArray  * __nullable departments,NSError *   __nullable error))completion;

该接口增量返回公司下变化的部门并更新到数据库中。

根据部门ID服务端拉取最新部门详细信息

- (void)fetchDepartmentInfo:(NSString   *)departmentId companyId:(NSString *)companyId completion:(nullable   void(^)(RNUDepartment  * __nullable   department,NSError * __nullable error))completion;

当需要单独获取一个部门详情时,可以通过该接口从服务器获取最新的部门信息。

从数据库获取自己所有部门信息

-(nullable NSArray <RNUDepartment   *> *)myDepartment;

用户离线登录或者自动登录时,从数据库获取数据进行展示使用。

根据部门ID获取部门信息

-(RNUDepartment   *)departmentInfo:(NSString *)departmentId;

从数据库根据部门id指定获取一个部门的信息。

新建岗位信息

- (void)createPosition:(NSString *)companyId
positionName:(NSString *)positionName
positionType:(RNUPositionType)type
:(NSString *)remark
sort:(int)sort
completion:(void(^)(RNUPosition  * __nullable position,NSError * __nullable   error))completion;

公司-部门-岗位是一个金字塔置顶而下的样式,添加岗位后,成功返回岗位信息,失败返回失败结果对象。

删除岗位

- (void)deletePosition:(NSString   *)positionId companyId:(NSString *)companyId completion:(void(^)(NSError *   __nullable error))completion;

删除岗位会使岗位下的成员归位,归位遵循的原则是该员工有其他岗位则只是删除的岗位及改员工被删除,其他岗位下的该员工保留,如果该

员工没有其他岗位,则会挂靠到这个岗位的父节点上。

批量删除岗位

- (void)deletePositionList:(NSArray   *)positionIds companyId:(NSString *)companyId completion:(void(^)(NSError *   __nullable error))completion;

根据岗位id列表和公司id,批量删除岗位信息。

修改岗位信息

-   (void)updatePosition:(NSDictionary<NSString *,NSString *> *)valuse   positionId:(NSString *)positionId companyId:(NSString *)companyId   completion:(nullable void(^)(RNUPosition    * __nullable position,NSError * __nullable error))completion;

根据字典@{key:valuse}样式参数,其中key为RNUPosition的key值。

根据公司ID获取岗位

- (void)positionList:(NSString   *)companyId completion:(nullable void(^)(NSArray<RNUPosition *>  * __nullable positions,NSError * __nullable   error))completion;

根据公司id从服务器获取该公司下的所有岗位信息并写到数据库中。

根据岗位ID服务端拉取最新资料

- (void)fetchPositionInfo:(NSString   *)positionId companyId:(NSString *)companyId completion:(nullable void(^)(RNUPosition  * __nullable position,NSError * __nullable   error))completion;

根据岗位id和岗位所在的公司id,获取岗位的详细信息。

从数据库获取所有岗位信息

- (nullable NSArray <RNUPosition *>   *)myPosition;

从本地数据库获取所有公司下的岗位信息。

根据岗位ID获取岗位信息

- (RNUPosition *)positionInfo:(NSString   *)positionId;

根据岗位id从本地获取岗位信息。

验证加入公司

- (void)verifyJoinInCompany:(NSString   *)companyId userId:(NSString *)userId status:(RNUVerifyStatus)status   completion:(void(^)(NSError * __nullable error))completion;

管理员验证外部成员的加入申请,审核状态 0 未审核 1通过 2 拒绝。

更新员工状态

- (void)updateStaffStatus:(NSString   *)staffId status:(RNUCompanyStatus)status companyId:(NSString *)companyId   completion:(nullable void(^)(NSError * __nullable error))completion;

修改员工状态,设置为status 状态:0:禁用;1:启用。

批量更新员工状态

- (void)updateStaffStatusList:(NSString   *)staffIds status:(RNUCompanyStatus)status companyId:(NSString *)companyId   completion:(nullable void(^)(NSError * __nullable error))completion;


10.2 员工关系

说明:该部分是托管用户相关,非托管用户需要自己实现接口和数据封装。

新增员工信息

- (void)createStaff:(RNUAddStaff *)staff   completion:(void(^)(RNUStaff  *   __nullable staff,NSError * __nullable error))completion;

管理员主动把人加到公司内,成功返回员工信息,失败返回结果对象。

删除员工

- (void)deleteStaff:(NSString *)staffId   companyId:(NSString *)companyId completion:(void(^)(NSError * __nullable   error))completion;

删除员工信息请求成功后,会同步删除本地数据库中该员工的信息。

批量删除员工信息

- (void)deleteStaffs:(NSArray *)staffIds   companyId:(NSString *)companyId completion:(void(^)(NSError * __nullable   error))completion;

批量删除员工信息,成功后批量删除数据中保存的相关信息。

根据staffId获取员工信息

- (void)getStaff:(NSString *)staffId  companyId:(NSString *)companyId completion:(nullable   void(^)(RNUStaff  * __nullable   staff,NSError * __nullable error))completion;

根据员工id和员工所在公司的id,从服务端请求员工信息,失败返回结果对象,成功后返回员工信息并更新到数据库中。

根据用户ID和公司ID从服务器拉取员工信息

- (void)fetchStaffInfoByUserId:(NSString   *)userId companyId:(NSString *)companyId completion:(nullable   void(^)(RNUStaff  * __nullable   staff,NSError * __nullable error))completion;

区别于上一个接口,参数不同,但是结果一样。

从数据库获取所有员工信息

- (nullable NSArray <RNUStaff   *>*)myStaff;

根据用户ID和公司ID返回该公司下员工资料

- (RNUStaff *)staffInfoByUserId:(NSString *)userId companyId:(NSString   *)companyId;

根据用户id和公司id从数据库中获取员工信息。

根据员工ID返回该公司下员工资料

- (RNUStaff *)staffInfo:(NSString *)staffId;

根据员工id获取该员工的信息,因为员工id不同公司里也具有唯一性。

获取当前公司所有员工信息

- (NSArray *)staffList:(NSString *)companyId;

根据公司id,获取公司下的所有员工信息。

搜索员工详细信息

- (void)searchStaffList:(NSString *)companyId completion:(nullable   void(^)(NSArray<RNUStaff *> * __nullable staffs,NSError * __nullable   error))completion;

根据公司id,从服务器增量获取员工信息,成功返回列表,失败返回结果对象。

更新员工资料

- (void)updateStaff:(NSDictionary<NSString *,NSString *>   *)value staffId:(NSString *)staffId companyId:(NSString *)companyId   completion:(nullable void(^)(RNUStaff    * __nullable staff,NSError * __nullable error))completion;

通过字典的方式@{key:value}设置参数,其中 key为RNUStaffInfoUpdateTag的key值 (只有超级管理员可以修改所有字段,普通员工只能

修改拓展字段(RNUStaffInfoUpdateTagExt))


10.3 部门岗位关系

说明:该部分是托管用户相关,非托管用户需要自己实现接口和数据封装。

新建部门岗位关系

- (void)createDepartmentPositionRelation:(NSString *)departmentId   positionId:(NSString *)positionId companyId:(NSString *)companyId   completion:(void(^)(NSError * __nullable error))completion;

添加并绑定部门岗位关系

删除部门岗位关系。

- (void)deleteDepartmentPosition:(NSString *)departmentId   positionId:(NSString *)positionId companyId:(NSString *)companyId   completion:(void(^)(NSError * __nullable error))completion;

删除部门岗位关系,一般使用场景是转移/切换部门岗位,删除既是解绑,可以再绑定到本公司其他部门下。

批量删除部门岗位关系

(void)deleteDepartmentPositionListByPositionIds:(NSArray   *)positionIds companyId:(NSString *)companyId completion:(void(^)(NSError *   __nullable error))completion;

使用岗位id列表和公司id,批量删除部门岗位关系。

批量删除部门岗位关系

-(void)deleteDepartmentPositionListByDepartmentIds:(NSArray *)departmentIds   companyId:(NSString *)companyId completion:(void(^)(NSError * __nullable   error))completion;

使用部门id列表和公司id,批量删除多个部门的部门岗位关系。

搜索部门岗位信息

- (void)searchDepartmentPositionList:(NSString *)companyId   departmentId:(NSString *)departmentId
  completion:(nullable void(^)(NSArray
      <RNUDepartmentPosition *>* __nullable departments,NSError *   __nullable error))completion;

根据公司id和部门id,获取指定部门下的部门岗位信息。

数据库获取部门下的岗位

- (NSArray <RNUDepartmentPosition *>   *)getDepartmentPositionFormDBByDepartmentId:(NSString *)departmentId;

根据部门id从本地数据库获取部门下的岗位信息列表。

新建部门员工关系

- (void)createDepartmentStaffRelation:(NSString *)staffId   departmentId:(NSString *)departmentId relation:(RNUPositionType)relation   companyId:(NSString *)companyId completion:(void(^)(NSError * __nullable   error))completion;

根据员工id和部门id,创建部门员工关系。

删除部门员工关系

- (void)deleteDepartmentStaff:(NSString *)departmentId   staffId:(NSString *)staffId companyId:(NSString *)companyId   completion:(void(^)(NSError * __nullable error))completion;

根据部门id和员工id,从服务端删除部门员工关系。

批量删除部门员工关系

- (void)deleteDepartmentStaffList:(NSString *)departmentId   staffIds:(NSArray *)staffIds companyId:(NSString *)companyId   completion:(void(^)(NSError * __nullable error))completion;

从服务端批量删除员工部门关系并同步到本地数据库中。

修改部门员工关系

- (void)modifyUcDepartmentStaff:(NSString *)staffId   oldDepartmentId:(NSString *)oldDepartmentId newDepartmentId:(NSString   *)newDepartmentId companyId:(NSString *)companyId completion:(void(^)(NSError   * __nullable error))completion;

切换部门员工关系,从指定部门切换到新的部门中,成功后同步到本地数据库,并通知该公司下到其他员工进行同步。

移动部门员工

- (void)moveUcDepartmentStaffByStaffIds:(NSArray *)staffIds   departmentIds:(NSArray *)departmentIds companyId:(NSString *)companyId   completion:(void(^)(NSError * __nullable error))completion;

移动部门员工关系,只要指定新的部门id即可。

搜索部门员工关系

- (void)searchDepartmentStaffList:(NSString *)companyId   completion:(nullable void(^)(NSArray
    <RNUDepartmentStaff *>* __nullable departmentStaff,NSError *   __nullable error))completion;

搜索公司下的所有部门员工关系。

从数据库中获取部门员工

- (NSArray <RNUDepartmentStaff *>   *)getDepartmentStaffFormDBByCompanyId:(NSString *)companyId   departmentId:(NSString *)departmentId;

根据公司id和部门id,从本地数据库获取指定公司指定部门下的部门员工关系。

从数据库中获取部门员工

- (NSArray <RNUDepartmentStaff *>   *)getDepartmentStaffFormDBByCompanyId:(NSString *)companyId staffId:(NSString   *)staffId;

根据公司id和员工id,从本地数据库中获取指定员工在指定公司里面的部门员工关系。


10.4 员工岗位信息

说明:该部分是托管用户相关,非托管用户需要自己实现接口和数据封装。

创建员工岗位关系

- (void)createStaffPositionRelation:(NSString *)staffId   positionId:(NSString *)positionId departmentId:(NSString *)departmentId   companyId:(NSString *)companyId completion:(void(^)(NSError * __nullable   error))completion;

从服务端请求创建员工岗位关系,并更新到本地数据库中。

删除员工岗位关系

- (void)deleteStaffPosition:(NSString *)staffId
positionId:(NSString *)positionId
departmentId:(NSString *)departmentId
companyId:(NSString *)companyId
completion:(void(^)(NSError * __nullable error))completion;

从服务端请求删除员工岗位关系,并更新到本地数据库中。

批量删除员工岗位关系

- (void)deleteStaffPositionListByStaffIds:(NSArray *)staffIds positionId:(NSString   *)positionId
departmentId:(NSString *)departmentId
companyId:(NSString *)companyId
completion:(void(^)(NSError * __nullable error))completion;

从服务端请求删除员工列表对应的员工岗位关系,并更新到本地数据库中。

批量删除员工岗位关系

(void)deleteStaffPositionListByPositionIds:(NSArray *)positionIds
StaffId:(NSString *)staffId
departmentId:(NSString *)departmentId
companyId:(NSString *)companyId
completion:(void(^)(NSError * __nullable error))completion;

从服务端请求删除指定员工对应的多个岗位的员工岗位关系,并更新到本地数据库中。

批量删除员工岗位关系

-(void)deleteStaffPositionListByDepartmentIds:(NSArray   *)departmentIds positionId:(NSString *)positionId staffIds:(NSString   *)staffId
companyId:(NSString *)companyId
completion:(void(^)(NSError * __nullable error))completion;

从服务端请求删除多个部门下指定岗位ID的员工岗位关系,并更新到本地数据库中。

搜索员工岗位信息

- (void)searchStaffPositionList:(NSString *)companyId   completion:(void(^)(NSArray *list, NSError * __nullable error))completion;

根据公司id,从服务器获取公司下的所有员工岗位关系,并更新到本地数据库中。

获取部门下员工的岗位信息

- (NSArray <RNUStaffPosition *>   *)staffPositionInfo:(NSString *)staffId departmentId:(NSString   *)departmentId;

从本地数据中获取部门下的岗位信息列表。


11 推送配置

11.1 创建应用 App ID

 登陆 iOS Dev Center 选择进入 Certificates,Identifiers & Profiles。

image.png

  点击左栏 Identifiers -> Apps IDs 进入列表

image.png


 点击右侧 “+” 号,填入相关信息,创建证书

image.png


11.2 App 开启 Push Notification

 点击创建好的 App,选择 Edit 按钮。

 勾选 Push Notifications 功能,点击配置证书按钮,进入配置证书页面。请注意开发证书的种类,开发证书供开发调试使用,生产证书供发布使用。

image.png


11.3 配置证书

 在 OSX 系统中点击“钥匙串访问”,生成请求证书。

image.png

 在证书信息中填入常用邮件地址,选择保存到磁盘。


image.png

 在上一节进入的配置证书页,点击 Continue。

image.png

 将刚刚生成的请求证书上传,点击 Generate。

image.png

 完成后下载并双击打开证书,会将证书自动导入钥匙串。在“钥匙串访问中”的“我的证书”里可以找到刚刚导入的证书。


11.4 导出推送所需 p12 文件

选择刚刚导进来的证书,选择右键菜单中的导出选项。

image.png

保存 p12 文件时,请设置密码,上传证书时需要填写密码。

image.png

image.png


11.5 登录容能云,上传p12 文件

打开https://i.ipower.cn,使用申请的用户名和密码登录,选择 appkey 对应的应用,点击“应用标识”选项。

image.png

 按图中所示,上传刚刚导出的 p12 文件。可以上传多个 p12 文件,以上传时所填入的证书名称做区分。开发环境或生产环境,请选择与该证书生成时相同的环境类型。


12 音视频聊天

容能云提供了音视频聊天功能;

目前音视频聊天支持单聊和群聊模式,不同模式下的视频编码质量有区别,单聊的质量高,对带宽要求高,群聊质量略低,对带宽要求低

启动音视频聊天的简要流程:

1、发起新聊天

2、注册相关监听,监听成员状态响应及会话状态

3、设置显示及相关初始化(设置surface、声音模式等)

4、启动音频/摄像头采集

5、关闭聊天

6、停止音频/视频采集,停止播放其余成员信息

7、释放相关资源

 

接收一个新聊天请求的简要流程:

1、监听到新聊天请求,解析请求参数,获取聊天信息,启动聊天邀请页面

2、用户选择接收聊天邀请

3、注册相关成员状态/会话监听

4、启动音频/视频采集和播放

5、接收到关闭聊天监听

6、停止音频、视频采集,停止播放成员信息释放相关资源


12.1 视频聊天各个通知

//提示需要登录音视频(AV)服务器信息
[RNSDKNotificationHelp addNotification: McAVNotifiLoginAVServer object:nil
 usingBlock:^(NSNotification *note) {}];
//收到新音视频聊天监听
[AVNotificationHelpaddNotification: RNMediaSDKNotificationNewCluster object:nil
 usingBlock:^(NSNotification *note) {}];
//收到音视频聊天被关闭的监听
[AVNotificationHelpaddNotification: RNMediaSDKNotificationCloseCluster object:nil
 usingBlock:^(NSNotification *note) {
}];
//聊天成员应答信息监听 
[AVNotificationHelpaddNotification: RNMediaNewClusterAllowNotifyAPI
object:nil usingBlock:^(NSNotification *note) {}];
//聊天成员聊天类型转换监听 
[AVNotificationHelpaddNotification: RNMediaClusterTypeSwitchNotifyAPI
object:nil usingBlock:^(NSNotification *note) {}];
//群聊成员增加监听 
[AVNotificationHelpaddNotification: RNMediaClusterNewMemberNotifyAPI
object:nil usingBlock:^(NSNotification *note) {}];
//群聊成员退出监听 
[AVNotificationHelpaddNotification: RNMediaClusterEraseMemberNotifyAPI
object:nil usingBlock:^(NSNotification *note) {}];
//群聊成员通话人数监听 
[AVNotificationHelpaddNotification: RNAVClusterUpdateNotifyAPI
object:nil usingBlock:^(NSNotification *note) {}];


12.2 登陆

在调用登录接口前,先简单说明一下,根据容能云音视频的设计框架,登录过程先要登录用户能力中心,获取到token后,再用token登录音视频能力以及MC消息中心。

特殊流程:

1. 非托管用户(此处指开发者)自己实现登录流程并向音视频能力以及MC消息中心分享token信息。

2. 自动登录时,使用token作为用户名+密码进行登录,token有效期通过后台进行设置。

3. 手动登录使用用户名+密码进行登录,自动只要token即可。


√ 手动登录:适用于第一次登录,或token过期失效以后执行

// 获取token和登录用户基本信息
[[[RNUSDK sharedSDK] userManager] loginUserWithUserName:userName andPassWord:password
 completion:^(RNUUser * _Nullable user, NSString * _Nullable token, NSError * _Nullable error) {
        [RNMediaSDK sharedSDK].userId = user.userId;
       
  }
}];


√ 自动登录:在安全的前提下,可以让用户的体验更好

[[[RNUSDK sharedSDK] userManager] autoLogin:token completion:^(RNUUser * _Nullable user,
 NSString * _Nullable token, NSError * _Nullable error) {}];

获取token后登录MediaSDK能力以及消息中心

[[[RNMediaSDK sharedSDK] loginManager] loginAVWithToken:token andUrl:serverUrl andPort:serverPort
 completion:^(NSError * _Nullable error) {}}];
[[McNotifyCenter shareInstance] loginWithToken:token andUrl:serverUrl andPort:serverPort
 completion:^(NSError * _Nullable error) {}}];


√ 登出

在其他控制器可以通过调用appDelegate的方法进行登出,调用方式是调用appDelegate对象的go2LoginVC方法。

#define TheApp      ([UIApplication sharedApplication])
#define TheAppDel  ((AppDelegate *)([UIApplication sharedApplication].delegate))
[TheAppDel go2LoginVC];

容能云IM踢人策略为:移动端(Android与Android,iOS与iOS,Android与iOS)只能有一个连接,移动端和桌面端可以共存。

如果需要login/logout,注意需要注册相关回调,及时反注册登录信息


12.3 发起新聊天请求

[[RNMediaSDK sharedSDK].mediaManager newCluster:self.callSession.inviterUserIds
  clusterType:self.callSession.clusterType groupId:@""
   completion:^(BOOL success, RNAVCallSession * _Nonnull callSession) {
            if (success) {
              //发起成功后调用自己允许通话接口 
                [[RNMediaSDK sharedSDK].mediaManager sendCluseterAllow:[RNMediaSDK sharedSDK].userId
                 p2pUuid:weakSelf.callSession.p2PUuid clusterAllowType:RNClusterAllowAccept
                  clusterType:weakSelf.callSession.clusterType completion:^(BOOL success) {
                   
                }];
               
                return ;
            }else
            {
            }
}];


12.4 接收新聊天请求

[[RNMediaSDK sharedSDK].mediaManager sendCluseterAllow:[RNMediaSDK sharedSDK].userId p2pUuid:self.callSession.p2PUuid
 clusterAllowType:RNClusterAllowAccept clusterType:self.callSession.clusterType
  completion:^(BOOL success) {}];


12.5 音视频数据流

√ 播放其他成员音频

[RNMediaSDK sharedSDK].mediaManager setSpeekerMode:YES];

√ 声音、视频采集

[RNMediaSDK sharedSDK].mediaManager startAudioCapture];
[RNMediaSDK sharedSDK].mediaManager startAudioCapture];

√ 设置用户所在的视频View,view为nil则移除

[RNMediaSDK sharedSDK].mediaManager
 setOtherVideoPreview:cell.headerImageView userId:model.userid];

√ 设置自身摄像头预览

[RNMediaSDK sharedSDK].mediaManager setSelfVideoPreview:cell.headerImageView];


12.6 停止聊天

√ 自己关闭通话

[RNMediaSDK sharedSDK].mediaManager closeCluster:self.callSession.p2PUuid
 completion:^(BOOL success) {}];

√ 被动停止(对方已挂断)

收到音视频聊天关闭的监听

[[NSNotificationCenter defaultCenter] addObserver:self
  selector:@selector(onAVCloseClusterNotify:)
   name:RNMediaSDKNotificationCloseCluster
    object:nil];

√ 释放相关资源

[[RNMediaSDK sharedSDK].mediaManager removeDelegate:self];
[self shouldStopAlertAndRing];
[[RNMediaSDK sharedSDK].mediaManager stopVideoCapture];
[[RNMediaSDK sharedSDK].mediaManager stopAudioCapture];
[[RNMediaSDK sharedSDK].mediaManager releaseAllAV];

 

12.7 设置听筒/免提模式

[RNMediaSDK sharedSDK].mediaManager setSpeekerMode:YES];


12.8 设置自身摄像头预览

启动视频录制前需要先指定用于摄像头预览的显示view,支持热切换view

[RNMediaSDK sharedSDK].mediaManager setSelfVideoPreview:父级的view];


12.9 设置他人视频显示

设置对方usrid以及要用于显示对方视频的view,支持热切换view

[RNMediaSDK sharedSDK].mediaManager setOtherVideoPreview: 父级的view userId:self.targetId];


12.10 启动摄像头录制

[RNMediaSDK sharedSDK].mediaManager startVideoCapture];


12.11 启动录音

[[RNMediaSDK sharedSDK].mediaManager startAudioCapture];


12.12 切换摄像头

[RNMediaSDK sharedSDK].mediaManager switchCamera];


12.13 音视频监听处理


通知类型

说明

适用范围

回调参数

RNMediaSDKNotificationNewCluster用于监听音视频聊天发起,可在监听处理中启动音视频聊天页面,开始聊天流程单聊+群聊RNAVCallSession
RNMediaSDKNotificationCloseCluster用于监听音视频聊天结束,监听被调用表示该聊天会话已结束,此时己方可关闭聊天单聊+群聊p2pUuid
RNMediaNewClusterAllowNotifyAPI用于监听音视频聊天成员对音视频请求的响应,有接受(Accept)、拒绝(Refuse)、忙(Busy)响应,以及用户接受邀请时重新指定的聊天类型(音频聊天/视频聊天)单聊+群聊

isAllow响应类型

allowUserId响应usrid

recvUserId

p2pUuid uuid

clusterType响应者聊天类型

RNMediaClusterTypeSwitchNotifyAPI用于监听音视频聊天成员的聊天类型(音频/视频)切换单聊+群聊

recvUserId

成员id

opUserId操作用户id

p2pUuid uuid

newClusterType:聊天类型(音频、视频)

RNMediaClusterNewMemberNotifyAPI用于监听群聊新成员加入群聊

opUserId操作用户id

recvUserId用户id

p2pUuid uuid

newMembersArray新增成员列表

RNMediaClusterEraseMemberNotifyAPI用于监听群聊成员退出,群聊成员被踢出/挂断都会触发该回调群聊

opUserId 操作用户id

recvUserId用户id

p2pUuid uuid

erasedMembersArray移除成员列表

RNAVClusterUpdateNotifyAPI用于监听己方音视频数据发送流量变化单聊+群聊

p2pUuid 通话id

treeNodesArray_Count人数 treeNodesArray成员信息


12.14 发起新聊天

发起人发起一个聊天会话时,指定对方usrList,以及聊天类型(单聊/群聊)、(音频/视频),创建成功后,服务器返回uuid,需要自身响应Accept,接受新的聊天

[[RNMediaSDK sharedSDK].mediaManager newCluster:self.callSession.inviterUserIds
  clusterType:self.callSession.clusterType groupId:@""
   completion:^(BOOL success, RNAVCallSession * _Nonnull callSession) {
            if (success) {
              //发起成功后调用自己允许通话接口 
                [[RNMediaSDK sharedSDK].mediaManager sendCluseterAllow:[RNMediaSDK sharedSDK].userId
                 p2pUuid:weakSelf.callSession.p2PUuid clusterAllowType:RNClusterAllowAccept
                  clusterType:weakSelf.callSession.clusterType completion:^(BOOL success) {
                   
                }];
               
                return ;
            }else
            {
            }
}];


12.15 响应聊天

指定目标聊天uuid,指定接受类型(Accept,Refuse,Busy),以及最终接受的聊天类型(音频/视频)

[[RNMediaSDK sharedSDK].mediaManager sendCluseterAllow:[RNMediaSDK sharedSDK].userId p2pUuid:self.callSession.p2PUuid
 clusterAllowType:RNClusterAllowAccept clusterType:self.callSession.clusterType
  completion:^(BOOL success) {}];


12.16 切换聊天类型

切换聊天类型,在音频/视频见切换,调用成功后通知其他成员AvChatTypeSwitch

[[RNMediaSDK sharedSDK].mediaManager switchClusterType:[RNMediaSDK sharedSDK].userId p2pUuid:self.callSession.p2PUuid
 clusterType:RNClusterTypeP2PAudio completion:^(BOOL success, NSDictionary * _Nonnull dic) {}];


12.17 添加聊天成员

仅群聊可用,用于聊天过程中添加新成员,调用成功后,av服务器想新成员发送增人通知

[RNMediaSDK sharedSDK].mediaManager inviteRemoteUsers:weakSelf.callSession.p2PUuid opUserId:[RNMediaSDK sharedSDK].userId
 newMembersArray:addUserIdList completion:^(BOOL success, NSDictionary * _Nonnull dic) {}];


12.18 移除聊天成员

仅群聊可用,指定目标uuid以及要移除的成员列表,调用成功后,av服务器将目标成员移除,并通知其余成员减人通知

[[RNMediaSDK sharedSDK].mediaManager eraseRemoteUsers:self.callSession.p2PUuid opUserId:[RNMediaSDK sharedSDK].userId
 erasedMembersArray:@[[RNMediaSDK sharedSDK].userId]
  completion:^(BOOL success, NSDictionary * _Nonnull dic){}];


12.19 关闭聊天

关闭指定聊天会话,调用成功后通知其余成员通知关闭

[[RNMediaSDK sharedSDK].mediaManager closeCluster:self.callSession.p2PUuid
 completion:^(BOOL success) {}];


12.20 停止摄像头录制

RNMediaSDK sharedSDK].mediaManager stopVideoCapture];


12.21 停止录音

该调用将停止录音采集,调用成功后他人无法接收到音频数据

[RNMediaSDK sharedSDK].mediaManager stopAudioCapture];


12.22 停止播放他人AV

[RNMediaSDK sharedSDK].mediaManager releaseAllAV];