setGameQueryExitListener
设置游戏退出查询监听器
setGameQueryExitListener 用于注册一个回调接口,当用户点击小游戏内部的“退出”按钮或触发游戏内的退出逻辑时,SDK 会通过该监听器向宿主 App 发起询问。这允许原生层接管退出流程,例如弹出二次确认弹窗或执行特定的资源清理。
方法声明
objectivec
/**
* 设置游戏查询退出监听。
* @param listener 遵循 SUDRTGameQueryExitListener 协议的对象。
*/
- (void)setGameQueryExitListener:(nullable id<SUDRTGameQueryExitListener>)listener;参数说明
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| listener | id<SUDRTGameQueryExitListener> | 否 | 监听器实例。传入 nil 则取消监听。 |
运行行为
- 主动拦截:当小游戏逻辑调用
exitGame接口时,引擎不会立即销毁,而是先触发此监听器。 - 决策权移交:宿主 App 获得控制权,可以根据当前业务状态(如游戏是否正在进行中)决定是否允许退出。
- 异步确认:支持异步操作,App 可以在用户点击弹窗确认后再通知引擎执行后续动作。
代码示例
通过该监听器,可以防止用户在游戏关键时刻误触退出:
objectivec
// 1. 实现协议
@interface GameViewController () <SUDRTGameQueryExitListener>
@end
@implementation GameViewController
- (void)setupExitListener {
// 2. 注册监听
[self.gameHandle setGameQueryExitListener:self];
}
#pragma mark - SUDRTGameQueryExitListener
- (void)onGameQueryExit:(void (^)(BOOL allow))completion {
// 3. 弹出原生二次确认弹窗(必须在主线程执行)
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"退出游戏"
message:@"确定要离开当前的对局吗?"
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
// 4. 不允许退出,游戏继续
if (completion) completion(NO);
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
// 5. 允许退出,开始执行原生清理逻辑
if (completion) completion(YES);
[self dismissViewControllerAnimated:YES completion:nil];
}]];
[self presentViewController:alert animated:YES completion:nil];
});
}
@end注意事项
- 必调 Completion:收到
onGameQueryExit:后,必须调用completionBlock。传入YES则引擎会配合执行退出后的状态流转,传入NO则取消退出动作。 - 清理责任:如果
completion传入YES,宿主 App 通常应紧接着调用destroy并从视图层级中移除gameView。 - 交互一致性:使用此监听器可以确保游戏内的退出体验与 App 原生导航栏的“返回”按钮逻辑保持一致。
- 默认行为:如果未设置此监听器,小游戏触发退出时可能没有任何反馈,或者仅由引擎内部尝试停止运行。