本节介绍如何创建项目,并将 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
文件中添加以下依赖项:
- 添加
ar_rtm
依赖项,集成 Flutter SDK。 - 添加
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 消息对象不能重复利用再用于发送。