鸿蒙开发融云IMKit初始化和登录

129 阅读1分钟
鸿蒙开发融云IMKit初始化和登录

融云鸿蒙版是不带UI的,得自己一步步搭建。 下面说如何初始化和登录:

一、初始化:
/**
   * @desc : 初始化融云
   * @author : congge on 2024-07-12 15:47
   **/
  public  static  initRongIm() {
    IMEngine.getInstance()
      .init(getContext(), CommonConstants.RONG_IM_KEY, new InitOption())
    // 注册自定义消息
    let clazzList: List<MessageContentConstructor> = new List()
    clazzList.add(CustomizeReadReceiptMessage)
    clazzList.add(CustomizeGiftMessage)
    IMEngine.getInstance().registerMessageType(clazzList)
    // 监听消息接收
    IMEngine.getInstance().setMessageReceivedListener((message: Message, _info: ReceivedInfo) => {
      logContent("receivedMessage",message)
      if (message.content) {

        if (message.objectName === HQVoiceMessageObjectName && message.direction === MessageDirection.Receive && !_info.isOffline) {
          // isOffline为true,是卸载重装收到的消息不用管,正常刚收到的语音消息全部是未点击,它不可能一收到就点击了的
          MMKVNoClearUtil.saveVoiceMessageReadStatus(message.targetId,message.messageId,false)
        }
        // 在这就不发已读回执了,避免两个鸿蒙一直在互发已读
        // if (MMKVUtil.getCurrentChatTargetId(message.targetId) === message.targetId) {
        //   ImUtils.sendMyReadReceiptMessage(message.targetId,message.sentTime)
        // } else if(MainPage.homeTabSelected === 3){
        //   ImUtils.sendMyReadReceiptMessage(message.targetId,message.sentTime)
        // }

        // 刷新首页未读数
        EventKeys.postEvent(EventKeys.MsgRedEvents,MsgRedEvent())
        // 刷新会话列表,不打算自己插入会话
        EventKeys.postEvent(EventKeys.RefreshMsgListEvents)
      }
      // 接收到单聊消息,发送到聊天界面
      if (message.conversationType === ConversationType.Private || message.targetId === ImType.KEFU_ID) {
        EventKeys.postEvent(EventKeys.ReceivedImMessageEvents,ReceivedImMessageEvent(message))
      }
    });
  }
二、登录:
public static connectIm() {
    if (MMKVUtil.getImToken()) {
      ImUtils.realConnect(MMKVUtil.getImToken());
    } else {
      //正常只有第一次进入应用会为""
      ImViewModel.postImToken(false, (result) => {
        ImUtils.realConnect(result.token)
      })
    }
  }

  private static realConnect(token?: string, isAgain: boolean = false) {
    if (token) {

      IMEngine.getInstance().setConnectionStatusListener((status: ConnectionStatus) => {
        logContent('IM-App', 'setConnectionStatusListener onChanged status:' + status);
        if (status === ConnectionStatus.DisconnectUserKicked) {
          showToast($r('app.string.account_notice_tick'));
          // 特别注意:对方登录,强迫退出
          // Router.pushGuidePage(true)
        }
      });
      // timeout ≦ 0,IM 将一直连接,直到连接成功或者发生无法连接的业务错误(如 token 非法)

      IMEngine.getInstance().connect(token, 0).then(result => {
        if (EngineError.Success === result.code) {
          // 连接成功
          MMKVUtil.saveTargetId(result.userId)
          EventKeys.postEvent(EventKeys.MsgRedEvents,MsgRedEvent())
          logContent("imStatus", "成功token: " + token)
          logContent("imStatus", "成功targetId: " + result.userId)
          //let userId = result.userId;
          return;
        }

        if (EngineError.ConnectTokenExpired === result.code) {
          // Token 过期,从 APP 服务请求新 token,获取到新 token 后重新 connect()

        } else if (EngineError.ConnectionTimeout === result.code) {
          // 连接超时,弹出提示,可以引导用户等待网络正常的时候再次点击进行连接
          showToast($r('app.string.net_error'))
        } else {
          //其它业务错误码,请根据相应的错误码作出对应处理。
          logContent("imStatus", result.code)
        }
      });
    }
  }
鸿蒙融云Demo源码结构图:

在这里插入图片描述
有问题或者需要完整源码demo的可以看简介联系我,也可以私信我,我每天都看私信的