Skip to content

setGameQueryExitListener

设置游戏退出查询监听器

setGameQueryExitListener 用于注册一个回调接口,当用户点击小游戏内部的“退出”按钮或触发游戏内的退出逻辑时,SDK 会通过该监听器向宿主 App 发起询问。这允许原生层接管退出流程,例如弹出二次确认弹窗或执行特定的资源清理。


方法声明

objectivec
/**
 * 设置游戏查询退出监听。
 * @param listener 遵循 SUDRTGameQueryExitListener 协议的对象。
 */
- (void)setGameQueryExitListener:(nullable id<SUDRTGameQueryExitListener>)listener;

参数说明

参数名类型必传描述
listenerid<SUDRTGameQueryExitListener>监听器实例。传入 nil 则取消监听。

运行行为

  1. 主动拦截:当小游戏逻辑调用 exitGame 接口时,引擎不会立即销毁,而是先触发此监听器。
  2. 决策权移交:宿主 App 获得控制权,可以根据当前业务状态(如游戏是否正在进行中)决定是否允许退出。
  3. 异步确认:支持异步操作,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: 后,必须调用 completion Block。传入 YES 则引擎会配合执行退出后的状态流转,传入 NO 则取消退出动作。
  • 清理责任:如果 completion 传入 YES,宿主 App 通常应紧接着调用 destroy 并从视图层级中移除 gameView
  • 交互一致性:使用此监听器可以确保游戏内的退出体验与 App 原生导航栏的“返回”按钮逻辑保持一致。
  • 默认行为:如果未设置此监听器,小游戏触发退出时可能没有任何反馈,或者仅由引擎内部尝试停止运行。