快速入门

最近更新时间:2022-09-20 05:17:40

本节介绍如何创建项目,并将 Flutter RTM SDK 集成至你的项目中。

开发环境要求

如果你的目标平台为 Android,你的开发环境需要满足以下要求:

  • Flutter 1.0.0 或更高版本
  • macOS 操作系统或 Windows 操作系统
  • Android Studio 3.0 或以上版本。
  • 一个有效的 开发者账号

如果你的目标平台为 iOS,你的开发环境需要满足以下要求:

  • Flutter 1.0.0 或更高版本
  • macOS 操作系统
  • Xcode 9.0 或以上版本
  • 一个有效的 开发者账号

运行环境要求

  • 如果你的目标平台为 Android,你需要有一台 Android 真机。
  • 如果你的目标平台为 iOS,你需要有一台 iOS 的真机。

快速集成

创建项目

添加依赖库

pubspec.yaml 文件中添加以下依赖项:

  1. 添加 ar_rtm 依赖项,集成 Flutter SDK。
  2. 添加 permission_handler 依赖项,安装权限处理插件。
dependencies:
  flutter:
    sdk: flutter
  ar_rtm: ^1.1.0

注意事项:
AnyRTC的Flutter SDK依赖库可以在本地直接依赖

操作流程

本节内容主要介绍如何实现点对点消息和频道消息的收发,提供相关示例代码。

初始化SDK创建实例

在创建实例前,请确保你已完成环境准备,安装包获取等步骤。

创建实例需要填入准备好的 App ID, 只有 App ID 相同的应用才能互通。

  void _createClient() async {
    _client =
    await ARRtmClient.createInstance("<APPID>");
    // var params= '{"Cmd": "ConfPriCloudAddr","ServerAdd": "1.1.1.1","Port":7080}';
    // _client.setParameters(params);
    _client.onMessageReceived = (ARRtmMessage message, String peerId) {
      _log("Peer msg: " + peerId + ", msg: " + message.text);
    };
    _client.onConnectionStateChanged = (int state, int reason) {
      _log('Connection state changed: ' +
          state.toString() +
          ', reason: ' +
          reason.toString());
      if (state == 5) {
        _client.logout();
        _log('Logout.');
        setState(() {
          _isLogin = false;
        });
      }
    };
  }

登录

APP 必须在登录 RTM 服务器之后,才可以使用 RTM 的点对点消息和群聊功能。在此之前,请确保 RtmClient 初始化完成。

  • 传入能标识用户角色和权限的 Token。如果安全要求不高,也可以将值设为 null
  • 传入能标识每个用户的 ID。用户 ID 为字符串,必须是可见字符(可以带空格),不能为空或者多于 64 个字符,也不能是字符串 "null"
  • 传入结果回调,用于接收登录 RTM 服务器成功或者失败的结果回调。
    {
      String userId = _userNameController.text;
      if (userId.isEmpty) {
        _log('Please input your user id to login.');
        return;
      }
      try {
        await _client.login(null, userId);
        _log('Login success: ' + userId);
        setState(() {
          _isLogin = true;
        });
      } catch (errorCode) {
        _log('Login error: ' + errorCode.toString());
      }
    }

点对点消息

点对点消息包括:发送点对点消息,接收点对点消息。

发送点对点消息

调用 sendMessageToPeer 方法发送点对点消息。在该方法中:

  • 传入目标消息接收方的用户 ID。
  • 传入 RtmMessage 对象实例。该消息对象由 RtmClient 类的的 createMessage() 实例方法创建,并使用消息实例的 setText() 方法设置消息内容。
  • 传入消息发送结果监听器,用于接收消息发送结果回调,如:服务器已接收,发送超时,对方不可达等。
/// 给指定用户发送消息
void _toggleSendPeerMessage() async {
    String peerUid = _peerUserIdController.text;
    if (peerUid.isEmpty) {
      _log('Please input peer user id to send message.');
      return;
    }
    String text = _peerMessageController.text;
    if (text.isEmpty) {
      _log('Please input text to send.');
      return;
    }
    try {
      ARRtmMessage message = ARRtmMessage.fromText(text);
      _log(message.text);
      await _client.sendMessageToPeer(peerUid, message, false);
      _log('Send peer message success.');
    } catch (errorCode) {
      _log('Send peer message error: ' + errorCode.toString());
    }
  }

接收点对点消息

点对点消息的接收通过创建 RtmClient 实例的时候传入的 RtmClientListener 回调接口进行监听。在该回调接口的 onMessageReceived(RtmMessage message, String peerId) 回调方法中:

  • 通过 message.getText() 方法可以获取到消息文本内容。
  • peerId 是消息发送方的用户 ID。

加入频道

App 在成功登录 RTM 服务器 之后,便可以加入频道。

  Widget _buildJoinChannel() {
    if (!_isLogin) {
      return Container();
    }
    return Row(children: <Widget>[
      _isInChannel
          ? new Expanded(
              child: new Text('Channel: ' + _channelNameController.text,
                  style: textStyle))
          : new Expanded(
              child: new TextField(
                  controller: _channelNameController,
                  decoration: InputDecoration(hintText: 'Input channel id'))),
      new OutlineButton(
        child: Text(_isInChannel ? 'Leave Channel' : 'Join Channel',
            style: textStyle),
        onPressed: _toggleJoinChannel,
      )
    ]);
  }

频道消息

在成功加入频道之后,用户可以开始向该频道发送消息。频道消息的接收通过创建频道消息的时候传入的回调接口进行监听。

  Future<ARRtmChannel> _createChannel(String name) async {
    ARRtmChannel channel = await _client.createChannel(name);
    channel.onMemberJoined = (ARRtmMember member) {
      _log(
          "Member joined: " + member.userId + ', channel: ' + member.channelId);
    };
    channel.onMemberLeft = (ARRtmMember member) {
      _log("Member left: " + member.userId + ', channel: ' + member.channelId);
    };
    channel.onMessageReceived =
        (ARRtmMessage message, ARRtmMember member) {
      _log("Channel msg: " + member.userId + ", msg: " + message.text);
    };
    return channel;
  }

登出

调用 logout 方法可以登出 RTM 系统。

 (_isLogin) {
      try {
        await _client.logout();
        _log('Logout success.');

        setState(() {
          _isLogin = false;
          _isInChannel = false;
        });
      } catch (errorCode) {
        _log('Logout error: ' + errorCode.toString());
      }
    }

开发注意事项

  • RTM 支持多个相互独立的 RtmClient 实例。

  • 在收发点对点消息或进行其他频道操作前,请确保你已成功登录 RTM 系统(即确保已经收到 onSuccess)。

  • 使用频道核心功能前必须通过调用 createChannel 方法创建频道实例。

  • 你可以创建多个 RtmClient 客户端实例,但是每个客户端实例最多只能同时加入 20 个频道。每个频道都应有不同的 channelId 参数。

  • 当离开了频道且不再加入该频道时,可以调用 release 方法及时释放频道实例所占用的资源。

  • 接收到的 RtmMessage 消息对象不能重复利用再用于发送。