常见问题

产品 / 插件
平台 / 框架

Express 如何从 AppSign 鉴权升级为 Token 鉴权?

产品 / 插件:实时音视频 / 实时语音 / 低延迟直播 / 互动白板 / 文件共享 / 数据流录制 / 本地服务端录制 / 屏幕共享 / 小程序直播 / GO课堂 / 畅直播

平台 / 框架:iOS / Android / macOS / Windows / Linux / Flutter / Electron / React Native / uni-app / Unity3d

更新时间:2022-11-22 11:28


文档导读

为了提高项目的安全性,对于使用 AppSign 鉴权的开发者,当您的产品升级如下版本后,可以使用 Token 鉴权且鉴权通过后才能使用相关服务(如果您不需要,可继续使用 AppSign 鉴权方式),您可以参考本文档进行升级。

  • 实时音视频

    • iOS/Android/macOS/Windows/Unity3D:2.17.0 及以上版本
    • Flutter:2.17.1 及以上版本
    • React Native:0.17.0 及以上版本
    • uni-app:1.5.0 及以上版本
    • Electron:2.17.3 及以上版本
    • Linux(C++):2.17.3 及以上版本
    • Linux(Java):2.18.0 及以上版本
  • 本地服务端录制

    ga01596a1c8 及以上版本(2022-03-23 发布)

  • 超级白板

    iOS/Android:2.3.0 及以上版本(2022-05-26 发布)

  • 互动白板

    说明:使用互动白板 SDK 时,Token 鉴权相关步骤,请参考 使用 Token - 实时音视频 即可,下文不再赘述。

    • iOS/Android:2.3.0 及以上版本(2022-05-26 发布)
    • Electron:2.1.6 及以上版本(2022-05-26 发布)
  • 文件共享

    • iOS/Android:2.3.0 及以上版本(2022-05-26 发布)
    • Electron:2.1.6 及以上版本(2022-05-26 发布)

鉴权方式

鉴权方式 功能描述 安全级别
AppSign 鉴权
在创建引擎时传入 AppSign,鉴权通过后即可使用实时音视频功能。
安全级别很低。
原因为:如果 AppSign 被泄漏,攻击者会盗用您的云服务流量,并且 AppSign 没有过期机制,建议您尽快升级为 Token 鉴权。
Token 鉴权(推荐)
Token 鉴权是在创建引擎时将 AppSign 传空或不传,并且在登录房间时必须传入 Token,鉴权通过后即可使用实时音视频功能。
该方式能兼容 Appsign 鉴权,即当您同时传入了 AppSign 和 Token 时,SDK 会把这两个参数都传给 ZEGO 服务端,只要其中一个校验通过则表示鉴权通过。
安全级别高。
原因为:通过开发者自建服务端下发 Token,并且在客户端上进行认证,且下发的 Token 具有时效性。因此,我们推荐您使用 Token 鉴权。
强制 Token 鉴权
该方式指的是通过 ZEGO 技术支持配置强制 Token 鉴权服务,此时必须使用 Token 鉴权,鉴权通过后即可使用实时音视频功能。
该方式不兼容 AppSign 鉴权。
安全等级最高。
原因为:强制使用 Token 鉴权后,不再兼容 AppSign 鉴权,安全性进一步提高,但是线上使用 AppSign 鉴权的老版本则不能正常使用,您需要谨慎使用。

兼容性说明

使用 AppSign 鉴权、Token 鉴权、强制 Token 鉴权三种方式具有一定的兼容性,若您历史版本使用 AppSign 鉴权,则:

  • 不开启强制 Token 鉴权开关(默认):ZEGO Express SDK 新版本可以使用 Token 鉴权或 AppSign 鉴权。
  • 开启强制 Token 鉴权开关:ZEGO Express SDK 无论新老版本,都强制使用 Token 鉴权,不兼容 AppSign 鉴权。

版本信息请参考 文档导读

升级指导

服务开通

Token 鉴权默认开通。

  1. 若您需要开启强制 Token 鉴权,则需联系 ZEGO 技术支持开通。
  2. 若您历史版本是使用 AppSign 鉴权,在新版本也想继续使用该鉴权方式,则需要联系 ZEGO 技术支持获取 AppSign(因为新控制台不再提供该字段)。

生成 Token

开发者客户端向开发者服务端发送请求申请 Token,由开发者服务端生成 Token 后返回给到对应客户端。

ZEGO 在 GitHub/Gitee 提供了一个开源的 zego_server_assistant 插件,支持使用 Go、C++、Java、Python、PHP、.NET、Node.js 语言,在开发者的服务端或客户端部署生成 Token(不推荐客户端生成)。

zego_server_assistant 中包含 token03 和 token04 两个版本的插件,以 ZEGO Express SDK iOS 平台为例, SDK 对插件的支持情况如下:

  • token03:ZEGO Express SDK 2.8.0 及以上版本都支持。
  • token04:只有 ZEGO Express SDK 2.17.0 及以上版本支持。

生成 Token 的详细介绍请参考如下文档:

使用 Token

本章主要介绍您升级 SDK 后如何使用 Token 功能。

产品 平台
实时音视频/实时语音
本地服务端录制
超级白板
文件共享

实时音视频/实时语音

各平台的实现流程如下:

iOS

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
ZegoEngineProfile *profile = [[ZegoEngineProfile alloc] init];
// 请通过官网注册获取,格式为:1234567890
profile.appID = appID; 
//通用场景接入,请根据实际情况选择合适的场景
profile.scenario = ZegoScenarioDefault; 
// 创建引擎,并注册 self 为 eventHandler 回调。不需要注册回调的话,eventHandler 参数可以传 nil,后续可调用 "-setEventHandler:" 方法设置回调
[ZegoExpressEngine createEngineWithProfile:profile eventHandler:self];
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomCofig 中需要填入开发者服务器生成的 Token。
NSString *roomID = @"xxx"; // 要登录的房间ID
ZegoUser *user = [ZegoUser userWithUserID:@"xxxx"];
ZegoRoomConfig *config = [[ZegoRoomConfig alloc] init];
config.token = @"xxxxxxxx"; // 请求开发者服务端获取

[[ZegoExpressEngine sharedEngine] loginRoom:roomID user:user config:config];
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
NSString *token = [MyToken getToken]; // 重新请求开发者服务端获取 Token
[[ZegoExpressEngine sharedEngine] renewToken:token roomID:roomID];

Android

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
// 创建引擎,通用场景接入,并注册 self 为 eventHandler 回调
// 不需要注册回调的话,eventHandler 参数可以传 null,后续可调用 "setEventHandler:" 方法设置回调
ZegoEngineProfile profile = new ZegoEngineProfile();
profile.appID = ;  // 请通过官网注册获取,格式为:1234567890L
profile.scenario = ZegoScenario.DEFAULT;  // 通用场景接入,请根据实际情况选择合适的场景
profile.application = getApplication();
engine = ZegoExpressEngine.createEngine(profile, null);
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
String roomID = "xxx" // 要登录的房间ID
ZegoUser user = new ZegoUser("xxxx");
ZegoRoomConfig config = new ZegoRoomConfig();
config.token = "xxxxxxxxxx"; // 请求开发者服务端获取
engine.loginRoom(roomID, user, config);
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
String token = getToken(); // 重新请求开发者服务端获取 Token;
engine.renewToken(roomID, token);

macOS

  • 如果您使用的是 Objective-C:请参考 iOS。
  • 如果您使用的是 C++:请参考 Windows。

Windows

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
ZegoEngineProfile profile;
// AppID 由 ZEGO 分配给各 App
profile.appID = appID;
// 通用场景接入,请根据实际情况选择合适的场景
profile.scenario = ZegoScenario::ZEGO_SCENARIO_DEFAULT;
// 创建引擎实例
auto engine = ZegoExpressSDK::createEngine(profile, nullptr);
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
std::string roomID = 'xxx'; // 要登录的房间ID
ZegoUser user;
user.userID = 'xxxx';
user.userName = 'xxxx';
ZegoRoomConfig config;
config.token = 'xxxxxxxxxx' // 请求开发者服务端获取
engine->loginRoom(roomID, user, config);
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
void onRoomTokenWillExpire(const std::string& /*roomID*/, int /*remainTimeInSecond*/) override {
    std::string token = getToken(); // 重新请求开发者服务端获取 Token
    engine->renewToken(roomID, token);
}

Unity3D

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 CreateEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
// 定义 SDK 引擎对象
ZegoExpressEngine engine;

ZegoEngineProfile profile = new ZegoEngineProfile();
profile.appID = appID; // 请通过官网注册获取,格式为 123456789
profile.scenario = ZegoScenario.Default; // 通用场景接入,请根据实际情况选择合适的场景
// 初始化SDK
engine = ZegoExpressEngine.CreateEngine(profile);
  1. 调用 LoginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
string roomID = "xxx"; // 要登录的房间ID
ZegoUser user = new ZegoUser();
user.userID = "xxxx";
user.userName = "xxxx";
ZegoRoomConfig config = new ZegoRoomConfig();
config.token = "xxxxxxxxxx"; // 请求开发者服务端获取
engine.LoginRoom(roomID, user, config);
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
void OnRoomTokenWillExpire(string roomID, int remainTimeInSecond){
    string token = getToken(); // 重新请求开发者服务端获取 Token
    engine.RenewToken(roomID, token);
}

Flutter

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngineWithProfile 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
ZegoEngineProfile profile = ZegoEngineProfile(
    appID, // 请通过官网注册获取,格式为:1234567890
    ZegoScenario.General, // 通用场景接入
    enablePlatformView: true);
// 创建引擎
ZegoExpressEngine.createEngineWithProfile(profile);
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
// 创建用户对象
ZegoUser user = ZegoUser.id('user1');
// 只有传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回调。
ZegoRoomConfig config = ZegoRoomConfig.defaultConfig();
config.isUserStatusNotify = true;
// token 由用户自己的服务端生成,为了更快跑通流程,也可以通过即构控制台获取临时的音视频 token
config.token = "xxxx";
// 开始登录房间
ZegoExpressEngine.instance.loginRoom('room1', user, config: config);
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
ZegoExpressEngine.onRoomTokenWillExpire = (String roomID, int remainTimeInSecond) {
    String token = getToken(); // 重新请求开发者服务端获取 Token;
    ZegoExpressEngine.instance.renewToken(roomID, token);
  };

React Native

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngineWithProfile 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
// 导入
import ZegoExpressEngine from 'zego-express-engine-reactnative';

// 采用通用场景
const profile = {
appID : xxx,
scenario : 0
};

ZegoExpressEngine.createEngineWithProfile(profile)
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
let roomConfig = {};
//token 由用户自己的服务端生成,为了更快跑通流程,也可以通过即构控制台获取临时的音视频 token
roomConfig.token = "xxxx";
// 只有传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回调。
roomConfig.isUserStatusNotify = true;
// 登录房间
// 开始登录房间
ZegoExpressEngine.instance().loginRoom('room1', {'userID': 'id1', 'userName': 'user1'}, roomConfig);
  1. 在收到的 roomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
ZegoExpressEngine.instance().on("roomTokenWillExpire", (roomID, remainTimeInSecond){
    let token = getToken(); // 重新请求开发者服务端获取 Token;
    ZegoExpressEngine.instance().renewToken(roomID, token);
});

uni-app

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngineWithProfile 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
// 导入
import ZegoExpressEngine from '@/zego-express-video-uniapp/lib/ZegoExpressEngine';

// 采用通用场景
const profile = {
appID : xxx,
scenario : 0
};

ZegoExpressEngine.createEngineWithProfile(profile)
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
let roomConfig = {};
//token 由用户自己的服务端生成,为了更快跑通流程,也可以通过即构控制台获取临时的音视频 token
roomConfig.token = "xxxx";
// 只有传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回调。
roomConfig.isUserStatusNotify = true;
// 登录房间
// 开始登录房间
ZegoExpressEngine.instance().loginRoom('room1', {'userID': 'id1', 'userName': 'user1'}, roomConfig);
  1. 在收到的 roomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
ZegoExpressEngine.instance().on("roomTokenWillExpire", (roomID, remainTimeInSecond){
    let token = getToken(); // 重新请求开发者服务端获取 Token;
    ZegoExpressEngine.instance().renewToken(roomID, token);
});

Electron

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
// 引入 ZegoExpressEngine
const zgEngine = window.require('zego-express-engine-electron/ZegoExpressEngine');
const zgDefines = window.require('zego-express-engine-electron/ZegoExpressDefines');

// AppID 由 ZEGO 分配给各 App;从 2.17.3 版本开始,ZEGO 不再下发 appSign,即用户在创建引擎时可将 appSign 填空或者不填,但是要正常使用 SDK 的功能,必须在登录房间时传入 token 进行鉴权校验;
// 采用通用场景
const profile = {
appID : xxx,
scenario : zgDefines.ZegoScenario.General
};

zgEngine.createEngine(profile)
.then(() => {
    console.log("init succeed")
}).catch((e) => {
    console.log("init failed", e)
});
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
zgEngine.loginRoom('roomID', { userID: 'zego', userName: zego}, config = {token: 'xxxx'});
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
zgEngine.on("onRoomTokenWillExpire", res=>
{
    zgEngine.renewToken(roomID = TheRoomID, token = 'xxxx');
});

Linux(C++)

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
ZegoEngineProfile profile;
// AppID 由 ZEGO 分配给各 App
profile.appID = appID;
profile.scenario = ZegoScenario::ZEGO_SCENARIO_DEFAULT;
// 创建引擎实例
auto engine = ZegoExpressSDK::createEngine(profile, nullptr);
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
std::string roomID = 'xxx'; // 要登录的房间ID
ZegoUser user;
user.userID = 'xxxx';
user.userName = 'xxxx';
ZegoRoomConfig config;
config.token = 'xxxxxxxxxx' // 请求开发者服务端获取
engine->loginRoom(roomID, user, config);
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
void onRoomTokenWillExpire(const std::string& /*roomID*/, int /*remainTimeInSecond*/) override {
    std::string token = getToken(); // 重新请求开发者服务端获取 Token
    engine->renewToken(roomID, token);
}

Linux(Java)

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 createEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
// 创建引擎,通用场景接入,并注册 self 为 eventHandler 回调
// 不需要注册回调的话,eventHandler 参数可以传 null,后续可调用 "setEventHandler:" 方法设置回调
ZegoEngineProfile profile = new ZegoEngineProfile();
profile.appID = ;  // 请通过官网注册获取,格式为:1234567890L
profile.scenario = ZegoScenario.DEFAULT;  // 通用场景接入,请根据实际情况选择合适的场景
profile.application = getApplication();
engine = ZegoExpressEngine.createEngine(profile, null);
  1. 调用 loginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
String roomID = "xxx" // 要登录的房间ID
ZegoUser user = new ZegoUser("xxxx");
ZegoRoomConfig config = new ZegoRoomConfig();
config.token = "xxxxxxxxxx"; // 请求开发者服务端获取
engine.loginRoom(roomID, user, config);
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
String token = getToken(); // 重新请求开发者服务端获取 Token;
engine.renewToken(roomID, token);

本地服务端录制

Linux

  1. 已下载并集成最新版本的 SDK,详情请参考 集成 SDK
  2. 调用 InitSDK 接口初始化 SDK,将申请到的 AppID 传入参数 “uiAppID”。
unsigned int appId = appID;//此处填写 AppID
LIVEROOM::InitSDK(appId);
  1. 在登录房间之前调用 SetCustomToken 接口将 Token 传入 SDK。
LIVEROOM::SetCustomToken("token"); // 此处填写正确的鉴权 Token

超级白板

iOS

  1. 已下载并集成最新版本的 ZegoSuperBoard SDK(已包含 ZegoExpressEngine SDK),详情请参考 集成 SDK
  2. 调用 ZegoExpressEnginecreateEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
ZegoEngineProfile *profile = [[ZegoEngineProfile alloc] init];
// 请通过官网注册获取,格式为:1234567890
profile.appID = appID; 
//通用场景接入,请根据实际情况选择合适的场景
profile.scenario = ZegoScenarioDefault; 
// 创建引擎,并注册 self 为 eventHandler 回调。不需要注册回调的话,eventHandler 参数可以传 nil,后续可调用 "-setEventHandler:" 方法设置回调
[ZegoExpressEngine createEngineWithProfile:profile eventHandler:self];
  1. 使用 ZegoSuperBoardManagerinitWithConfig 方法初始化 ZegoSuperBoard SDK 时,传入 userID,并填入开发者服务器生成的 Token。
/** 填写 appID*/
unsigned int appID = ;  /** 请通过官网注册获取,格式为 123456789L */

//创建一个初始化配置类ZegoSuperBoardInitConfig
ZegoSuperBoardInitConfig * config = [ZegoSuperBoardInitConfig new];
config.appID = appID; //赋值 appID
config.token = token; //赋值 token
config.userID = userID; //赋值 userID

//设置ZegoSuperBoardManager监听,需要在登录房间之前设置
[ZegoSuperBoardManager sharedInstance].delegate = self;

[[ZegoSuperBoardManager sharedInstance] initWithConfig:config complete:^(ZegoSuperBoardError errorCode) {
    if (errorCode == ZegoSuperBoardSuccess) {
         /** 初始化成功 */
    } else {
        /** 初始化失败 */
    }
}];
  1. 调用 ZegoExpressEngineloginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
NSString *roomID = @"xxx"; // 要登录的房间ID
ZegoUser *user = [ZegoUser userWithUserID:@"xxxx"];
ZegoRoomConfig *config = [[ZegoRoomConfig alloc] init];
config.token = @"xxxxxxxx"; // 请求开发者服务端获取

[[ZegoExpressEngine sharedEngine] loginRoom:roomID user:user config:config];
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
NSString *token = [MyToken getToken]; // 重新请求开发者服务端获取 Token
[[ZegoExpressEngine sharedEngine] renewToken:token roomID:roomID];

Android

  1. 已下载并集成最新版本的 ZegoSuperBoard SDK(已包含 ZegoExpressEngine SDK),详情请参考 集成 SDK
  2. 调用 ZegoExpressEnginecreateEngine 接口创建引擎时,ZegoEngineProfile 中的 “AppSign” 传空或者不传。
// 创建引擎,通用场景接入,并注册 self 为 eventHandler 回调
// 不需要注册回调的话,eventHandler 参数可以传 null,后续可调用 "setEventHandler:" 方法设置回调
ZegoEngineProfile profile = new ZegoEngineProfile();
profile.appID = ;  // 请通过官网注册获取,格式为:1234567890L
profile.scenario = ZegoScenario.DEFAULT;  // 通用场景接入,请根据实际情况选择合适的场景
profile.application = getApplication();
engine = ZegoExpressEngine.createEngine(profile, null);
  1. 使用 ZegoSuperBoardManagerinit 方法初始化 ZegoSuperBoard SDK 时,传入 userID,并填入开发者服务器生成的 Token。
// 配置superBoard初始化所需要的appID,token和UserID
ZegoSuperBoardInitConfig config = new ZegoSuperBoardInitConfig();
config.appID = appID; //赋值 appID
config.token = token; //赋值 token
config.userID = userID; //赋值 userID

// 调用SuperBoardManager初始化SuperBoard sdk
// this 为Android的Application上下文,因此此段代码建议放在Application中实现
ZegoSuperBoardManager.getInstance().init(this, config, new IZegoSuperBoardInitCallback() {
    @Override
    public void onInit(int errorCode) {
        Log.d(TAG, "init ZegoSuperBoardManager result: errorCode = [" + errorCode + "]");
        if (errorCode == ZegoSuperBoardError.ZegoSuperBoardSuccess) {
            /** 初始化成功 */
        } else {
            /** 初始化失败 */
        }
    }
});
  1. 调用 ZegoExpressEngineloginRoom 接口登录房间时,房间进阶配置 ZegoRoomConfig 中需要填入开发者服务器生成的 Token。
String roomID = "xxx" // 要登录的房间ID
ZegoUser user = new ZegoUser("xxxx");
ZegoRoomConfig config = new ZegoRoomConfig();
config.token = "xxxxxxxxxx"; // 请求开发者服务端获取
engine.loginRoom(roomID, user, config);
  1. 在收到的 onRoomTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
String token = getToken(); // 重新请求开发者服务端获取 Token;
engine.renewToken(roomID, token);

文件共享

iOS

  1. 已下载并集成最新版本的 ZegoDocsView SDK,详情请参考 集成 SDK
  2. 使用 ZegoDocsViewManagerinitWithConfig 方法初始化 ZegoDocsView SDK 时,传入 userID,并填入开发者服务器生成的 Token。
ZegoDocsViewConfig *config = [ZegoDocsViewConfig new];
config.appID = appID;//即构 AppID
config.userID = userID;//用户 userID
config.token = token;//鉴权token,从客户自己的服务器拿到

config.dataFolder = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/ZegoDocs"] stringByAppendingString:@"data"];//SDK 相关数据目录
config.cacheFolder = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/ZegoDocs"] stringByAppendingString:@"doc"];//SDK 相关缓存目录
config.logFolder = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/ZegoDocs"] stringByAppendingString:@"log"];//SDK 相关日志目录

[[ZegoDocsViewManager sharedInstance] initWithConfig:config completionBlock:^(ZegoDocsViewError errorCode) {
    if (errorCode == ZegoDocsViewSuccess) {
        NSLog(@"初始化 SDK 成功");
    } else {
        NSLog(@"初始化 SDK 失败 %ld",errorCode);
    }
}];
  1. 在收到的 tokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
- (void)tokenWillExpire
{
    NSString * token = **; //后台获取到的token
    [[ZegoDocsViewManager sharedInstance] renewToken:token];
}

Android

  1. 已下载并集成最新版本的 ZegoDocsView SDK,详情请参考 集成 SDK
  2. 使用 ZegoDocsViewManagerinit 方法初始化 ZegoDocsView SDK 时,传入 userID,并填入开发者服务器生成的 Token。
long appID = ;  /** 请通过官网注册获取,格式为 123456789L */
String token = ;  /** 鉴权token*/
String UserID = ; /** 用户唯一ID*/
Application application ; //android app的 application

ZegoDocsViewConfig config = new ZegoDocsViewConfig();  
config.setAppID(appID);
config.setToken(token);
config.setUserID(userID);

ZegoDocsViewManager.getInstance().init(application,config, new IZegoDocsViewInitListener() {
    @Override
    public void onInit(int errorCode) {
        if (errorCode == 0) {
            /** 初始化成功 */
        } else {
            /** 初始化失败 */
        }
    }
});
  1. 在收到的 onTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
ZegoDocsViewManager.getInstance().setTokenListener(new IZegoDocsViewSetTokenListener() {
    @Override
    public void onTokenWillExpire(int remainTimeInSecond) {
        //从服务器获取新的token
        String token = getTokenFromServer();
        ZegoDocsViewManager.getInstance().renewToken(token);
    }
});

Electron

  1. 已下载并集成最新版本的 ZegoDocsView SDK,详情请参考 集成 SDK
  2. 初始化 ZegoDocsView SDK 时,传入 userID,并填入开发者服务器生成的 Token。
/** 引入 ZegoExpressDocs SDK */
const ZegoExpressDocs = window.require('zego-express-docsview-electron');
/**
* 初始化 ZegoExpressDocs SDK
* @param appID: ZEGO 为开发者签发的应用 ID,请从 ZEGO 管理控制台申请
* @param dataFolder: 可选,SDK 内部数据保存目录,开发者无需关注此目录下的具体内容
* @param cacheFolder: 可选,SDK 缓存保存目录
* @param logFolder: 可选,日志保存目录,记录 SDK 运行过程中的日志,便于定位
* @param token: 用于验证身份的 Token
* @param userID: 同一个 AppID 内,需保证 “userID” 全局唯一
*/
const zegoExpressDocs = new ZegoExpressDocs({
    appID, 
    dataFolder, 
    cacheFolder, 
    logFolder,
    token,
    userID
});
  1. 在收到的 onTokenWillExpire 回调后,调用 renewToken 接口更新 Token 并传入 SDK 即可。
zegoExpressDocs.on('onTokenWillExpire', function(data){
    var newToken = 'new token';
    zegoExpressDocs.renewToken(newToken)
})