在 Web 应用中接入实时消息能力

在 Agora.io 官方文档中,给出了一个详细的接入说明,但在我看来,对开发者依然不够友好,因此,这里给出一个 MVP 版本的代码,帮助你快速理解你需要在页面中实现的逻辑。

1. 安装 SDK

根据你的开发经验不同,你可以选择使用包管理器安装 Agora 的 SDK, 或者直接加载 CDN 的 JS 文件来快速接入。

1.1 使用包管理器接入

安装 SDK

npm install agora-rtm-sdk --save
# yarn add agora-rtm-sdk

在项目中引入依赖文件

import AgoraRTM from 'agora-rtm-sdk'

1.2 下载 SDK 并接入

不同于 RTC,Agora 并未给 RTM 提供 CDN 版本的 SDK(这里有点奇怪),因此你需要从官网下载页面下载最新版 SDK 的 ZIP 包。

解压 ZIP 包后,你可以从项目中提取出 libs/agora-rtm-sdk-x.y.z.js 文件,并将这个文件放置在你的项目中,使用 script 标签引入。

 <script src="/path/to/agora-rtm-sdk-1.4.1.js"></script>

2. 接入 Agora

如下这段代码是接入实时消息的最简代码,你可以先大体看一下,理解一下逻辑,稍后我们详细讲解其中的一些细节。


/*
 * 初始化客户端
 */
const client = AgoraRTM.createInstance('<APPID>');
// 监听链接状态变化
client.on('ConnectionStateChanged', (newState, reason) => {
  console.log('on connection state changed to ' + newState + ' reason: ' + reason);
});
// 登陆用户,必需
client.login({ token: '<TOKEN>', uid: '<UID>' }).then(() => {
  console.log('AgoraRTM client login success');
}).catch(err => {
  console.log('AgoraRTM client login failure', err);
});

/*
 * 发送点对点消息,非必需
 */
client.sendMessageToPeer(
    { text: 'test peer message' }, // 符合 RtmMessage 接口的参数对象
    '<PEER_ID>', // 远端用户 ID
).then(sendResult => {
  if (sendResult.hasPeerReceived) {
    /* 远端用户收到消息的处理逻辑 */
  } else {
    /* 服务器已接收、但远端用户不可达的处理逻辑 */
  }
}).catch(error => {
  /* 发送失败的处理逻辑 */
});
client.on('MessageFromPeer', ({ text }, peerId) => { // text 为消息文本,peerId 是消息发送方 User ID
  /* 收到点对点消息的处理逻辑 */
});

/*
 * 发送频道消息,非必需
 */
const channel = client.createChannel('<CHANNEL_ID>'); // 此处传入频道 ID
channel.join().then(() => {
  /* 加入频道成功的处理逻辑 */
}).catch(error => {
  /* 加入频道失败的处理逻辑 */
});
channel.sendMessage({ text: 'test channel message' }).then(() => {
  /* 频道消息发送成功的处理逻辑 */
}).catch(error => {
  /* 频道消息发送失败的处理逻辑 */
});
channel.on('ChannelMessage', ({ text }, senderId) => { // text 为收到的频道消息文本,senderId 为发送方的 User ID
  /* 收到频道消息的处理逻辑 */
});
channel.leave();

client.logout();

上述代码中,可以分为三块:初始化、点对点消息、频道消息。

初始化部分是整个实时消息的基础部分,你需要使用 APPID 来初始化客户端,并登陆用户。

这里的 token 根据你选择的不同的项目鉴权方式,可以选择性的传递。

const client = AgoraRTM.createInstance('<APPID>');
// 登陆用户,必需
client.login({ token: '<TOKEN>', uid: '<UID>' }).then(() => {
  console.log('AgoraRTM client login success');
}).catch(err => {
  console.log('AgoraRTM client login failure', err);
});

点对点消息可以根据你的实际业务需求来进行接入,如果不需要相关的功能,则可以不编写此部分的代码。

client.sendMessageToPeer(
    { text: 'test peer message' }, // 符合 RtmMessage 接口的参数对象
    '<PEER_ID>', // 远端用户 ID
).then(sendResult => {
  if (sendResult.hasPeerReceived) {
    /* 远端用户收到消息的处理逻辑 */
  } else {
    /* 服务器已接收、但远端用户不可达的处理逻辑 */
  }
}).catch(error => {
  /* 发送失败的处理逻辑 */
});
client.on('MessageFromPeer', ({ text }, peerId) => { // text 为消息文本,peerId 是消息发送方 User ID
  /* 收到点对点消息的处理逻辑 */
});

频道消息可以根据你的实际业务需求来进行接入,如果不需要相关的功能,则可以不编写此部分代码

const channel = client.createChannel('<CHANNEL_ID>'); // 此处传入频道 ID
channel.join().then(() => {
  /* 加入频道成功的处理逻辑 */
}).catch(error => {
  /* 加入频道失败的处理逻辑 */
});
channel.sendMessage({ text: 'test channel message' }).then(() => {
  /* 频道消息发送成功的处理逻辑 */
}).catch(error => {
  /* 频道消息发送失败的处理逻辑 */
});
channel.on('ChannelMessage', ({ text }, senderId) => { // text 为收到的频道消息文本,senderId 为发送方的 User ID
  /* 收到频道消息的处理逻辑 */
});
channel.leave();

3. 实现你自己的业务逻辑

当你完成了上述的代码逻辑后,你就实现了在页面中接入 Agora 的功能,接下来你要做的就是实现自己的业务逻辑即可。