Skip to content

setGameQueryPermissionListener

设置游戏权限查询监听器

setGameQueryPermissionListener 用于注册权限请求的回调接口。当小游戏内部逻辑需要调用敏感系统权限(如摄像头、麦克风、相册等)时,SDK 会通过该监听器向宿主 App 发起询问。这使得原生层能够完全接管权限申请流程,确保符合 iOS 的隐私规范及 App 自身的权限管理策略。


方法声明

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

参数说明

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

运行行为

  1. 触发拦截:当小游戏调用如 wx.authorizewx.createCameraContext 等涉及隐私的接口时,引擎会触发此监听。
  2. 权限映射:回调中会携带权限标识符(如 "scope.record" 代表麦克风,"scope.camera" 代表摄像头)。
  3. 原生处理:宿主 App 收到回调后,检查系统设置并决定是否弹出原生权限申请弹窗。
  4. 结果回传:App 将最终的授权结果(允许/拒绝)通过 completion block 告知引擎。

代码示例

通过该监听器,可以统一管理游戏内外的权限申请体验:

objectivec
// 1. 实现协议
@interface GameViewController () <SUDRTGameQueryPermissionListener>
@end

@implementation GameViewController

- (void)setupPermissionListener {
    // 2. 注册监听
    [self.gameHandle setGameQueryPermissionListener:self];
}

#pragma mark - SUDRTGameQueryPermissionListener

- (void)onGameQueryPermission:(NSString *)permission completion:(void (^)(BOOL granted))completion {
    NSLog(@"[SUD] 游戏请求权限: %@", permission);
    
    // 3. 处理特定权限请求(例如麦克风)
    if ([permission isEqualToString:@"scope.record"]) {
        AVAudioSessionRecordPermission status = [[AVAudioSession sharedInstance] recordPermission];
        
        if (status == AVAudioSessionRecordPermissionUndetermined) {
            // 首次申请,请求系统权限
            [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
                if (completion) completion(granted);
            }];
        } else {
            // 已有结果,直接回传
            if (completion) completion(status == AVAudioSessionRecordPermissionGranted);
        }
    } else {
        // 其他未知权限默认拒绝或按需处理
        if (completion) completion(NO);
    }
}

@end

注意事项

  • 必须回调:收到 onGameQueryPermission:completion: 后,必须调用 completion。否则小游戏内部对应的 JS 接口会一直处于 pending 状态,导致后续逻辑无法执行。
  • Info.plist 配置:原生层在申请权限前,必须确保 Info.plist 中已配置对应的描述字符串(如 NSMicrophoneUsageDescription),否则会导致 App 崩溃。
  • 权限持久化:如果用户之前已经永久拒绝了权限,建议在回调中引导用户前往 iOS 系统设置开启,而不是简单地回传 NO
  • 线程安全:部分权限申请方法(如相册)可能对线程有要求,建议在主线程处理 UI 相关的权限弹窗。