预加载
适用于 Whiteboard iOS SDK 2.16.147,使用已公开的初始化方法和 joinRoomWithConfig:callbacks:completionHandler:。
在候课阶段创建 WhiteBoardView 和 WhiteSDK,可以提前加载内嵌页面、完成 Bridge 握手并启动 SDK 初始化。用户进入课堂时复用原有对象,再加入业务房间。候课阶段不传入房间凭据、不调用入房方法。
候课阶段:创建并持有实例
以下代码位于同一业务 UIViewController 中,两阶段均在主线程执行。业务会话必须同时强持有 View 与 SDK:SDK 对白板 View 的引用为弱引用,只保留 SDK 不足以保证预加载实例存活。
@property(nonatomic, strong) WhiteBoardView *board;
@property(nonatomic, strong) WhiteSDK *sdk;
@property(nonatomic, strong) WhiteRoom *room;
@property(nonatomic, assign) BOOL joining;
- (void)preloadInContainer:(UIView *)waitingContainer
appIdentifier:(NSString *)appIdentifier {
if (self.sdk) return;
WhiteSdkConfiguration *config =
[[WhiteSdkConfiguration alloc] initWithApp:appIdentifier];
config.region = WhiteRegionCN;
config.useMultiViews = YES;
config.enableAppliancePlugin = YES;
self.board = [[WhiteBoardView alloc] init];
self.board.frame = waitingContainer.bounds;
self.board.autoresizingMask = UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleHeight;
[waitingContainer addSubview:self.board];
self.sdk = [[WhiteSDK alloc] initWithWhiteBoardView:self.board
config:config
commonCallbackDelegate:nil];
// 不调用 joinRoom;可用候课界面覆盖这个有实际尺寸的 View。
}
如需公共回调,传入业务实现的 WhiteCommonCallbackDelegate,并由会话持有该代理。SDK 的代理引用同样为弱引用。
当前正式版没有公开可等待的 SDK 预加载完成接口。初始化返回、页面加载完成、等待固定秒数,都不能证明本地 SDK 及网络准备全部完成。功能分支新增的 prepareWithCompletionHandler:、prepareWithTimeout:completionHandler: 尚未发布,不属于本页 2.16.147 示例。
进入课堂:复用 View 与 SDK
- (void)enterClassInContainer:(UIView *)classroomContainer
roomUuid:(NSString *)roomUuid
roomToken:(NSString *)roomToken
uid:(NSString *)uid {
if (!self.sdk || self.joining || self.room) return;
self.joining = YES;
[self.board removeFromSuperview];
self.board.frame = classroomContainer.bounds;
[classroomContainer addSubview:self.board];
[classroomContainer layoutIfNeeded];
WhiteRoomConfig *roomConfig = [[WhiteRoomConfig alloc]
initWithUuid:roomUuid roomToken:roomToken uid:uid];
roomConfig.region = WhiteRegionCN;
roomConfig.isWritable = YES;
roomConfig.windowParams = [WhiteWindowParams new];
__weak typeof(self) weakSelf = self;
[self.sdk joinRoomWithConfig:roomConfig callbacks:nil
completionHandler:^(BOOL success, WhiteRoom *room, NSError *error) {
__strong typeof(weakSelf) self = weakSelf;
if (!self) return;
self.joining = NO;
if (!success) {
NSLog(@"加入房间失败:%@", error);
return;
}
self.room = room;
[room refreshViewSize];
}];
}
需要房间事件时传入当前课堂的 WhiteRoomCallbackDelegate,参见加入白板房间。候课和课堂也可共用父容器,只切换覆盖内容。跨 UIViewController 时应由独立会话对象持有并转移同一 View 与 SDK,管理代理和旧控制器的释放;仅传递配置并重新创建 View 不会复用预加载结果。
SDK 配置应在候课前确定并保持不变。2.16.147 保存配置对象,候课后再修改可能改变后续初始化参数;不能把新功能分支的不可变配置快照行为当作正式版承诺。
退出与复用
[self.sdk leaveRoomWithCompletionHandler:^(NSError *error) {
if (error) {
NSLog(@"退出未确认,停止后续复用或销毁:%@", error);
return;
}
self.room = nil;
// 可保留 board / sdk,下一次进入课堂时串行入房。
// 最终不用时,再移除 View、清理代理并释放强引用。
}];
退出过程中禁用重复入房操作。先确认异步退出成功,再执行页面跳转或最终资源释放;不要在发起退出后立即释放 View,也不要仅凭旧 disconnect 的无错误参数回调认定关闭成功。
能力边界
预加载不表示房间已连接、WindowManager 已挂载、课件已下载或首帧可见。启用动态配置后仍在入房时加载远端参数,不能把初始化返回作为动态配置已生效的信号。课件策略见课件按需加载。
prepareWhiteConnectionForAppId:region:expireSeconds:attachingSuperView: 创建的是独立临时 View,用于网络接入准备,不能替代本页的同 View、同 SDK 流程。完全离屏、零尺寸、隐藏或后台 WKWebView 的调度与内存开销应在目标设备验证,不承诺固定的入房提速数值。