常见问题

产品 / 插件
平台 / 框架

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

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

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

更新时间:2024-01-16 17:40


文档导读

为了提高项目的安全性,对于使用 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 及以上版本
  • 本地服务端录制

    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 鉴权默认开通。

若您需要开启强制 Token 鉴权,则需联系 ZEGO 技术支持开通。

生成 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

  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)
})
本篇目录
下载 PDF