iOS&Mac

介绍iOS&Mac端如何接入实时消息(Real-Time Messaging,RTM)功能。

简介

实时消息具有低延时、高并发、高可靠性等特点,可用于直播聊天互动、语聊房等场景。

DingRTC的实时消息能力依托于会议,使用前需先成功入会。

相关概念

会话(Session):实时消息会话,由sessionId唯一标识。Session支持join/leave/close操作,收发实时消息前,需先创建Session并加入。DingRTC支持创建多个不同sessionId的会话,各Session之间互不干扰。

广播消息:对Session里的所有其他成员发送消息。

点对点消息:Session里的指定UserID的用户发送消息。

集成方法

  1. 入会前,从RtcEngine获取DingRtmClient实例:

    DingRtmClient *rtmClient = [rtcEngine getRtmClient];
  2. DingRtmClient实例设置回调监听器:

    //MARK: - DingRtmClientDelegate
    
    - (void)onRtmServerStateChanged:(DingRtmServerState)state error:(int)error {
    }
    
    - (void)onJoinSessionResult:(NSString *)sessionId result:(int)result {
    }
    
    - (void)onLeaveSessionResult:(NSString *)sessionId result:(int)result {
    }
    
    - (void)onCloseSessionResult:(NSString *)sessionId result:(int)result {
    }
    
    - (void)onRemovedFromSession:(NSString *)sessionId reason:(int)reason {
    }
    
    - (void)onSessionCreate:(NSString *)sessionId {
    }
    
    - (void)onSessionClose:(NSString *)sessionId {
    }
    
    - (void)onSessionRemoteUserJoin:(NSString *)sessionId uid:(NSString *)uid {
    }
    
    - (void)onSessionRemoteUserLeave:(NSString *)sessionId uid:(NSString *)uid {
    }
    
    - (void)onMessage:(NSString *)sessionId uid:(NSString *)uid broadcast:(BOOL)broadcast data:(NSData *)data {
    }
  3. 入会成功后,会话发起者创建并加入Session:

    [rtmClient joinSession:sessionId]; // Session不存在时调用joinSession会先创建Session然后加入
  4. 会中其他成员会收到onSessionCreate事件通知,然后加入相同Session:

    [rtmClient joinSession:sessionId]; // Session存在时调用joinSession直接加入
  5. 加入Session(如果Session有其他成员)或者是中途有其他成员加入Session,都会收到onSessionRemoteUserJoin事件通知。如有点对点发送实时消息的需求,需要应用层维护Session的成员列表:

    - (void)onSessionRemoteUserJoin:(NSString *)sessionId uid:(NSString *)uid {
        // addSessionUser方法由应用层实现,用来添加Session新加入的User。
        [self addSessionUser:sessionId uid:uid];
    }

    同时在别人离开Session时,会收到onSessionRemoteUserLeave事件通知,按需做好Session成员列表的维护:

    - (void)onSessionRemoteUserLeave:(NSString *)sessionId uid:(NSString *)uid {
        // removeSessionUser方法由应用层实现,用来移除Session离开的User。
        [self removeSessionUser:sessionId uid:uid];
    }
  6. SDK支持收发UTF-8编码的字符串和二进制数据,iOS&Mac端统一用NSData作为参数来传递消息。 发送广播消息:

    NSString *msg = @"test123";
    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
    [rtmClient broadcastData:sessionId data:data];

    发送点对点消息:

    NSString *msg = @"test123";
    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
    [rtmClient sendData:sessionId uid:userId data:data];

    接收消息:

    - (void)onMessage:(NSString *)sessionId uid:(NSString *)uid broadcast:(BOOL)broadcast data:(NSData *)data {
        NSLog(@"onMessage, sessionId:%@, uid:%@, broadcast:%d, dataSize:%lu", sessionId, uid, broadcast, (unsigned long)data.length);
        // 前提是对方发送的是字符串格式消息。
        NSString *msg = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];
    }
  7. 如果本端不再使用实时消息功能,可以离开Session:

    [rtmClient leaveSession:sessionId];

    离开Session后,将收不到该Session里其他成员发送的广播消息,该Session里其他成员也无法给您发送点对点消息。

  8. 如果不再使用某个Session,可以关闭Session:

    [rtmClient closeSession:sessionId];

    关闭Session后,Session的所有成员(包括自己)都会收到onSessionClose事件通知,该Session不再可用。

注意事项

  1. 离会时,SDK内部会清空所有Session信息,实时消息功能不再可用。

  2. 远端用户不调leaveSession直接leaveChannel,有可能收不到这个远端用户的onSessionRemoteUserLeave事件通知。应用层需要在收到他的onRemoteUserOffLineNotify事件通知后,主动将该用户从所有Session的成员列表里移除。

  3. 推荐在入会前给DingRtmClient实例设置回调监听器,避免丢失回调消息。