41.细解鸿蒙之元服务UX上架标准-启动无开屏、无扑脸广告

182 阅读3分钟

细解鸿蒙之元服务UX上架标准-启动无开屏、无扑脸广告

是否必须遵守:必须

标准项描述:

通过元服务图标、服务卡片、场景调用等方式打开元服务时,无开屏或弹窗界面干扰。进入首页后,非用户主动操作,不允许出现扑脸广告弹框干扰用户。若有广告运营诉求,可在设备屏幕底部 1/4 区域配置少量弹窗。

image.png 测试方法:启动元服务,元服务系统加载完后,直接进入首页。

判定标准:元服务加载完后,直接进入首页,无其他开屏、弹窗等广告信息干扰。

综合意义

提升用户体验:启动无开屏、无扑脸广告能够让用户在打开应用时更加顺畅、高效,避免被广告干扰,从而提升用户对应用的满意度和忠诚度。

保护用户隐私:减少广告的直接推送,降低了用户个人信息被收集和滥用的风险,保护了用户的隐私。

优化应用环境:营造一个更加友好、纯净的应用环境,有助于提升应用的整体质量和形象,促进应用的健康发展。--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

import { advertising } from '@kit.AdsKit';
import { router } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

// 标记为入口组件
@Entry
// 声明为组件
@Component
export struct LoadAd {
  // 获取 UI 能力上下文
  private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;

  build() {
    Column() {
      Column() {
        // 创建一个按钮,点击后请求原生广告
        Button('请求原生广告', { type: ButtonType.Normal, stateEffect: true }).onClick(() => {
          this.requestAd();
        })
      }
    .width('100%')
    .height('80%')
    .justifyContent(FlexAlign.Center)
    }
  .width('100%')
  .height('100%')
  }

  private requestAd(): void {
    // 广告展示选项,包括是否静音等
    const adDisplayOptions: advertising.AdDisplayOptions = {
      // 是否静音,默认不静音
      mute: false
    };
    // 原生广告配置
    const adOptions: advertising.AdOptions = {
      // 设置是否请求非个性化广告
      nonPersonalizedAd: 1,
      // 是否允许流量下载 0:不允许,1:允许,不设置以广告主设置为准
      allowMobileTraffic: 0,
      // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1 默认值,不确定 0 不希望 1 希望
      tagForChildProtection: -1,
      // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1 默认值,不确定 0 不希望 1 希望
      tagForUnderAgeOfPromise: -1,
      // 设置广告内容分级上限: W: 3+, 所有受众 PI: 7+, 家长指导 J:12+, 青少年 A: 16+/18+,成人受众
      adContentClassification: 'A'
    };
    // 原生广告请求参数
    const nativeVideoAdReqParams: advertising.AdRequestParams = {
      // 'testu7m3hc4gvm'为测试专用的广告位 ID,应用正式发布时需要改为正式的广告位 ID
      adId: 'testu7m3hc4gvm',
      adType: 3,
      adCount: 1,
      // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
      enableDirectReturnVideoAd: true
    };
    // 广告请求回调监听器
    const adLoaderListener: advertising.AdLoadListener = {
      // 广告请求失败回调
      onAdLoadFailure: (errorCode: number, errorMsg: string) => {
        hilog.error(0x0000, 'testTag', '%{public}s',
          `Failed to request ad, message: ${errorMsg}, error code: ${errorCode}`);
      },
      // 广告请求成功回调
      onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
        hilog.info(0x0000, 'testTag', '%{public}s', `Succeeded in requesting ad`);
        // 调用原生广告展示页面
        routePage('pages/NativeAdPage', ads, adDisplayOptions);
      }
    };
    // 创建 AdLoader 广告对象
    const load: advertising.AdLoader = new advertising.AdLoader(this.context);
    // 调用广告请求接口
    load.loadAd(nativeVideoAdReqParams, adOptions, adLoaderListener);
  }
}

// 异步函数,用于路由到页面
async function routePage(pageUri: string, ads: Array<advertising.Advertisement | null>,
  displayOptions: advertising.AdDisplayOptions) {
  let options: router.RouterOptions = {
    url: pageUri,
    params: {
      ads: ads,
      displayOptions: displayOptions
    }
  };
  try {
    // 推送 URL 进行页面路由
    router.pushUrl(options);
  } catch (error) {
    hilog.error(0x0000, 'testTag', '%{public}s',
      `Failed to routePage callback, code: ${error.code}, msg: ${error.message}`);
  }
}

PS:实际项目中如有出入,请告知博主,博主会第一时间修改得哇~