http://www.ox-holdings.com

CallKit 是融云音视频通话功能的 UI新匍京a奥门: 界面 SDK,服务于需要根据自己的产品去自己实现界面的开发者

摘要融云即时通讯云SDK新版发布,本次发布的版本为: Android 2.6.4 Stable、iOS 2.6.4 Stable,此次更新解决了若干bug和优化。发布的版本Android 2.6.4 Stable、iOS 2.6.4 Stable,更新时间为:2016年6月28日。iOS 2.6.4 Stable更新内容1、配合融云的 IM 软件 SealTalk 的发布,对 IMKit 的 UI 进行了一些细节优化,增强了一些体验。不影响您的客户使用。2、优化了草稿在会话列表中的显示。3、优化了聊天室拉取大量消息时的响应速度。4、增加了一个错误码 30015 (RC_CONN_OVERFREQUENCY),如果频繁的调用 connect,会返回此错误码。您只需要调用 connect 函数一次即可。Android 2.6.4 Stable更新内容1、配合融云的 IM 软件 SealTalk 的发布,对 IMKit 的 UI 进行了一些细节优化,增强了一些体验。不影响您的客户使用。2、优化了草稿在会话列表中的显示。3、优化了地理位置信息缩略图的显示效果。4、增加了一个错误码 30015 (RC_CONN_OVERFREQUENCY),如果频繁的调用 connect,会返回此错误码。您只需要调用 connect 函数一次即可。下载地址请从以下官网地址下载:

其他

1.1.4:融云 Call 通讯能力库 - RongCloud CallLib

摘要融云即时通讯云SDK新版发布,本次发布的版本为: Android 2.6.3 Stable、iOS 2.6.3 Stable,此次更新属小幅更新版本。发布的版本Android 2.6.3 Stable、iOS 2.6.3 Stable。iOS 2.6.3 Stable更新内容1、优化重连逻辑,增强网络连接的可靠性。2、修改了一些小的的 UI 问题。Android 2.6.3 Stable更新内容1、增加了音视频功能国际化。2、修改了在某个国产机型上 Push 启动失败的问题。下载地址请从以下官网地址下载:

会话实体类

RCConversation 是会话实体类,首先您需要充分的了解 Conversation(会话) 和 Message(消息) 两个实体类的关系。

会话实体类和消息实体类是用来存储本地会话和消息的容器类,除了包含会话内容和消息内容外,还包括了保存在本地的各种状态,您在客户端读取消息时,获取的对象都和这两个类相关。会话有多种类型,可以是私聊会话,也可以是群组会话等,每一个 Conversation(会话)包含多条 Message(消息),关系如下图所示:

新匍京a奥门 1

通过 conversationType 和 targetId,可以唯一确定一个会话。ConversationType 枚举值意义和对应的 targetId 意义为:

会话类型枚举 ConversationType 说明 对应的 targetId
PRIVATE 单聊 用户的 Id(userId)。
GROUP 群组 群组的 Id(groupId)。
DISCUSSION 讨论组 讨论组的 Id(discussionId)。
CHATROOM 聊天室 聊天室的 Id(chatroomId)。
CUSTOMER_SERVICE 客服 客服的 Id(customerServiceId)。
SYSTEM 系统会话 系统账户 Id。可以理解为 QQ 的 10000 号的角色。
APP_PUBLIC_SERVICE 应用公众服务 应用公众服务的 Id(publicServiceId)。
PUBLIC_SERVICE 公众服务 公众服务的 Id(publicServiceId)。

请注意区分会话类型和消息类型,会话类型是针对会话的分类,不同的会话类型决定了不同的会话逻辑。

 

另:系统会话类型并不一定代表是“系统消息”,本质上与单聊会话类型没有区别,只是逻辑上做了不同的区分,便于展开不同的产品业务逻辑。

通过一个 conversationType 和 targetId 组合,您可以确定一个唯一的会话。如当您需要发起单聊会话时,您需要传入 ConversationType_PRIVATE 和 userId,当您需要发起群组聊天时,您需要传入 ConversationType_GROUP 和 groupId,当您需要发起讨论组会话时,您需要传入 ConversationType_DISCUSSION 和 discussionId。

消息展示自定义

融云 IMKit SDK 中每一种消息类型(要在 UI 展示的)都对应一个 UI 展示的 Provider,开发者可以修改 Provider 的注解属性来完成消息显示的自定义。

2.2:解决方案

上面问题的根源是头像和姓名这些数据从哪里来? 显然必须用接口从我们自己服务器去获取 ,但是考虑到不能频繁请求接口调相同数据 ,所以APP必须建立数据库,把基本信息存储到本地。为了方便管理和增加可读性,在项目中我创建WMRCDataManager文件来管理 数据存储问题。(其实融云本地是做了自己的数据库,但是不提供给给我们方法。)

单例类的创建

+(WMRCDataManager *) shareManager;

 //userInfoDataSource的代理回调

- (void)getUserInfoWithUserId:(NSString*)userId completion:(void (^)(RCUserInfo*))completion;

微脉数据存储机制如图:

新匍京a奥门 2

微脉数据存储机制图

内置状态类消息

创建应用

您要进行应用开发之前,需要先在融云开发者平台创建应用。如果您已经注册了融云开发者帐号,请前往融云开发者平台创建应用。

您创建完应用后,首先需要了解的是 App Key / Secret,它们是融云 SDK 连接服务器所必须的标识,每一个 App 对应一套 App Key / Secret。针对开发者的生产环境和开发环境,我们提供两套 App Key / Secret,两套环境的功能完全一致。您在应用最终上线前,使用开发环境即可。

新匍京a奥门 3

App Key / Secret 位置

开发环境 App Key / Secret 是专门为您提供的仅供开发使用的,开发环境将和生产环境的数据隔离,避免开发环境数据和线上生产环境数据互相冲突。 

生产环境的 App Key / Secret 默认先不提供,等您提交上线后,我们会提供生产环境的 App Key / Secret。

1.1.3:融云 Call 界面组件 - RongCloud CallKit

CallKit 是融云音视频通话功能的 UI 界面 SDK。(基于RongCloud CallLib)包含了单人、多人音视频通话的界面的各种场景和功能。可以快速的集成 CallKit 来实现丰富的音视频通话界面,并进行 UI 定制开发。同时开源了 CallKit,您可以根据您的需要去使用。

对方正在输入状态消息

用来发送对方正在输入时的状态消息,不存储、不计数。

消息类名:RCTypingStatusMessage

消息 ObjectName:RC:TypSts

消息的结构:{"typingContentType":"RC:TxtMsg"}

typingContentType 为正在输入消息类型。

头像位置自定义

对于会话列表中每种会话类型的会话,开发者都可以自定义头像位置的显示方式,显示方式有:靠左显示、靠右显示、不显示。

自定义步骤:

1、新建一类继承要改变的会话提供者类,然后重写注解,修改 portraitPosition 的值以完成显示方式。

  • 注解说明:

注解名称:ConversationProviderTag。属性:conversationType ,portraitPosition 。

conversationType 的值不能重复不可修改,它是会话提供者的唯一标识;portraitPosition 用来控制头像的显示方式,它的值可以修改,它的值有:1:靠左显示, 2:靠右显示, 3:不显示。

  • 模板说明:
提供者名称 类名 注解 conversationType 值
(不可修改)
注解 portraitPosition 
初始值 (可修改)
二人会话提供者 PrivateConversationProvider.java private 1
讨论组会话提供者 DiscussionConversationProvider.java discussion 1
群聊会话提供者 GroupConversationProvider.java group 1
客服会话提供者 CustomerServiceConversationProvider.java customer_service 1
系统会话提供者 SystemConversationProvider.java system 1
应用公众服务会话提供者 AppServiceConversationProvider.java app_public_service 1
公众服务平台会话提供者 PublicServiceConversationProvider.java public_service 1

2、重新注册该会话模板,注册方法应在 init 后调用

RongIM.getInstance().registerConversationTemplate;

自定义示例:

如何在会话列表中让所单聊会话头像都靠右显示?

第一步:

@ConversationProviderTag(conversationType = "private", portraitPosition = 2)

public class MyPrivateConversationProvider extends PrivateConversationProvider {
  ...
}

第二步:

RongIM.getInstance().registerConversationTemplate(new MyPrivateConversationProvider());

注:在 init 后调用。

1.1.1:融云 IM 界面组件 - RongCloud IMKit

IMKit 是融云 SDK 的核心特色之一。融云将即时通讯产品中最复杂的会话列表、聊天窗口、消息内容展现、会话设置等功能封装为组件,通过简短的代码,就可以直接将以上界面集成到App 产品中,省去大量的开发调试时间。融云同时支持业内最丰富的自定义界面组件功能,我们可以针对自己界面需求自由设计开发。

群组通知消息

用来发送群组操作的通知消息。

消息类名:RCGroupNotificationMessage

消息 ObjectName:RC:GrpNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"operatorUserId":"4324","operation":"Rename","data":"本地生活","message":"修改本群名为本地生活","extra":""}

其中 operatorUserId 为操作人用户 Id,operation 为操作名,data 为操作数据如:目标用户 Id 或修改后群名称,详细可参见内置消息类型说明,message 为消息内容,extra 可以放置任意的数据内容,也可以去掉此属性。

新建 Activity
public class ConversationActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.conversation);
    }

}

1.3.2:登录方法:Token令牌登录方式 注:token是从我们自己服务器获取(属于服务与融云的交互)

[[RCIM sharedRCIM] connectWithToken:loginModel.RongCloudToken success:^(NSString *userId) {

     } error:^(RCConnectErrorCode status) {

         NSLog(@"登陆的错误码为:%ld", (long)status);

    } tokenIncorrect:^{

        NSLog(@"token错误");

    }];

消息类

MessageContent 是消息类,他也是所有消息的基类,文本、图片等消息都继承于它,如您要自定义消息,也要继承它实现。

消息类不同于消息实体类(RCMessage),消息类代表一条具体的消息内容,消息实体类是消息类的外层容器,消息实体对象是消息对象在本地存储的外层对象,消息实体对象除了包含消息对象外,还包括消息的方向、接收状态、接收时间、发送者等。

每一条消息内容都一个标示符(Identifier),用来标识自己的类型,该标示符必须唯一。消息内容类的重要函数是 encode ,每一个消息都需要实现自己的 encode 方法来封装消息内容。

当前版本的消息分两种,普通的内容类消息,和通知类消息,接下来将分别仔细介绍。

消息分类 消息行为状态标识
内容类消息 表示一个用户间发送的包含具体内容的消息,需要展现在聊天界面上,如文字消息、语音消息等。
通知类消息 表示一个通知信息,可能展现在聊天界面上,如提示条通知。

配置会话列表

融云 IMKit SDK 使用了 Fragment 作为会话列表和会话界面的组件,其优点是支持各种嵌套方式,更符合您的定制化需求。 下面说明如何在 Activity 里以静态方式加载融云 Fragment.

 1.1:融云的分类(简介)

IMLib 体系架构

首先介绍 IMLib 的体系,对于真正使用融云 SDK 的用户,不管您选择 IMLib 还是 IMKit,您都需要了解一下体系概念。

新匍京a奥门 4

融云 IMLib 体系架构

IMLib 的命名规则,在 iOS 上是 RCIMClient,在 Android 上是 RongIMClient。这是为了符合两个平台的命名习惯。

红包

注意事项:融云 SDK 的 IM 红包功能是由一路魔方科技提供的服务,若您的 App 之前已集成过一路魔方的红包 SDK,为了保证两个平台数据兼容和一致性,请提交工单咨询帮助,感谢您的配合。 
点击查看红包使用说明书及红包业务常见问题。 
您可以在开发者后台-数据统计-红包统计中查看红包的数据统计情况。

1、 融云官网提供 RedPacket Module 下载,开发者需要在自己应用的 build.gradle 文件中添加依赖 compile project(':RedPacket')。

2、 SDK 会默认加载红包模块,并在私人、群组会话 "+" 号区域出现红包插件(暂不支持其他会话类型)。

3、 开发者需要实现 RongIM#setGroupMembersProvider(IGroupMembersProvider) 方法,用于红包功能中展示群组成员信息。

4、 红包模块提供如下接口,进入"我的钱包"界面:

/**
 * 进入我的钱包页面
 * @param activity :从哪个activity的跳转
 */
JrmfClient.intentWallet(Activity activity);

1.3.3 :登录前所需做的事情(主要是RCIM 这个单例类的一些方法 用来设置一些全局变量)

//全局的导航按钮字体颜色

[RCIM sharedRCIM].globalNavigationBarTintColor = [UIColor blackColor];

//聊天界面中显示的头像大小

'[RCIM sharedRCIM].globalMessagePortraitSize = CGSizeMake(46, 46);

 [RCIM sharedRCIM].globalMessageAvatarStyle = RC_USER_AVATAR_CYCLE;

//聊天界面中显示的头像形状,矩形或者圆形

 [RCIM sharedRCIM].globalConversationAvatarStyle=RC_USER_AVATAR_CYCLE;

//设置接收消息代理

 [RCIM sharedRCIM].receiveMessageDelegate=self;

  [RCIM sharedRCIM].userInfoDataSource=self;

//设置IMKit连接状态的监听器

[RCIM sharedRCIM].connectionStatusDelegate=self;

消息实体类

RCMessage 是消息实体类,消息实体类是消息类的外层容器,消息实体对象是消息对象在本地存储的外层对象,消息实体对象封装了消息的基本信息如类型、 ID、消息的方向、接收状态、接收时间、发送者等。您可能需要先了解其中两个成员参数的概念。

objectName

代表消息内容的类型,是一个标示符(Identifier),融云内置消息类型以 RC: 开头,如 RC:TxtMsg,RC:ImgMsg,RC:VcMsg 等。

content

消息类,一个 RCMessageContent 类型的对象,代表着实际的消息。

会话界面操作的监听器

会话界面操作的监听器,在调用 init 后即可进行设置。

/**
* 设置会话界面操作的监听器。
*/
RongIM.setConversationBehaviorListener(new MyConversationBehaviorListener());

实现会话界面操作的监听接口 ConversationBehaviorListener 。会话界面中点击用户头像、长按用户头像、点击消息、长按消息的操作都在此处理。

private class MyConversationBehaviorListener implements RongIM.ConversationBehaviorListener{

  /**
  * 当点击用户头像后执行。
  *
  * @param context           上下文。
  * @param conversationType  会话类型。
  * @param userInfo          被点击的用户的信息。
  * @return 如果用户自己处理了点击后的逻辑,则返回 true,否则返回 false,false 走融云默认处理方式。
  */
  @Override
  public boolean onUserPortraitClick(Context context, Conversation.ConversationType conversationType, UserInfo userInfo) {
     return false;
  }

  /**
  * 当长按用户头像后执行。
  *
  * @param context          上下文。
  * @param conversationType 会话类型。
  * @param userInfo         被点击的用户的信息。
  * @return 如果用户自己处理了点击后的逻辑,则返回 true,否则返回 false,false 走融云默认处理方式。
  */
  @Override
  public boolean onUserPortraitLongClick(Context context, Conversation.ConversationType conversationType, UserInfo userInfo) {
     return false;
  }

  /**
  * 当点击消息时执行。
  *
  * @param context 上下文。
  * @param view    触发点击的 View。
  * @param message 被点击的消息的实体信息。
  * @return 如果用户自己处理了点击后的逻辑,则返回 true, 否则返回 false, false 走融云默认处理方式。
  */
  @Override
  public boolean onMessageClick(Context context, View view, Message message) {
     return false;
  }

  /**
  * 当长按消息时执行。
  *
  * @param context 上下文。
  * @param view    触发点击的 View。
  * @param message 被长按的消息的实体信息。
  * @return 如果用户自己处理了长按后的逻辑,则返回 true,否则返回 false,false 走融云默认处理方式。
  */
  @Override
  public boolean onMessageLongClick(Context context, View view, Message message) {
     return false;
  }
  /**
   * 当点击链接消息时执行。
   *
   * @param context 上下文。
   * @param link    被点击的链接。
   * @return 如果用户自己处理了点击后的逻辑处理,则返回 true, 否则返回 false, false 走融云默认处理方式。
   */
  @Override
  public boolean onMessageLinkClick(Context context, String link) {
      return false;
  }
}

3:聊天列表UI和聊天UI的自定义

前言:每一个产品都有一个自己风格和需求,所以融云的聊天列表的UI和聊天详情的UI基本上满足不了微脉的需求。这里自定义UI的实现就很有必要了。

核心类

RCIMClinet 是 IMLib 的核心类,您可以直接使用它的方法,如 init,connect,setdevicetoken,sendMessage, sendImageMessage 等。您需要详细的了解所有接口的用法,请参考 API 文档。

前期准备

1.2.1:通过 CocoaPods 导入管理依赖库(一般建议选用这个,不用手动管理依赖库,并且升级方便)

内置通知类消息

图片消息发送

默认图片消息发送

获取 ImageMessage 实例

/**
 * 生成ImageMessage对象。
 *
 * @param thumUri  缩略图地址。
 * @param localUri 大图地址。
 * @param isFull 是否发送原图。
 * @return ImageMessage对象实例。
 */
public static ImageMessage obtain(Uri thumUri, Uri localUri, boolean isFull)

发送图片消息

/**
 * <p>根据会话类型,发送图片消息。</p>
 *
 * @param type        会话类型。
 * @param targetId    目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
 * @param content     消息内容,例如 {@link TextMessage}, {@link ImageMessage}。
 * @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
 *                    如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
 *                    如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
 * @param pushData    push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
 * @param callback    发送消息的回调。
 */
RongIM.getInstance().sendImageMessage(Conversation.ConversationType.PRIVATE, "9517", imgMsg, null, null, new RongIMClient.SendImageMessageCallback() {

        @Override
        public void onAttached(Message message) {
                //保存数据库成功
        }

        @Override
        public void onError(Message message, RongIMClient.ErrorCode code) {
                //发送失败
        }

        @Override
        public void onSuccess(Message message) {
                //发送成功
        }

        @Override
        public void onProgress(Message message, int progress) {
                //发送进度
        }
});

上面的方法是 SDK 默认发送图片的方法,图片会存储到七牛,默认保存一个月。

发送图片消息并且上传到自己的服务器

构造消息实例

ImageMessage imageMessage = ImageMessage.obtain(thumbPathUri, localPathUri);
Message message = Message.obtain(targetId, conversationType, imageMessage);

调用下面的方法发送图片消息

/**
 * <p>发送图片消息,可以使用该方法将图片上传到自己的服务器发送,同时更新图片状态。</p>
 * <p>使用该方法在上传图片时,会回调 {@link io.rong.imlib.RongIMClient.SendImageMessageWithUploadListenerCallback}
 * 此回调中会携带 {@link RongIMClient.UploadImageStatusListener} 对象,使用者只需要调用其中的
 * {@link RongIMClient.UploadImageStatusListener#update(int)} 更新进度
 * {@link RongIMClient.UploadImageStatusListener#success(Uri)} 更新成功状态,并告知上传成功后的图片地址
 * {@link RongIMClient.UploadImageStatusListener#error()} 更新失败状态 </p>
 *
 * @param message     发送消息的实体。
 * @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
 *                    如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
 *                    如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
 * @param pushData    push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
 * @param callback    发送消息的回调,回调中携带 {@link RongIMClient.UploadImageStatusListener} 对象,用户调用该对象中的方法更新状态。
 *                    {@link #sendImageMessage(Message, String, String, RongIMClient.SendImageMessageCallback)}
 */
 RongIM.getInstance().sendImageMessage(message, pushContent, pushData, new RongIMClient.SendImageMessageWithUploadListenerCallback() {

     @Override
     public void onAttached(Message message, final RongIMClient.UploadImageStatusListener uploadImageStatusListener) {
         /*上传图片到自己的服务器*/
         uploadImg(imgMsg.getPicFilePath(), new UploadListener() {
             @Override
             public void onSuccess(String url) {
                 // 上传成功,回调 SDK 的 success 方法,传递回图片的远端地址
                 uploadImageStatusListener.success(Uri.parse(url));
             }


             @Override
             public void onProgress(float progress) {
                 //刷新上传进度
                 uploadImageStatusListener.update((int) progress);
             }


             @Override
             public void onFail() {
                 // 上传图片失败,回调 error 方法。
                 uploadImageStatusListener.error();
             }
         });
     }


     @Override
     public void onError(Message message, RongIMClient.ErrorCode errorCode) {
         //发送失败
     }


     @Override
     public void onSuccess(Message message) {
         //发送成功
     }


     @Override
     public void onProgress(Message message, int progress) {
         //发送进度
     }
 });

注:图片消息包括两个主要部分:缩略图和大图,缩略图直接 Base64 编码后放入 content 中,大图首先上传到文件服务器(融云 SDK 中默认上传到七牛云存储,图片有效期为 1 个月。),然后将云存储上的大图地址放入消息体中。

图片缩略图机制:

缩略图尺寸为:240 x 240 像素,以宽度和高度中较长的边不超过 240 像素等比压缩。

大图尺寸为:960 x 960 像素,以宽度和高度中较长的边不超过 960 像素等比压缩。

 2.3:延伸新问题

这样做的弊端:如果对方刷新信息,而前端已经缓存了消息,此时不会再次网络请求,导致数据跟新不及时。

解决方案:根据研究QQ和微信发现他们的数据跟新是在进入聊天页面或者查看他们的信息的时候。所以暂定解决办法是,在每一次进入聊天页面时候获取一下对方最新信息。然后跟新本地数据库数据。(弊端:调用接口的次数还是很多。从性能上讲不合理。不过我们的产品暂时没有这方面的需求,所以没做)

联系人(好友)通知消息

RCContactNotificationMessage。用来发送联系人操作(加好友等)的通知消息。

消息类名:RCContactNotificationMessage

消息 ObjectName:RC:ContactNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"operation":"Request","sourceUserId":"123","targetUserId":"456","message":"我是小艾,能加一下好友吗?","extra":""}

其中 operation 为联系人操作的指令,sourceUserId 为发出通知的用户 Id,targetUserId 为接收通知的用户 Id,message 为通知附带的消息内容,extra 可以放置任意的数据内容,也可以去掉此属性。

官方针对 operation 属性定义了 "Request", "AcceptResponse", "RejectResponse" 几个常量,也可以由开发者自行扩展。

图文消息发送

生成图文消息实例:

/**
 * 生成RichContentMessage对象。
 *
 * @param title    消息标题。
 * @param content  消息内容。
 * @param imageUrl 消息图片url.
 * @return 生成RichContentMessage对象。
 */
public static RichContentMessage obtain(String title, String content, String imageUrl)

发送消息

RichContentMessage richContentMessage = RichContentMessage.obtain("标题", "内容", "http://rongcloud.cnlogo.png");

//"9517" 为目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
//Conversation.ConversationType.PRIVATE 为会话类型。
Message myMessage = Message.obtain("9517", Conversation.ConversationType.PRIVATE, richContentMessage);

/**
 * <p>发送消息。
 * 通过 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}
 * 中的方法回调发送的消息状态及消息体。</p>
 *
 * @param message     将要发送的消息体。
 * @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
 *                    如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
 *                    如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
 * @param pushData    push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
 * @param callback    发送消息的回调,参考 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}。
 */
RongIM.getInstance().sendMessage(myMessage, null, null, new IRongCallback.ISendMessageCallback() {
  @Override
  public void onAttached(Message message) {
    //消息本地数据库存储成功的回调
  }

  @Override
  public void onSuccess(Message message) {
    //消息通过网络发送成功的回调
  }

  @Override
  public void onError(Message message, RongIMClient.ErrorCode errorCode) {
    //消息发送失败的回调
  }
});

1.3:融云的登录

iOS SDK 体系架构

本文档将详细介绍融云的 SDK 产品架构和消息体系,以便于您更深入的了解融云并更快速的开发自己的产品。

新匍京a奥门 5

融云 SDK 系统架构

IMKit

IMKit 的功能主要是封装各种界面对象,服务于开发者快速实现自己的产品,主要特点是是支持快速集成,支持丰富的界面定制功能。

IMLib

IMLib 的功能是提供基本通信能力库,封装了通信能力和 Conversation,Message 等各种对象,服务于需要根据自己的产品去自己实现界面的开发者。主要特点是封装清晰,轻量,便于使用。

Protocol

Protocol 是融云的核心协议栈,使用融云自定义的私有二进制协议。主要特点是是轻量化,有序可靠,不丢消息。Protocol 部分使用 Native 语言开发,在 Android 和 iOS 平台上保证业务一致性,便于开发者商用化自己的产品。

获取 Token

Token 称为用户令牌,App Key 是您的 App 的唯一标识,Token 则是您 App 上的每一个用户的身份授权象征。您可以通过提交 userId 等信息来获得一个该用户对应的 Token,并使用这个 Token 作为该用户的唯一身份凭证与其他用户进行通信。

Token 的主要作用是身份授权和安全,因此不能通过客户端直接访问融云服务器获取 Token,您必须通过 Server API 从融云服务器 获取 Token 返回给您的 App,并在之后连接时使用。详细描述请参考 Server 开发指南中的用户服务和获取 Token 方法小节。

为了方便您在集成和测试过程中使用,我们还提供了 API 调试工具,在您不能部署服务器程序时,可以直接通过传入 userId 和 name 来获得 Token。请访问融云开发者平台,打开您想测试的应用,在左侧菜单中选择“API 调试”即可。

  • userId : 每一个用户对应一个 userId,这个 userId 是您维护的,所以您可以直接赋值,两个您的的用户通信,对于融云来说就是两个 userId 间通讯。
  • name : 用户的显示名称,用来在 Push 推送时,或者您没有传入用户信息时,默认显示的用户名称。
  • portraitUri : 用户头像,用来当您没有传入用户信息时作为默认头像,如果图片不存在,IMKit 会显示默认头像。

通过 API 调试,您可以得到一个 Token 返回值。您就可以直接使用这个 Token 为这位用户进行发送和接受消息。

3.1.1:我们项目中聊天列表WMConversationListViewController 是在继承RCConversationListViewController视图的基础上创建的。这里有可能你会问:为什么不自己写一个界面,不集成他们的界面?原因如下:虽然我们的视图展示改变了,但是依然需要使用这个界面的刷新逻辑(相对而言,工作量小,效率高)。

自定义列表cell需要调用下面四个方法

 即将加载列表数据源的回调,这个方法很必要是一个转换数据类型的功能,起桥接作用

@param dataSource  即将加载的列表数据源(元素为RCConversationModel对象)

@return        修改后的数据源(元素为RCConversationModel对象)

@discussion 您可以在回调中修改、添加、删除数据源的元素来定制显示的内容,会话列表会根据您返回的修改后的数据源进行显示。

数据源中存放的元素为会话Cell的数据模型,即RCConversationModel对象。

-(NSMutableArray *)willReloadTableData:(NSMutableArray *)dataSource{

for (int i=0; i<dataSource.count ; i++){

RCConversationModel *model = dataSource[i];

if(model.conversationType == ConversationType_PRIVATE){

// 会话Cell数据模型的显示类型 转化为自定义类型

model.conversationModelType = RC_CONVERSATION_MODEL_TYPE_CUSTOMIZATION;

}

}

return dataSource;

}

自定义会话Cell显示时的回调

-(RCConversationBaseCell *)rcConversationListTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

//拿到数据源

RCConversationModel *model = self.conversationListDataSource[indexPath.row];

//注册cell

WMRCChatListCell *cell = (WMRCChatListCell *)[[WMRCChatListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"WMRCChatListCell"];

//中间cell上控件的赋值这里省略

return cell;

}

自定义会话Cell显示时的回调

-(CGFloat)rcConversationListTableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

//返回cell高度

return kCellHeight;

}

左滑删除自定义会话时的回调

- (void)rcConversationListTableView:(UITableView *)tableView

commitEditingStyle:(UITableViewCellEditingStyle)editingStyle

forRowAtIndexPath:(NSIndexPath *)indexPath {

'[[RCIMClient sharedRCIMClient] removeConversation:model.conversationType targetId:model.targetId];

''  [[RCIMClient sharedRCIMClient]clearMessages:ConversationType_PRIVATE targetId:model.targetId];

}

3.1.2:第一个方法很关键。他是一个转换的功能,可以把指定的一类消息转换为自定义消息类型。例如:把单聊类型转化为自定义类型。

3.1.3:然后在cellForRowAtIndexPath方法中直接,创建cell。然后给cell上的控件赋值。(这里的数据从哪里来?)这个时候就开始调用WMRCDataManager 类的getUserInfoWithUserId这个方法从本地获取数据,(这里本地如果没有数据,我会从服务接口去拿,然后缓存到本地,这样就不用么一次都调用接口,给服务端怎成压力了。)

WMRCChatListCell *cell = (WMRCChatListCell *)[[WMRCChatListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"WMRCChatListCell"];

3.1.4:数据展示完了,我们直接调用heightForRowAtIndexPath的方法把cell的高展示出来。

3.1.5:commitEditingStyle用来左滑删除单个会话列表的,这里有两种删除意思:1:从列表中删除这个记录,但是聊天消息并不删除依然在本地存储。

2:列表删除并把聊天记录一并删除。

[[RCIMClient sharedRCIMClient] removeConversation:model.conversationType targetId:model.targetId];

[[RCIMClient sharedRCIMClient]clearMessages:ConversationType_PRIVATE targetId:model.targetId];

自此自定义聊天列表已经按照要求满足我们微脉的需求。

3.2:聊天页面UI的自定义

这一块项目上暂时还未实现。私下已经走通了简单消息的自定义。

3.2.1自定义消息类—WMRCRichMessage 必须继承与RCMessageContent 。这样这一条消息才会储并计入未读消息数。

//声明一个标志

#define    WMRCRichMessageTypeIdentifier @"RCD:WMRichMsg"

3.2.2 在融云注册之前先注册消息类型(申明此类的存在)

// 注册自定义测试消息 是消息类型

//RCDTestMessage

 [[RCIM sharedRCIM] registerMessageType:[RCDTestMessage class]];

3.2.3自定义cell—WMRCRichMessageCell 必须继承与RCMessageCell 。这样这cell才能展示用户信息和内容的消息。而且这类cell在注册时候必须和RCDTestMessage消息进行绑定。如下:

[self registerClass:[RCDTestMessageCell class] forCellWithReuseIdentifier:RCDTestMessageTypeIdentifier];

3.2.4参照聊天列表页面UI的自定义 实现以下三个方法

注册自定义消息的Cell

@param cellClass  自定义消息的类,该自定义消息需要继承于RCMessageContent

@param identifier  自定义消息Cell的唯一标示符

@discussion 聊天界面在显示时需要通过identifier唯一标示来进行Cell重用,以提高性能。

我们建议您在identifier中添加前缀,请勿使用"rc"前缀的字符串,以免与融云内置消息的Cell冲突。

- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;

自定义消息Cell显示的回调

@param collectionView  当前CollectionView

@param indexPath      该Cell对应的消息Cell数据模型在数据源中的索引值

@return                自定义消息需要显示的Cell

@discussion 自定义消息如果需要显示,则必须先通过RCIM的registerMessageType:注册该自定义消息类型,

并在聊天界面中通过registerClass:forCellWithReuseIdentifier:注册该自定义消息的Cell,否则将此回调将不会被调用。

- (RCMessageBaseCell *)rcConversationCollectionView:(UICollectionView *)collectionView

cellForItemAtIndexPath:(NSIndexPath *)indexPath;

自定义消息Cell显示的回调

@param collectionView          当前CollectionView

@param collectionViewLayout    当前CollectionView Layout

@param indexPath              该Cell对应的消息Cell数据模型在数据源中的索引值

@return                        自定义消息Cell需要显示的高度

@discussion 自定义消息如果需要显示,则必须先通过RCIM的registerMessageType:注册该自定义消息类型,

并在聊天界面中通过registerClass:forCellWithReuseIdentifier:注册该自定义消息的Cell,否则将此回调将不会被调用。

- (CGSize)rcConversationCollectionView:(UICollectionView *)collectionView

layout:(UICollectionViewLayout *)collectionViewLayout

sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

4:总结

第三方接入,本身的难度有限,但是为了满足产品的逻辑去修改第三方的本身逻辑是最蛋疼的事情。解决问题的关键是:看文档,看官方demo,多尝试。

讨论组通知消息

用来发送讨论组操作的通知消息。

消息类名:RCDiscussionNotificationMessage

消息 ObjectName:RC:DizNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"type":1,"extension":"3213,4332","operator":"5435"}

其中 type 为讨论组操作类型 1:加入讨论组 2:退出讨论组 3:讨论组改名 4:讨论组管理员踢人,extension 为被加入讨论组用户 Id,多个用户 Id 以逗号分割,operator 为当前操作用户 Id。

连接服务器

连接服务器前,确认已通过融云 Server API 接口获取 Token。

connect() 方法在整个应用只需要调用一次,且必须在主进程调用。如果连接失败, SDK 会自动启动重连机制,进行最多10次重连,分别是1, 2, 4, 8, 16, 32, 64, 128, 256, 512秒后。如果仍然没有连接成功,还会在检测网络状态变化时再次重连。应用不需要做额外的重连操作。

/**
 * <p>连接服务器,在整个应用程序全局,只需要调用一次,需在 {@link #init(Context)} 之后调用。</p>
 * <p>如果调用此接口遇到连接失败,SDK 会自动启动重连机制进行最多10次重连,分别是1, 2, 4, 8, 16, 32, 64, 128, 256, 512秒后。
 * 在这之后如果仍没有连接成功,还会在当检测到设备网络状态变化时再次进行重连。</p>
 *
 * @param token    从服务端获取的用户身份令牌(Token)。
 * @param callback 连接回调。
 * @return RongIM  客户端核心类的实例。
 */
private void connect(String token) {

    if (getApplicationInfo().packageName.equals(App.getCurProcessName(getApplicationContext()))) {

        RongIM.connect(token, new RongIMClient.ConnectCallback() {

            /**
             * Token 错误。可以从下面两点检查 1.  Token 是否过期,如果过期您需要向 App Server 重新请求一个新的 Token
             *                  2.  token 对应的 appKey 和工程里设置的 appKey 是否一致
             */
            @Override
            public void onTokenIncorrect() {

            }

            /**
             * 连接融云成功
             * @param userid 当前 token 对应的用户 id
             */
            @Override
            public void onSuccess(String userid) {
                Log.d("LoginActivity", "--onSuccess" + userid);
                startActivity(new Intent(LoginActivity.this, MainActivity.class));
                finish();
            }

            /**
             * 连接融云失败
             * @param errorCode 错误码,可到官网 查看错误码对应的注释
             */
            @Override
            public void onError(RongIMClient.ErrorCode errorCode) {

            }
        });
    }
}

 2.1 :遗留问题

在第一个阶段聊天的时候,你会发现在聊天列表界面只能显示出未读消息和未读消息的数目以及时间。聊天人的姓名和头像却是看不见的。

原因是因为:融云本身作为IM实现的工具,不做这些数据的传输和保存(猜测:1,毕竟需要耗流量,能省则省。2,不参与到app逻辑,需求太多满足不了)。所以这两个基本数据的存储,展示和跟新落就理所当然的落到了我们APP自己身上(包括后期产品需要自定义UI数据的展示 ,—后面这个问题涉及到自定义聊天列表了,不在这里讨论了)。

图片消息类

RCImageMessage。用来发送图片类消息。

消息类名:RCImageMessage

消息 ObjectName:RC:ImgMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"content":"bhZPzJXimRwrtvc=","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","extra":""}

图片消息包括两个主要部分:缩略图和大图,缩略图直接 Base64 编码后放入 content 中,大图首先上传到文件服务器(融云 SDK 中默认上传到七牛云存储),然后将云存储上的大图地址放入消息体中。流程示意如下:

其中 content 为图片内容进行 Base64 编码的结果值,imageUri 为图片上传到图片存储服务器后的地址,extra 可以放置任意的数据内容,也可以去掉此属性。

缩略图尺寸为:240 x 240 像素,以宽度和高度中较长的边不超过 240 像素等比压缩。

大图尺寸为:960 x 960 像素,以宽度和高度中较长的边不超过 960 像素等比压缩。

1. 自定义文件保存位置

接受到文件消息,并点击下载后,该文件默认保存在 SD 卡的 /RongCloud/Media/ 下。

您可以通过更改 SDK 的 res/values/rc_configuration.xml 里面的 rc_media_message_default_save_path 的值,来自定义文件的存储路径。

1.1.2:融云 IM 通讯能力库 - RongCloud IMLib

IMLib 是不含界面的基础 IM 通讯能力库,封装了通信能力和会话、消息等对象。引用到 App 工程中后,需要自己实现 UI 界面,相对较轻量,适用于对 UI 有较高订制需求的开发者。

文字消息类

RCTextMessage。用来发送文字类消息,其中可以包括超链接,会自动识别。继承自RCMessageContent,是一个普通内容类消息。

消息类名:RCTextMessage

消息 ObjectName:RC:TxtMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"content":"Hello world!","extra":""}

其中 content 为文字消息的文字内容,extra 可以放置任意的数据内容,也可以去掉此属性。

2.1、Activity 集成调用方式

静态集成:

在 AndroidManifest.xml 聚合会话列表 Activity 下面配置 intent-filter,以 SubConversationListActivtiy 为例,包名以 io.rong.fast 为例:

<activity
            android:name="io.rong.fast.activity.SubConversationListActivtiy"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden|adjustResize">

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />

        <data
            android:host="io.rong.fast"
            android:pathPrefix="/subconversationlist"
            android:scheme="rong" />
    </intent-filter>
</activity>

在 subconversationlist.xml 中集成 fragment,subconversationlist.xml 代码示例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment
        android:id="@+id/subconversationlist"
        android:name="io.rong.imkit.fragment.SubConversationListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

在 SubConversationListActivtiy 中加载 subconversationlist.xml 即可:

public class SubConversationListActivtiy extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.subconversationlist);
      }
}

启动聚合会话列表 Activity:

/**
* 启动聚合后的某类型的会话列表。<br> 例如:如果设置了单聊会话为聚合,则通过该方法可以打开包含所有的单聊会话的列表。
*
* @param context          应用上下文。
* @param conversationType 会话类型。
*/
public void startSubConversationList(Context context, Conversation.ConversationType conversationType)

动态集成:

在 AndroidManifest.xml 聚合会话列表 Activity 下面配置 intent-filter,以 SubConversationListDynamicActivtiy 为例,包名以 io.rong.fast 为例:

<activity
           android:name="io.rong.fast.test.subconversationlist.SubConversationListDynamicActivtiy"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="stateHidden|adjustResize">

           <intent-filter>
               <action android:name="android.intent.action.VIEW" />

               <category android:name="android.intent.category.DEFAULT" />

               <data
                   android:host="io.rong.fast"
                   android:pathPrefix="/subconversationlist"
                   android:scheme="rong" />
           </intent-filter>
       </activity>

加载 subconversationlist.xml 配置文件,代码示例:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/rong_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

public class SubConversationListDynamicActivtiy extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.rong_activity);


        SubConversationListFragment fragment = new SubConversationListFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.rong_content, fragment);
        transaction.commit();
    }
}

 2:融云集成进阶

资料通知消息

RCProfileNotificationMessage。用来发送用户资料变更通知消息。

消息类名:RCProfileNotificationMessage

消息 ObjectName:RC:ProfileNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"operation":"Update","data":"{"nickname":"韩梅梅", "hometown":"beijing"}","extra":""}

其中 operation 为资料通知操作,可以自行定义,data 为操作的数据,extra 可以放置任意的数据内容,也可以去掉此属性。

断网重连机制

融云 SDK 中已经为开发者做了断网重连的机制处理,开发者不必在断网后做连融云服务器的操作。

在网络连接断开后,融云会尝试 5 次重新连接服务器,首次断网 2 秒后会重新连接,如果仍然连接不成功,会在 4 秒后(重连间隔时间为上次重连间隔时间乘 2 )尝度重新连接服务器,以此类推当尝试重连 5 次后,仍然连不上服务器将不在尝试重新连接,只有在网络情况发生变化或重新打开应用时才会再次尝试重连。

在获取到以下错误状态码时,会进行重连:

code 描述
30001 进行通信操作过程中,当前 Socket 失效。
30002 Socket 连接不可用。应该是您当前网络连接不可用。
30003 进行各种信令的通信操作过程中,信令 ACK 返回超时。
30004 导航操作时,Http 请求失败。
30005 HTTP 请求失败。
30006 HTTP 接收失败。
30007 通过 HTTP 获取连接网络必须的配置数据时,服务器返回的不是 200 OK,而是 HTTP 的其它错误码。
30008 通过 HTTP 获取配置数据时,成功获得数据,但得到的内容体部分是空。可能是您所在的网络被劫持,HTTP 被修改。
30009 导航数据解析后,其中不存在有效 IP 地址。
30010 创建 Socket 失败。
30011 Socket 连接被断开,主要有两种情况,一是用户主动调用 disconnect 之后,Socket 被服务器断开;二是中间路由原因导致 Socket 断开。
30013 PING 超时。
31000 做 connect 连接时,收到的 ACK 超时。

1.2.2:手动导入 SDK 并自己管理依赖库

图文消息类

RCRichContentMessage。用来发送图文消息,包含一个标题,一段文字内容和一张图片。

消息类名:RCRichContentMessage

消息 ObjectName:RC:ImgTextMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构: {"title":"Big News","content":"I'm Ironman.","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","url":"http://www.rongcloud.cn","extra":""}

其中 title 为消息的标题,content 为消息的文字内容,imageUri 为图片的地址,url 为跳转的地址,extra 可以放置任意的数据内容,也可以去掉此属性。

图片尺寸为:120 x 120 像素。

讨论组

讨论组业务的描述,请参见新手指南中的说明。

前提条件:

  • RongIM.init(this),接口已经执行。
  • RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
  • 会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见配置说明文档。

打开讨论组聊天窗口:

/**
 * 启动已经创建的讨论组聊天界面。
 *
 * @param context            应用上下文。
 * @param targetDiscussionId 要启动的讨论组 Id。
 * @param title              聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter("title") 获取该值, 再手动设置为标题。
 */
RongIM.getInstance().startDiscussionChat(getActivity(), "9527", "标题");

创建讨论组会话并进入会话界面:

 /**
 * 创建讨论组会话并进入会话界面。
 * 讨论组创建成功后,会返回讨论组 id。
 *
 * @param context 应用上下文。
 * @param targetUserIds 要与之聊天的讨论组用户 Id 列表。
 * @param title 聊天的标题,如果传入空值,则默认显示与之聊天的用户名称。
 * @param callback 讨论组回调,成功时,返回讨论组 id。
 */
 public void createDiscussionChat(final Context context, final List<String> targetUserIds, final String title, final RongIMClient.CreateDiscussionCallback callback) {})

创建讨论组

/**
 * 创建讨论组。
 *
 * @param name       讨论组名称,如:当前所有成员的名字的组合。
 * @param userIdList 讨论组成员 Id 列表。
 * @param callback   创建讨论组成功后的回调。
 */
public void createDiscussion(final String name, final List<String> userIdList, final RongIMClient.CreateDiscussionCallback callback)

添加讨论组成员:

同一个用户最多可加入 500 个讨论组。

ArrayList<String> userIds = new ArrayList<String>();
userIds.add("101");//增加 userId。
userIds.add("102");//增加 userId。
userIds.add("103");//增加 userId。

 /**
 * 添加一名或者一组用户加入讨论组。
 *
 * @param discussionId 讨论组 Id。
 * @param userIdList   邀请的用户 Id 列表。
 * @param callback     执行操作的回调。
 */
RongIM.getInstance().addMemberToDiscussion("9527", userIds, new RongIMClient.OperationCallback() {

    @Override
    public void onSuccess() {

    }

    @Override
    public void onError(RongIMClient.ErrorCode errorCode) {

    }
});

移除讨论组成员:

/**
 * 供创建者将某用户移出讨论组。
 *
 * 移出自己或者调用者非讨论组创建者将产生 {@link RongIMClient.ErrorCode#UNKNOWN} 错误。
 *
 * @param discussionId 讨论组 Id。
 * @param userId       用户 Id。
 * @param callback     执行操作的回调。
 */
RongIM.getInstance().removeMemberFromDiscussion("discussionId_9527", "user_9527", new RongIMClient.OperationCallback() {

    @Override
    public void onSuccess() {

    }

    @Override
    public void onError(RongIMClient.ErrorCode errorCode) {

    }
});

讨论组人数上限设置:

讨论组人数在服务端有上限限制,为 500 人,客户端根据具体的业务需求,可以通过配置文件配置讨论组人数上限,请在 res/values/rc_config.xml 文件中修改, xml 文件如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="discussion_member_max_count">50</integer>
</resources>

 3.1:聊天列表的UI的自定义

地理位置消息类

RCLocationMessage。用来发送地理位置消息。

消息类名:RCLocationMessage

消息 ObjectName:RC:LBSMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"content":"bhZPzJXimRwrtvc=","latitude":39.9139,"longitude":116.3917,"poi":"北京市朝阳区北苑路北辰泰岳大厦","extra":""}

其中 content 为地图缩略图内容进行 Base64 编码的结果值,latitude 为位置的纬度值,longitude 为位置的经度值,poi 为位置兴趣点名称,extra 可以放置任意的数据内容,也可以去掉此属性。

位置消息发送

构造位置消息:

/**
 * 生成LocationMessage对象。
 *
 * @param lat    纬度。
 * @param lng    经度。
 * @param poi    poi信息。
 * @param imgUri 地图缩率图地址。
 * @return LocationMessage实例对象。
 */
public static LocationMessage obtain(double lat, double lng, String poi, Uri imgUri)

根据位置消息生成 Message 实例,如下:

LocationMessage locationMessage = LocationMessage.obtain(lat, lng, poi, thumb);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, locationMessage);

发送位置消息:

/**
 * <p>发送地理位置消息。并同时更新界面。</p>
 * <p>发送前构造 {@link Message} 消息实体,消息实体中的 content 必须为 {@link LocationMessage}, 否则返回失败。</p>
 * <p>其中的缩略图地址 scheme 只支持 file:// 和 http:// 其他暂不支持。</p>
 *
 * @param message             消息实体。
 * @param pushContent         当下发 push 消息时,在通知栏里会显示这个字段。
 *                            如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
 *                            如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
 * @param pushData            push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
 * @param sendMessageCallback 发送消息的回调,参考 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}。
 */
public void sendLocationMessage(Message message, String pushContent, final String pushData, final IRongCallback.ISendMessageCallback sendMessageCallback)

融云 SDK 默认使用的是高德地图,您也可以基于其它第三方实现位置功能,请参考基于百度地图实现融云 SDK 文档。

1.3.1:登录方式: appKey  从融云开发者平台创建应用后获取到的App Key,这个App Key必须和服务端保持一致。不然下面的token验证通不过。

[[RCIM sharedRCIM] initWithAppKey:RONGCLOUNDAPP_KEY]; //初始化融云SDK,在APP初始化的时候必须走这个方法。

命令消息

RCCommandMessage。用来发送通用的指令通知消息,消息内可以定义任意 JSON 内容,与通用命令通知消息的区别是不存储、不计数。

消息类名:RCCommandMessage

消息 ObjectName:RC:CmdMsg

消息的结构:{"name":"AtPerson","data":"{"sourceId":"9527"}"}

其中 name 为命令名称,可以自行定义,data 为命令的内容。

系统会话

前提条件:

  1. RongIM.init(this),接口已经执行。
  2. RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
  3. 会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见配置说明文档。

打开系统会话聊天界面:

/**
 * 启动系统会话聊天界面。
 *
 * @param context          应用上下文。
 * @param conversationType 开启会话类型。
 * @param targetId         目标 Id;
 * @param title            聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter("title") 获取该值, 再手动设置为标题。
 */
RongIM.getInstance().startConversation(getActivity(), Conversation.ConversationType.SYSTEM, "9527", "标题");

API 文档链接:RongIM.getInstance().startConversation

系统会话消息由应用服务端发送,客户端只能接收消息,不能进行回复。

1.2:融云 SDK的导入

文件消息

消息类名:RCFileMessage

消息 ObjectName:RC:FileMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"name”:”a.txt","size":190184,"type":"txt","fileUrl":"http://rongcloud-image.ronghub.com/text_plain_242002?e=2147483647"}

其中 name 为文件名,size 为文件大小,type 为文件类型,fileUrl 为文件地址,extra 可以放置任意的数据内容,也可以去掉此属性。

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。