Skip to content

setGameQuerySystemPermissionListener

设置游戏系统权限查询监听器

setGameQuerySystemPermissionListener 用于注册系统级功能开关的查询监听器。与业务权限(如摄像头、麦克风)不同,该监听器主要处理小游戏对系统全局状态的访问请求,例如检查 系统定位服务 (LBS) 是否开启、蓝牙 硬件是否可用等。


方法声明

objectivec
/**
 * 设置游戏查询系统级权限/状态监听。
 * @param listener 遵循 SUDRTGameQuerySystemPermissionListener 协议的对象。
 */
- (void)setGameQuerySystemPermissionListener:(nullable id<SUDRTGameQuerySystemPermissionListener>)listener;

参数说明

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

运行行为

  1. 全局状态拦截:当小游戏调用 wx.getSystemInfo 或相关定位/蓝牙接口需要确认系统开关状态时触发。
  2. 差异化处理:回调中携带的 permission 字符串通常代表系统功能(如 "system.location""system.bluetooth")。
  3. 合规性检查:原生层根据 iOS 设置(如 CLLocationManager.locationServicesEnabled)判断当前系统功能是否处于打开状态。
  4. 异步反馈:通过 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+ 中,频繁静默查询系统状态可能触发系统层面的审计,建议仅在游戏逻辑确实需要时才处理对应回调。