setGameQueryPermissionListener
设置游戏权限查询监听器
setGameQueryPermissionListener 用于注册权限请求的回调接口。当小游戏内部逻辑需要调用敏感系统权限(如摄像头、麦克风、相册等)时,SDK 会通过该监听器向宿主 App 发起询问。这使得原生层能够完全接管权限申请流程,确保符合 iOS 的隐私规范及 App 自身的权限管理策略。
方法声明
objectivec
/**
* 设置游戏查询权限监听。
* @param listener 遵循 SUDRTGameQueryPermissionListener 协议的对象。
*/
- (void)setGameQueryPermissionListener:(nullable id<SUDRTGameQueryPermissionListener>)listener;参数说明
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| listener | id<SUDRTGameQueryPermissionListener> | 否 | 监听器实例。传入 nil 则取消监听。 |
运行行为
- 触发拦截:当小游戏调用如
wx.authorize或wx.createCameraContext等涉及隐私的接口时,引擎会触发此监听。 - 权限映射:回调中会携带权限标识符(如
"scope.record"代表麦克风,"scope.camera"代表摄像头)。 - 原生处理:宿主 App 收到回调后,检查系统设置并决定是否弹出原生权限申请弹窗。
- 结果回传: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 相关的权限弹窗。