本章节为您介绍了客户端入会失败常见原因及解决办法。
加入频道所需参数如何获取
加入频道所需参数需要从AppServer获取,获取参数请参见使用Token鉴权。
常见问题一:Windows端userName参数非UTF-8编码导致入会失败
1. 问题说明
通过 Windows API 或者某些不指定编码的文件读写操作来获取字符串,默认可能使用的是系统的 ANSI 编码;对于简体中文版的 Windows,通常是 GBK 或 GB2312;对于繁体中文版,则可能是 Big5。Windows SDK 的JoinChannel接口规定输入的userName必须为UTF-8,如果传入非UTF-8,会导致字符串解析失败导致无法入会。
2. UTF-8字符串转换示例代码
#include <windows.h>
#include <string>
#include <iostream>
// 转换多字节字符串到wideChar字符串
std::wstring MultiByteToWideChar(const std::string& mbStr, UINT codePage) {
if (mbStr.empty()) return L"";
int wlen = MultiByteToWideChar(codePage, 0, &mbStr[0], (int)mbStr.size(), NULL, 0);
wchar_t* wszGBK = new wchar_t[wlen + 1];
memset(wszGBK, 0, (wlen + 1) * sizeof(wchar_t));
MultiByteToWideChar(codePage, 0, &mbStr[0], (int)mbStr.size(), wszGBK, wlen);
std::wstring result(wszGBK);
delete[] wszGBK;
return result;
}
// 转换wideChar字符串到UTF-8
std::string WideCharToMultiByte(const std::wstring& wstr) {
if (wstr.empty()) return "";
int mblen = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
char* pMB = new char[mblen + 1];
memset(pMB, 0, (mblen + 1) * sizeof(char));
WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), pMB, mblen, NULL, NULL);
std::string result(pMB);
delete[] pMB;
return result;
}
// 主函数
int main() {
// 假设用户输入
std::string input = "你好,世界"; // 这里应替换为实际获取用户输入的方法
// 获取当前系统的ANSI代码页
UINT ansiCodePage = GetACP();
// 将输入转换为宽字符
std::wstring wideInput = MultiByteToWideChar(input, ansiCodePage);
// 再将宽字符转换回UTF-8编码
std::string utf8Output = WideCharToMultiByte(wideInput);
// 输出结果
std::cout << "Original: " << input << "\n";
std::cout << "UTF-8: " << utf8Output << "\n";
return 0;
}
常见问题二:Token错误导致入会失败
1. 控制台生成临时Token并进行验证
访问阿里云RTC控制台官网(https://rtc.console.aliyun.com/),生成临时Token。
将新生成的Token,以及相关字段填写到客户端代码中。以 Android 代码为例:
DingRtcAuthInfo auth = new DingRtcAuthInfo();
auth.channelId = /* 频道ID */;
auth.appId = /* 应用ID */;
auth.token = /* 频道鉴权令牌Token */;
auth.userId = /* 用户ID */;
执行joinChannel,检查onJoinChannelResult回调函数通知
result 为0 表示入会成功。开发人员在Token问题没解决之前,可以使用临时Token继续开发调试本端功能。接下来,按照步骤2 继续排查。
result 为非0 表示入户失败。这个时候请重点确认AppKey是否搞错,检查appId、channelId、userId、token是否在复制的时候发生了变化,比如:添加了空格字符等。如果仍未发现原因,那么按照步骤3提取客户端日志文件,并请咨询客户经理或提交工单进一步排查。
2. 服务端代码生成Token并进行验证
记录代码生成的AppID、频道ID、用户ID、Token。
以下代码以Java语言的Token生成的示例代码为例
备注:
2)其他语言访问:https://gitee.com/dingrtc/AliRTCSample/tree/master/Server ,按照语言找到AppToken文件。
访问阿里云RTC控制台官网(https://rtc.console.aliyun.com/),校验Token。
如果验证通过,说明服务端生成的Token正确。不能入会问题请按照步骤3提取客户端日志文件,并咨询客户经理或提交工单,进一步排查。
如果验证失败,说明服务端生成的Token错误,需要服务端同学自行排查,可能的原因有:
使用2.0的AppID/AppKey生成的Token,用在3.0的客户端SDK版本上。
AppID或AppKey错误。如:拷贝的时候多拷贝了空格或其他字符;AppID使用了其他AppID的AppKey等。
Token错误。如:拷贝Token的时候,被文本编辑器自动换行导致Token发生变化。
时间戳设置的值超过许可的最大有效期。如:目前最大有效期为24小时,如果时间戳设置为25小时有效期就会导致Token失效((System.currentTimeMillis() / 1000) + 25 * 60 * 60)。
时间戳已经过期:如:时间戳是1月1日的12点生成,有效期为12小时((System.currentTimeMillis() / 1000) + 12 * 60 * 60),那么在1月2日早上1点使用该Token会过期。
3. 提取RTC SDK日志文件提供给阿里云工程师进一步排查
如果遇到控制台生成的临时Token无法入会,服务端代码生成Token验证通过但是客户端无法入会,那么需要提交工单做进一步分析。这个时候需要业务开发同学提取RTC SDK的本地日志文件,方便阿里云工程师排查。
平台 | 默认路径 |
Android | /sdcard/Android/data/com.xxx.xxx/files/dingrtc/log |
iOS | AppData/Library/Caches/dingrtc/log |
Mac | 可执行程序同一个目录 |
Windows | %homepath%/dingrc/log |
备注:
具体的日志文件目录名称如:dingrtc_2024-11-25T224457218
典型入会失败错误码
错误码(十进制) | 说明 |
16974338 | 服务端鉴权失败。参考上述说明进行排查。 |
33620485 | 加入频道失败:Token无效,您可以重新生成频道鉴权令牌(Token),具体操作,请参见使用Token鉴权。 |
84148226 |
具体操作,请参见使用Token鉴权。 |