本文包括调用云信令 RESTful API 及集成云信令 SDK 时的最佳实践。
为保障 REST 服务的高可用,避免因区域网络故障造成的服务不可用,声网提供切换域名的方案。
主域名 | 区域域名 | 地理区域 |
---|---|---|
api.sd-rtn.com | api-us-west-1.sd-rtn.com | 美国西部 |
api-us-east-1.sd-rtn.com | 美国东部 | |
api-ap-southeast-1.sd-rtn.com | 亚太东南 | |
api-ap-northeast-1.sd-rtn.com | 亚太东北 | |
api-eu-west-1.sd-rtn.com | 欧洲西部 | |
api-eu-central-1.sd-rtn.com | 欧洲中部 | |
api-cn-east-1.sd-rtn.com | 中国华东 | |
api-cn-north-1.sd-rtn.com | 中国华北 | |
api.agora.io | api-us-west-1.agora.io | 美国西部 |
api-us-east-1.agora.io | 美国东部 | |
api-ap-southeast-1.agora.io | 亚太东南 | |
api-ap-northeast-1.agora.io | 亚太东北 | |
api-eu-west-1.agora.io | 欧洲西部 | |
api-eu-central-1.agora.io | 欧洲中部 | |
api-cn-east-1.agora.io | 中国华东 | |
api-cn-north-1.agora.io | 中国华北 |
(所有 SDK) RTM Token 的有效期是 24 小时。声网建议你定时(例如每小时)从服务端生成 Token 并调用 renewToken
方法更新 SDK 的 Token,保证 SDK 的 Token 一直处于有效状态。关于如何在服务端生成 Token,参考生成 RTM Token。
下面的示例代码展示了如何定时更新 Token。
// C++
// 监听 Token 过期回调
class MyHandler : public IRtmServiceEventHandler {
public:
void onRenewTokenResult(const char* token, RENEW_TOKEN_ERR_CODE errorCode)
{
if (errorCode == RENEW_TOKEN_ERR_OK) {
token_ = errorCode;
}
else {
token_ = "";
}
}
void setToken(const std::string& token) {
token_ = token;
}
std::string getNewToken()
{
return token_;
}
private:
std::string token_;
};
// 获取服务端生成的 Token 并通过 renewToken 方法更新 SDK 的 Token
void renewTokenDemoCode() {
auto client = createRtmService();
std::string appId = "";
std::string token = "";
std::string userId = "";
bool stopped = false;
MyHandler handler;
handler.setToken(token);
client->initialize("appId", &handler);
client->login(token.c_str(), userId.c_str());
// 等待登录成功
sleep(10);
// 在单线程中更新 Token
while(!stopped) {
// 每小时更新一次
sleep(60 * 60);
// 错误处理
if (handler.getNewToken().empty()) {
break;
}
client->renewToken(handler.getNewToken().c_str());
}
client->logout();
client->release();
}
(C++ SDK, Java SDK) 不及时释放创建的资源可能导致内存泄漏。虽然 Java 的 GC (Garbage Collection) 机制可以回收上层 Java 对象,但是 Java SDK 的底层 C++ API 仍然使用 Java 对象进行回调,因此会造成崩溃。
声网建议你主动调用 release
方法释放客户端对象和频道对象。
(所有 SDK) 如果你已经释放了 RTM 客户端对象,声网建议你不要再请求相关的资源。另外,你也无法在 RTM 客户端对象释放后使用 RtmCallManager
的相关资源。
(C++ SDK, Java SDK, Objective-C SDK) 如果你在频道对象的回调方法中,调用 release
方法释放频道对象,由于回调方法会对对象加锁,release
方法会请求同一把锁,造成应用卡住。
(C++ SDK) 如果你为 IRtmService
对象和 IChannel
对象设置了相应的监听器,即 IRtmServiceEventHandler
和 IChannelEventHandler
,你需要保证监听器的生命周期长于对象的生命周期。否则对象可能会调用已经释放的监听器,造成崩溃。
(1.4.1 版之前的 Objective-C SDK) AgoraRtmChannel
的生命周期需要长于 AgoraRtmKit
。否则 AgoraRtmKit
会使用已经释放的 AgoraRtmChannel
,造成崩溃。
(所有 SDK)声网建议你及时执行回调,并尽量减少回调的运行时间。否则可能会阻塞后面的回调,或造成回调丢失。
每一个 RTM 客户端实例的回调都是运行在同一个线程上的。后一个回调会等待前一个回调执行完成后再开始执行。 如果前一个回调的运行时间比较长,会使之后的回调不能及时触发,同时等待处理的回调队列越来越长。
(Linux C++ /Linux Java SDK) RTM 的 Linux 服务端 SDK 没有屏蔽 SIGPIPE 信号。你需要根据实际情况,选择是否屏蔽 SIGPIPE 信号。一般情况下,你需要屏蔽此信号,否则,客户端进程在收到此信号后会默认退出。
AgoraRtmAreaCode
枚举产生的命名冲突AGORA_SDK_BOTH_RTM_AND_RTC
宏。AgoraRtmKit_swift.h
文件。你需要在初始化和销毁 RTC 与 RTM SDK 时,遵循“先进后出”的栈操作顺序,即后初始化的 SDK 先销毁,例如:
RTC 初始化 → RTM 初始化 → RTM 销毁 → RTC 销毁
或者
RTM 初始化 → RTC 初始化 → RTC 销毁 → RTM 销毁