应用跟随系统未成年人模式(推荐)

场景介绍

当应用期望跟随系统未成年人模式时,应用可在刚启动时订阅公共事件感知未成年人模式的状态变化,且直接查询系统的未成年人模式是否开启。

  1. 如系统已开启未成年人模式,应用需跟随系统主动切换为未成年人模式,并且根据返回的年龄段信息做内容分级,当用户需要调整应用内未成年人模式设置(如内容偏好等)时调用验证未成年人模式密码接口,验证成功后才能进行调整。
  2. 如系统未开启未成年人模式,应用的展示内容不做限制。

同时开发者需要注意以下场景:

  1. 当应用跟随系统切换未成年人模式状态时,开发者需关注应用后台行为是否需要中断,例如是否需要中断后台播放的音视频内容等,避免未成年人绕过限制,继续访问非适龄内容。
  2. 当应用处于前台时,用户可通过下拉控制中心,点击未成年人模式开关,开启系统的未成年人模式。开发者需关注此场景下,应用仍处于前台时的内容刷新时机。
说明
  1. 推荐用户使用以下几种方式开启系统的未成年人模式:
    1. 登录中国境内(不包含中国香港、中国澳门、中国台湾)账号后,用户可以从设置进入健康使用设备应用,点击开启未成年人模式按钮开启系统的未成年人模式。
    2. 登录中国境内(不包含中国香港、中国澳门、中国台湾)儿童账号(14周岁以下)会展示开启未成年人模式的引导页面,根据页面引导即可开启系统的未成年人模式。
    3. 下拉控制中心,点击未成年人模式按钮引导用户开启未成年人模式,当前设备进入隐私空间或设备类型为2in1时不展示按钮。
  2. 开启系统的未成年人模式需要设置密码,家长在关闭未成年人模式或调整应用内未成年人模式设置(如内容偏好、使用时长等)时需要验证该密码,避免未成年人绕过相关限制。
  3. 建议先调用canIUse接口和supportMinorsMode接口来判断当前设备环境是否支持未成年人模式,否则在不支持的设备环境上调用未成年人模式相关接口,会造成程序崩溃。
    1. 调用canIUse接口需要传入参数为未成年人模式的syscap:SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection,在设备类型为phone或tablet上会返回true,其他设备类型返回false。
    2. 当登录海外华为账号或用户空间为隐私空间时调用supportMinorsMode接口均会返回false,其他场景均为true。
    3. canIUse接口和supportMinorsMode接口返回为true时,表明该设备支持系统的未成年人模式,应用可通过本章节描述的相关能力,与系统进行未成年人模式的联动。
    4. canIUse接口或supportMinorsMode接口返回为false时,表明该设备暂未支持系统的未成年人模式以及相关联动能力,应用需构建自己的未成年人模式或关闭应用的未成年人模式入口。

业务流程

流程说明:

  1. 用户打开应用时,应用通过订阅公共事件感知未成年人模式的状态变化。如果订阅到未成年人模式开启事件,则开启应用的未成年人模式,如果订阅到未成年人模式关闭事件,则展示内容不做限制。
  2. 调用getMinorsProtectionInfoSyncgetMinorsProtectionInfo获取未成年人模式的开启状态和年龄段信息,如果未成年人模式未开启,则展示应用内容。如果未成年人模式已开启,则需要根据返回的年龄段做内容分级。
  3. 当用户需要调整应用内未成年人模式设置时,调用verifyMinorsProtectionCredential接口验证未成年人模式密码,验证通过才可进行调整。

接口说明

以下是应用跟随系统未成年人模式相关接口说明,更多接口及使用方法请参见API参考

接口名

描述

getMinorsProtectionInfoSync(): MinorsProtectionInfo

同步接口,获取未成年人模式的开启状态,以及年龄段信息。

getMinorsProtectionInfo(): Promise<MinorsProtectionInfo>

异步接口,获取未成年人模式的开启状态,以及年龄段信息。

verifyMinorsProtectionCredential(context: common.Context): Promise<boolean>

调用该方法拉起验证未成年人模式密码页面。

注意
  1. verifyMinorsProtectionCredential接口需在页面或自定义组件生命周期内调用。接口调用前提是未成年人模式已开启,如果在未开启未成年人模式下调用此接口会返回错误码1009900002
  2. 当未成年人模式开启时,当前设备的开发者调试模式会被禁用,开发者可以进入设置-系统-开发者选项,点击USB调试开关,会校验健康使用设备密码,校验成功后可解除开发者调试模式限制。
  3. 如开发者重新开启USB调试开关后,发现DevEco Studio工具上hilog日志未恢复到断连之前,请执行“hdc shell hilog -G 16M”来扩大hilog日志缓存区,若hilog日志仍无法完全展示,可取出hilog日志本地查看。更多命令请参见hilog
  4. 如开发者有频繁使用到未成年人模式开启状态或者年龄段的场景,建议开发者在获取到该结果后做缓存,然后通过订阅未成年人模式公共事件来刷新未成年人模式开启状态或者年龄段,避免重复调用接口,增加时延。
  5. 当设备处于开机未解锁状态下,开发者调用getMinorsProtectionInfoSync接口会返回false。

事件说明

以下是未成年人模式开启/关闭发送的广播事件。

事件名称

描述

COMMON_EVENT_MINORSMODE_ON

usual.event.MINORSMODE_ON

表示未成年人模式开启动作。

COMMON_EVENT_MINORSMODE_OFF

usual.event.MINORSMODE_OFF

表示未成年人模式关闭动作。

开发步骤

在进行代码开发前,请先确认您已完成配置Client ID工作。

  1. 导入minorsProtection模块及相关公共模块。
    import { minorsProtection } from '@kit.AccountKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
    // 以上引入的模块为当前场景的全量模块,请按照具体实现按需引入
  2. 创建订阅者,订阅系统未成年人模式开启/关闭事件。推荐在应用Ability的onCreate生命周期中调用。
    //订阅者信息
    const subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
      events: [commonEventManager.Support.COMMON_EVENT_MINORSMODE_ON,commonEventManager.Support.COMMON_EVENT_MINORSMODE_OFF]
    };
    // 如开发者使用await改写createSubscriber方法,需要把此变量定义到全局(struct外层)
    let subscriber: commonEventManager.CommonEventSubscriber;
    //创建订阅者
    commonEventManager.createSubscriber(subscribeInfo)
      .then((commonEventSubscriber: commonEventManager.CommonEventSubscriber) => {
        // 这里获取到commonEventSubscriber对象需要暂存,用于后续事件回调。不可直接使用,否则会出现事件回调不生效的情况
        subscriber = commonEventSubscriber;
        //订阅公共事件
        commonEventManager.subscribe(subscriber,
          (error: BusinessError, data: commonEventManager.CommonEventData) => {
            if (error) {
              this.dealCommonEventAllError(error);
              return;
            }
            if (data.event === commonEventManager.Support.COMMON_EVENT_MINORSMODE_ON) {
              // 订阅到开启事件,可以调用获取年龄段的接口,根据年龄段刷新内容展示,同时如开发者有缓存年龄段或未成年人模式开启状态,则需要刷新缓存
              return;
            }
            if (data.event === commonEventManager.Support.COMMON_EVENT_MINORSMODE_OFF) {
              // 订阅到关闭事件,关闭当前应用的未成年人模式,刷新应用内容展示,取消年龄限制,如开发者有缓存未成年人模式开启状态,则需要刷新缓存
            }
          });
      })
      .catch((error: BusinessError) => {
        this.dealCommonEventAllError(error);
      });
    dealCommonEventAllError(error: BusinessError): void {
      hilog.error(0x0000, 'testTag', `Failed to subscribe. Code: ${error.code}, message: ${error.message}`);
    }
  3. 选择以下一种方式获取未成年人模式的开启状态,以及年龄段信息。当应用期望立即获取结果,推荐使用同步方式,当应用期望使用非阻塞的方式调用接口,推荐使用Promise异步回调方式。推荐在自定义组件的aboutToAppear生命周期或者应用Ability的onCreate生命周期中调用,如开发者有频繁使用到未成年人模式开启状态或年龄段信息,开发者则需把获取到的未成年人模式开启状态或年龄段缓存下来,通过订阅未成年人模式公共事件来刷新未成年人模式开启状态或年龄段。
    • 通过同步方式,调用getMinorsProtectionInfoSync获取未成年人模式的开启状态,以及年龄段信息。
      if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
        try {
          if (minorsProtection.supportMinorsMode()) {
            const minorsProtectionInfo: minorsProtection.MinorsProtectionInfo =
              minorsProtection.getMinorsProtectionInfoSync();
            // 获取未成年人模式开启状态
            const minorsProtectionMode: boolean = minorsProtectionInfo.minorsProtectionMode;
            hilog.info(0x0000, 'testTag', `Succeeded in getting minorsProtectionMode is: ${minorsProtectionMode.valueOf()}`);
            // 未成年人模式已开启,获取年龄段信息
            if (minorsProtectionMode) {
              const ageGroup: minorsProtection.AgeGroup | undefined = minorsProtectionInfo.ageGroup;
              // 如开发者有频繁使用到未成年人模式开启状态,这里则需缓存未成年人模式开启状态
              if (ageGroup) {
                hilog.info(0x0000, 'testTag', `Succeeded in getting lowerAge is: ${ageGroup.lowerAge}`);
                hilog.info(0x0000, 'testTag', `Succeeded in getting upperAge is: ${ageGroup.upperAge}`);
                // 根据年龄段刷新内容展示。如开发者有频繁使用到年龄段信息,这里则需缓存年龄段信息
              }
            } else {
              // 未成年人模式未开启,应用需跟随系统未成年人模式,展示内容不做限制
            }
          } else {
            hilog.info(0x0000, 'testTag',
              'The current device environment does not support the youth mode, please check the current device environment.');
          }
        } catch (error) {
          hilog.error(0x0000, 'testTag',
            `Failed to invoke supportMinorsMode or getMinorsProtectionInfoSync. errCode: ${error.code}, errMessage: ${error.message}`);
        }
      } else {
        hilog.info(0x0000, 'testTag',
          'The current device does not support the invoking of the getMinorsProtectionInfoSync interface.');
      }
    • 通过Promise异步回调方式,调用getMinorsProtectionInfo获取未成年人模式的开启状态,以及年龄段信息。
      if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
        try {
          if (minorsProtection.supportMinorsMode()) {
            minorsProtection.getMinorsProtectionInfo()
              .then((minorsProtectionInfo: minorsProtection.MinorsProtectionInfo) => {
                // 获取未成年人模式开启状态
                const minorsProtectionMode: boolean = minorsProtectionInfo.minorsProtectionMode;
                // 如开发者有频繁使用到未成年人模式开启状态,这里则需缓存未成年人模式开启状态
                hilog.info(0x0000, 'testTag',
                  `Succeeded in getting minorsProtectionMode is: ${minorsProtectionMode.valueOf()}`);
                // 未成年人模式已开启,获取年龄段信息
                if (minorsProtectionMode) {
                  const ageGroup: minorsProtection.AgeGroup | undefined = minorsProtectionInfo.ageGroup;
                  if (ageGroup) {
                    hilog.info(0x0000, 'testTag', `Succeeded in getting lowerAge is: ${ageGroup.lowerAge}`);
                    hilog.info(0x0000, 'testTag', `Succeeded in getting upperAge is: ${ageGroup.upperAge}`);
                    // 根据年龄段刷新内容展示。如开发者有频繁使用到年龄段信息,这里则需缓存年龄段信息
                  }
                } else {
                  // 未成年人模式未开启,应用需跟随系统未成年人模式,展示内容不做限制
                }
              })
              .catch((error: BusinessError<Object>) => {
                this.dealGetMinorsInfoAllError(error);
              });
          } else {
            hilog.info(0x0000, 'testTag',
              'The current device environment does not support the youth mode, please check the current device environment.');
          }
        } catch (error) {
          hilog.error(0x0000, 'testTag',
            `Failed to invoke supportMinorsMode. errCode: ${error.code}, errMessage: ${error.message}`);
        }
      } else {
        hilog.info(0x0000, 'testTag',
          'The current device does not support the invoking of the getMinorsProtectionInfo interface.');
      }
      dealGetMinorsInfoAllError(error: BusinessError<Object>): void {
        hilog.error(0x0000, 'testTag', `Failed to getMinorsProtectionInfo. Code: ${error.code}, message: ${error.message}`);
      }
  4. 当未成年人模式已开启,用户需要调整应用内未成年人模式设置(如内容偏好等)时调用verifyMinorsProtectionCredential方法拉起验证未成年人模式密码页面。
    if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
      try {
        if (minorsProtection.supportMinorsMode()) {
          minorsProtection.verifyMinorsProtectionCredential(getContext(this))
            .then((result: boolean) => {
              hilog.info(0x0000, 'testTag', `Succeeded in getting verify result is: ${result.valueOf()}`);
              // 使用结果判断验密是否通过,执行后续流程
            })
            .catch((error: BusinessError<Object>) => {
              this.dealVerifyAllError(error);
            });
        } else {
          hilog.info(0x0000, 'testTag',
            'The current device environment does not support the youth mode, please check the current device environment.');
        }
      } catch (error) {
        hilog.error(0x0000, 'testTag',
          `Failed to invoke supportMinorsMode. errCode: ${error.code}, errMessage: ${error.message}`);
      }
    } else {
      hilog.info(0x0000, 'testTag',
        'The current device does not support the invoking of the verifyMinorsProtectionCredential interface.');
    }

    dealVerifyAllError(error: BusinessError<Object>): void {
      hilog.error(0x0000, 'testTag', `Failed to verify. Code: ${error.code}, message: ${error.message}`);
    }
搜索
请输入您想要搜索的关键词