setGameQuerySystemPermissionListener
设置游戏系统权限查询监听器
setGameQuerySystemPermissionListener 用于注册系统级功能开关的查询监听器。与业务权限(如摄像头、麦克风)不同,该监听器主要处理小游戏对系统全局状态的访问请求,例如检查 系统定位服务 (LBS) 是否开启、蓝牙 硬件是否可用等。
方法声明
objectivec
/**
* 设置游戏查询系统级权限/状态监听。
* @param listener 遵循 SUDRTGameQuerySystemPermissionListener 协议的对象。
*/
- (void)setGameQuerySystemPermissionListener:(nullable id<SUDRTGameQuerySystemPermissionListener>)listener;参数说明
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| listener | id<SUDRTGameQuerySystemPermissionListener> | 否 | 监听器实例。传入 nil 则取消监听。 |
运行行为
- 全局状态拦截:当小游戏调用
wx.getSystemInfo或相关定位/蓝牙接口需要确认系统开关状态时触发。 - 差异化处理:回调中携带的
permission字符串通常代表系统功能(如"system.location"或"system.bluetooth")。 - 合规性检查:原生层根据 iOS 设置(如
CLLocationManager.locationServicesEnabled)判断当前系统功能是否处于打开状态。 - 异步反馈:通过 completion block 将
YES(已开启)或NO(已关闭)回传给游戏环境。
代码示例
通过该监听器,游戏可以引导用户去系统设置页面开启定位:
objectivec
// 1. 实现协议
@interface GameViewController () <SUDRTGameQuerySystemPermissionListener>
@end
@implementation GameViewController
- (void)setupSystemPermissionListener {
// 2. 注册监听
[self.gameHandle setGameQuerySystemPermissionListener:self];
}
#pragma mark - SUDRTGameQuerySystemPermissionListener
- (void)onGameQuerySystemPermission:(NSString *)permission completion:(void (^)(BOOL enabled))completion {
NSLog(@"[SUD] 游戏查询系统功能状态: %@", permission);
// 3. 检查系统定位开关
if ([permission isEqualToString:@"system.location"]) {
BOOL isLocationEnabled = [CLLocationManager locationServicesEnabled];
if (completion) completion(isLocationEnabled);
if (!isLocationEnabled) {
NSLog(@"[SUD] 提醒:系统定位服务未开启");
}
} else {
// 其他系统功能默认返回开启或按需实现
if (completion) completion(YES);
}
}
@end注意事项
- 与 Permission 监听器的区别:
setGameQueryPermissionListener侧重于 App 是否获得授权;而本监听器侧重于 系统功能开关是否打开。 - 必须回调:收到请求后必须执行
completion。如果未执行,游戏内部的系统信息获取接口可能会超时或阻塞。 - 性能考量:查询系统开关(如蓝牙状态)可能涉及系统框架初始化,建议在子线程查询后回到主线程回调,或者使用缓存的状态值。
- 隐私政策:在 iOS 13+ 中,频繁静默查询系统状态可能触发系统层面的审计,建议仅在游戏逻辑确实需要时才处理对应回调。