HarmonyOS 鸿蒙Next三方包广告关闭解决方案
HarmonyOS 鸿蒙Next三方包广告关闭解决方案 用ArkWeb开发了一个VR类应用,给用户提供景区3D扫描图,是由服务商提供资源包,资源包由全景图和URL构成,进入个别服务商提供的全景图带有横屏广告,关闭广告的按钮在全景图渲染完成后才会出现。被审核打回了,想找个解决方案。
【问题背景】
- 如何关闭ArkWeb里个别服务商提供的全景图带有的横屏广告页
【原理刨析】
- ArkWeb为应用提供广告过滤功能,支持通过云端推送默认的easylist规则,或允许应用通过接口设定自定义规则文件。它在网络层拦截广告资源的下载,或在网页中注入CSS规则以隐藏特定的广告元素。
- 规则来源:支持两种规则配置方式,可单独或组合使用
- 云端推送的默认
easylist规则; - 开发者通过接口自定义的
easylist规则文件。
- 云端推送的默认
- 过滤方式:从两个层面拦截广告
- 网络层:直接拦截广告资源的下载请求;
- 页面层:注入 CSS 规则,隐藏网页中特定的广告元素。
- 配置格式:统一采用
easylist规则格式(行业通用广告过滤规则格式)。
【解决方案】
1、配置easylist规则文件,并开启广告过滤功能
- 示例如下:
// xxx.ets import { webview } from '@kit.ArkWeb'; import { picker, fileUri } from '@kit.CoreFileKit'; // 演示点击按钮,通过filepicker打开一个easylist规则文件并设置到Web组件中 @Entry @Component struct WebComponent { main_url: string = 'https://www.example.com'; controller: webview.WebviewController = new webview.WebviewController(); @State input_text: string = 'https://www.example.com'; build() { Column() { Row() { Flex() { Button({type: ButtonType.Capsule}) { Text("setAdsBlockRules") } .onClick(() => { try { let documentSelectionOptions: ESObject = new picker.DocumentSelectOptions(); let documentPicker: ESObject = new picker.DocumentViewPicker(); documentPicker.select(documentSelectionOptions).then((documentSelectResult: ESObject) => { if (documentSelectResult && documentSelectResult.length > 0) { let fileRealPath = new fileUri.FileUri(documentSelectResult[0]); console.info('DocumentViewPicker.select successfully, uri: ' + fileRealPath); webview.AdsBlockManager.setAdsBlockRules(fileRealPath.path, true); } }) } catch (err) { console.error('DocumentViewPicker.select failed with err:' + err); } }) } } Web({ src: this.main_url, controller: this.controller }) .onControllerAttached(()=>{ this.controller.enableAdsBlock(true); }) } } }
2、使用AdsBlockManager的addAdsBlockDisallowedList()接口关闭特定域名页面的广告过滤
- 示例如下:
// xxx.ets import { webview } from '@kit.ArkWeb'; // 演示通过一个按钮的点击向Web组件设置广告过滤的域名策略 @Entry @Component struct WebComponent { main_url: string = 'https://www.example.com'; text_input_controller: TextInputController = new TextInputController(); controller: webview.WebviewController = new webview.WebviewController(); @State input_text: string = 'https://www.example.com'; build() { Column() { Row() { Flex() { TextInput({ text: this.input_text, placeholder: this.main_url, controller: this.text_input_controller}) .id("input_url") .height(40) .margin(5) .borderColor(Color.Blue) .onChange((value: string) => { this.input_text = value; }) Button({type: ButtonType.Capsule}) { Text("Go") } .onClick(() => { this.controller.loadUrl(this.input_text); }) Button({type: ButtonType.Capsule}) { Text("addAdsBlockDisallowedList") } .onClick(() => { let arrDomainSuffixes = new Array<string>(); arrDomainSuffixes.push('example.com'); arrDomainSuffixes.push('abcdefg.cn'); webview.AdsBlockManager.addAdsBlockDisallowedList(arrDomainSuffixes); }) } } Web({ src: this.main_url, controller: this.controller }) .onControllerAttached(()=>{ this.controller.enableAdsBlock(true); }) } } }
关键接口汇总
| 类 | 接口名称 | 功能描述 |
|---|---|---|
WebviewController |
enableAdsBlock(enable: boolean) |
控制当前 Web 实例的广告过滤开关 |
WebviewController |
onAdsBlocked(回调) |
接收广告拦截信息通知 |
AdsBlockManager |
setAdsBlockRules(path, replace) |
设置自定义 easylist 规则,支持持久化 |
AdsBlockManager |
addAdsBlockDisallowedList(域名) |
添加 “禁止过滤” 域名列表(非持久化) |
AdsBlockManager |
addAdsBlockAllowedList(域名) |
添加 “允许过滤” 域名列表(非持久化,优先级高) |
AdsBlockManager |
clearAdsBlockDisallowedList() |
清空 “禁止过滤” 域名列表 |
AdsBlockManager |
clearAdsBlockAllowedList() |
清空 “允许过滤 |
相关文档:
更多关于HarmonyOS 鸿蒙Next三方包广告关闭解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next应用可通过应用内设置关闭广告。部分应用提供“个性化广告推荐”开关,关闭后减少广告推送。系统级设置中可限制广告标识符(OAID)使用,降低跨应用广告追踪。开发者需遵循鸿蒙广告规范,用户可在应用权限管理中禁用相关广告权限。
针对您使用ArkWeb开发VR应用时遇到的三方资源包内嵌广告导致审核失败的问题,核心在于应用必须确保自身界面(包括通过Web组件加载的内容)符合HarmonyOS应用市场的广告规范与用户体验要求。以下是可行的技术方案与建议:
1. 广告拦截与内容净化(推荐方案)
- 注入JavaScript脚本:在ArkWeb加载URL时,通过
WebController的executeScript方法注入自定义JS代码,监测并移除广告DOM元素。// 示例:监听页面加载完成后移除特定广告元素 webController.executeScript({ script: ` (function() { const observer = new MutationObserver(() => { const ad = document.querySelector('.ad-class'); // 替换为实际广告容器的类名或ID if (ad) { ad.remove(); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true }); })(); ` }); - 拦截网络请求:通过
WebResourceRequest和WebResourceResponse拦截广告资源(如图片、脚本)的加载,直接返回空响应或替换为本地资源。
2. 与资源服务商协商技术对接
- 要求服务商提供无广告版本的全景图资源包或可配置广告开关的接口。例如,在URL中添加自定义参数(如
?ad_enabled=false)控制广告展示。 - 若服务商支持,可通过API动态获取全景图数据,绕过含广告的静态页面。
3. 前端交互优化
- 若广告关闭按钮延迟出现,可通过注入JS脚本模拟点击关闭按钮:
// 循环检测并触发关闭按钮点击 setInterval(() => { const closeBtn = document.querySelector('.ad-close-button'); if (closeBtn) closeBtn.click(); }, 500); - 添加自定义遮罩层:在广告加载期间覆盖Web组件区域,提示用户“加载中”,待广告关闭后再显示全景内容。
4. 审核规避的注意事项
- 确保方案稳定性:广告DOM结构可能变动,需定期更新拦截规则或与服务商保持技术同步。
- 测试多场景:覆盖不同服务商的资源包,验证广告拦截效果。
- 遵循平台规范:HarmonyOS禁止应用强制展示第三方广告,需确保用户无感知广告存在。
5. 备用方案:本地资源替换
- 若服务商资源不可控,考虑将全景图资源提前下载至本地,通过ArkWeb加载本地HTML文件(需确保资源版权合规)。
总结
建议优先采用JS注入+网络请求拦截的组合方案,并与服务商推动技术对接。若无法彻底解决,需评估更换资源服务商的可行性。注意在提交审核时,明确说明已采取广告屏蔽措施,避免因“不可控内容”再次被拒。

