1、前期准备:需要在融云注册app,获取appkey在AppDelegate中进行注册。环境分为开发环境和生产环境,调试可以用开发环境,app上线需要注册生产环境。
2、获取用户token(用来用户身份认证的,通过用户的token,获取用户的信息)的过程:
如果没有服务器,融云提供了调试的接口,点击提交即可获取token来进行测试:
3、获取到token之后就可以调用-connectWithToken:success:error:tokenIncorrect: 方法与融云服务器建立连接,这个方法在程序运行过程中只需要调用一次,在网络断开或者前后台切换的情况下,会自动重连,除非是手动断开连接,是需要再次调用该方法进行重连。
需要注意两点:
一、该方法有一个成功的回调和一个错误的回调,在错误回调中,有一种错误状态是本来已经连接成功的,需要进行判断:
二、登陆成功之后,可以将token存到沙盒偏好设置中进行存储。需要注意,该方法的回调是在子线程中进行的,如果需要进行ui操作,需要切换到主线程。
4、登陆成功,跳转到会话列表控制器,融云已经提供了一个会话列表控制器 (RCConversationListViewController),我们可以创建一个控制器继承自RCConversationListViewController。属性displayConversationTypeArray可以设置显示的聊天类型(单聊、讨论组、群聊、聊天室、客服等)。
会发现会话列表中的用户头像和用户名字不显示,为了解决这个问题,需要创建一个单独的类,遵守协议RCIMUserInfoDateSource,这个类用来管理用户信息的,用户信息可以从服务器或者缓存中读取,可以获取用户信息、缓存用户信息、删除用户信息。然后将这个类初始化,传给[RCIM sharedRCIM],RCIM就可以从该类中读取用户信息。
5、会话界面,融云也提供了一个控制器类(RCConversationViewController),同样创建一个控制器继承自它,初始化方法中需要传递displayConversationTypeArray和targetId(和谁进行会话)。
自定义消息cell(文字、表情、红包、位置、语音)等:
分两步:
第一步:自定义消息并注册消息类型:需要继承自RCMessageContent类,实现三个协议:
消息发送的流程:
消息接收流程,下图主要介绍的是离线接收消息:
第二步:自定义cell并注册cell(继承自融云提供的RCMessageBaseCell或RCMessageCell(布局更复杂))
这两种cell的区别:第二种有头像和名字,第一种没有。
自定义cell需要有三步,第一步注册cell(register方法,和collectionView注册方法相似),第二步返回cell item实例的方法
这个方法当只有自定义cell的时候才会调用,例如文本消息、图片消息、语音消息不是自定义的就不会走这个方法。
第三步,实现返回cell大小的方法。
6、发送红包功能
在会话控制器的父类RCConversationViewController中有一个属性 RCPluhinBoardView * pluginBoardView,扩展功能板view,可以扩展发送地理位置、图片、红包等功能。
使用该view下面的方法,可以添加扩展项。
实现该view的代理方法,在代理方法中监听到点击某个扩展项的回调,可以根据上面方法中的tag值进行相应的处理。
发送消息时会调用下面的方法
方法中的参数说明和注意事项如下:
自定义红包消息类,继承自第五条提到的RCMessageContent,红包需要有两个属性,amount(红包金额),desc(描述)。然后实现RCMessageContent中的三个协议的方法,第一个协议RCMessageCoding,进行json之间的编码和解码;第二个协议RCMessagePersistentCompatible,是否需要存入本地和计入未读数,红包消息是需要进行本地存储和进行未读数的,只要返回枚举的第三个选项即可;第三个协议RCMessageContentView,在会话列表中显示的红包消息摘要内容。
自定义红包cell类,继承自RCMessageCell类,这个cell类中有一个messageContentView,是用来放消息内容的视图,这个视图有一个setEventBlock:,cell大小发生改变的时候调用该方法,可以给消息中子视图重新布局。
7、撤回消息:
撤回消息的实现流程,长按消息,消息上方出现复制/删除/撤回的视图,点击撤回,删除该条消息本地存储,发送给融云服务器,服务器告诉对方客户端这是一条撤回消息,进行撤回。
当点击消息cell时,会触发下面的方法,在UIMenuControlle为消息上方出现的消息处理视图
在recall: 方法中需要做的处理是发送一条撤回消息,撤回消息cell和红包消息cell一样需要自定义,也需要一个继承自RCMessageContent的messageContent类,但是撤回消息需要进行本地存储,但不需要计入未读数。
然后将该撤回消息发送给对方客户端,把当前的长按消息删除掉。本地消息删除掉了,远程的怎么删除:
实现上面的代码,在下面的代码中接收撤回消息
先判断是否是撤回消息,然后从当前消息列表中找是否有该消息,然后进行删除
自定义撤回消息cell,只需要继承自RCMessageBaseCell,自定义里面的内容。
网友评论