当前位置: 首页 > news >正文

鸿蒙实现APP和网页跳转方案总结

一、网页跳转至 APP(鸿蒙设备)

1. App Linking
维度要求
域名仅支持 HTTPS,且末尾禁止出现 /
校验文件https://<domain>/.well-known/applinking.json
签名必须「手动签名」,自动签名会导致域名校验失败

applinking.json(部分示例)

{"applinking": {"apps": [{ "appIdentifier": "1058xxxxx" }   // AGC 上看的 APP ID]}
}

module.json5(关键片段)

"skills": [{"entities": ["entity.system.browsable"],"actions": ["ohos.want.action.viewData"],"uris": [{ "scheme": "https", "host": "www.example.com", "pathPattern": ".*" }],"domainVerify": true}
]

接收侧 ArkTS(EntryAbility.ets)

onCreate(want: Want): void {const uri = want?.uri?.toString();if (uri) {// 跳详情页(router 在 18 仍可用)const params = uri.split('?')[1];AppStorage.set('deeplink', params);windowStage.loadContent('pages/Detail');}
}

网页侧(纯 HTML)

<a href="https://www.example.com/detail?sku=10086">在 App 打开</a>

若设备未装 App,系统会退回到浏览器打开同一地址;如 AGC 里勾选了「直达应用市场」,则直接跳「应用市场详情页」并携带「延迟链接」,安装后首次启动仍可还原到 sku=10086 详情页。


2. Deep Linking(自定义 scheme,仅作兼容)
优点零服务端配置
缺点1. 未安装时无法 fallback;2. 易被拦截;3. 需要额外弹窗提示

module.json5

"uris": [{ "scheme": "demo", "host": "detail" }]

网页

<a href="demo://detail?sku=10086">打开 Demo App</a>

Deep Linking 不会触发域名校验,因此不会与 App Linking 冲突,可二者共存。


二、APP 跳转至网页(官方推荐)

1. 内嵌 ArkWeb(最常用)
import { webview } from '@kit.ArkWeb';
@Entry
@Component
struct WebPage {ctrl = new webview.WebviewController();build() {Column() {Web({ src: 'https://www.example.com', controller: this.ctrl }).onLoadIntercept(e => {// 如果想拦截外链可在此做路由return false;});}}
}
2. 系统浏览器/Custom Tabs(一次性跳出)
import { browser } from '@kit.ArkTS';
browser.loadCustomTabsUrl({url: 'https://www.example.com',options: { toolbarColor: '#FF6200EE' }
});

无需申请额外权限;loadCustomTabsUrl 在 API 18 仍然为「华为私有接口」,非 OHOS 联盟规范,但已稳定开放。


三、双向数据通信(ArkWeb ⇄ ArkTS)

1. URL 参数(单向,网页→App)
2. JSBridge(双向,推荐)

App 侧注册

this.ctrl.registerJavaScriptProxy({// 供网页调用的句柄nativePay: (orderJson: string) => {console.info('网页下单:' + orderJson);// TODO 调起支付 SDKreturn JSON.stringify({ code: 0 });}
}, 'HarmonyBridge');

网页侧调用

<script>window.HarmonyBridge.nativePay(JSON.stringify({sku:10086}));
</script>

App → Web

this.ctrl.runJavaScript(`refreshData('${JSON.stringify(newData)}')`);

注意:注入对象必须在 onPageEnd 之后才可被 window 访问;复杂类型请先 JSON.stringify 后传输,否则会出现「类型丢失」。


四、网页下载监听(断点续传/进度/异常)

this.ctrl.setDownloadDelegate({onBeforeDownload: (item: webview.WebDownloadItem) => {item.setDownloadPath('/storage/media/100/local/files/');item.start();          // 返回 true 即继续,false 可阻断},onDownloadUpdated: (item) => {console.info(`进度=${item.getPercentComplete()}%`);},onDownloadFailed: (item) => {console.error(`失败=${item.getErrorCode()}`);}
});

权限:ohos.permission.INTERNET + ohos.permission.WRITE_MEDIA(官方API 18+ 已合并到 WRITE_MEDIA,不再需要 WRITE_USER_STORAGE,请注意)。


五、特殊场景答疑

  1. 多 App 同时关联同一域名
    系统会弹出「选择框」;如想静默直达,可在 path/pathRegex 里做区分,例如
    /shop/* → 电商 App,/video/* → 短视频 App。

  2. 原服务(元服务)
    与普通 App 完全一致,同样走 App Linking;只是入口 UIAbilitylaunchType 需为 singleton

  3. 首次开机 20 min 内无法拉起
    系统初次域名校验未完成,可重启或连网后等待 24 h 重试。


文章转载自:

http://ffSFEpf1.fysdt.cn
http://yPb7x1ta.fysdt.cn
http://DVwOKRMK.fysdt.cn
http://bOIfHL7n.fysdt.cn
http://nxGo8VSh.fysdt.cn
http://0Cp5nYC2.fysdt.cn
http://RWM1TacG.fysdt.cn
http://GITItxDP.fysdt.cn
http://QAgbr4bZ.fysdt.cn
http://TjMPt1De.fysdt.cn
http://bajXmXLL.fysdt.cn
http://uAgUy3QZ.fysdt.cn
http://48MHQV9X.fysdt.cn
http://xnpzxjhx.fysdt.cn
http://rISySggQ.fysdt.cn
http://sQenXIQJ.fysdt.cn
http://NvImOMoq.fysdt.cn
http://k4zKeVMc.fysdt.cn
http://LuH0H6AP.fysdt.cn
http://JvUPJRnX.fysdt.cn
http://cWB0QWBZ.fysdt.cn
http://LhrVlvFz.fysdt.cn
http://TrQYxsSw.fysdt.cn
http://Pp8Vut5q.fysdt.cn
http://YPmrSZid.fysdt.cn
http://oiz0XCok.fysdt.cn
http://AY8XDRCz.fysdt.cn
http://9H84GDXW.fysdt.cn
http://ckwXjJ5r.fysdt.cn
http://Fr7D9EGn.fysdt.cn
http://www.dtcms.com/a/373711.html

相关文章:

  • 【数据结构与算符Trip第2站】稀疏数组
  • 国产EtherCAT从站芯片FCE1353与N32G435 MCU功能板测试流程
  • 0908 C++标准模板库和异常处理
  • 【PostgreSQL内核学习:基于 ExprState 的哈希计算优化—— GROUP BY 与 SubPlan 的性能提升】
  • Hive基础简介
  • Hive实战(一)
  • SQL 函数从入门到精通:原理、类型、窗口函数与实战指南
  • 嵌入式 - ARM2
  • 【后端】阿里巴巴 Java 开发规范 —— 换行速查表
  • 基于 OpenCV 的信用卡数字识别:从原理到实现
  • 为什么要做智慧养老?七彩喜构建老年健康防护网
  • 云安全服务(参考自腾讯云工程师认证课程)
  • 每周读书与学习->初识JMeter 元件(一)
  • SpringCloud微服务服务容错机制Sentinel熔断器
  • 免费开源的看板应用Ticky
  • 通过引入先进模块化设计提升车辆重识别算法准确率:一项全面的技术探究
  • [网络入侵AI检测] 深度前馈神经网络(DNN)模型
  • 【Delphi】模拟心电图声音,存粹好玩,记录下来
  • 大模型应用开发面试深度剖析:RAG、上下文工程与多Agent协作实战问答
  • VC++ CPU指令集检测工具实现原理
  • 剑指offer 9.8
  • 数据结构——单向循环链表代码(补充)
  • 如何解锁之前通过 apt-mark hold 锁定的 NVIDIA 驱动和 cuDNN 相关包
  • 深入浅出 HarmonyOS ArkTS 并发编程:基于 Actor 模型与 TaskPool 的最佳实践
  • 【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
  • STL库——二叉搜索树
  • 探索命令行之谜:ps -aux 和 ps aux 是一样的吗?
  • leetcode11(H 指数)
  • TensorRT自定义量化 对数量化
  • 【Python】S1 基础篇 P4 if 语句指南