uniapp 在鸿蒙中,uni.navigateTo不能直接跳转到外部 URL 解决方案
uni.navigateTo 只能跳转到在 pages.json 中注册的应用内页面,不能直接打开外部 http/https 链接,这是框架本身的设计,鸿蒙平台也一样。官方文档明确说明:如果想打开 web url,在 App 平台可以使用 plus.runtime.openURL 或 web-view 组件,参考 uni.navigateTo 兼容性说明 以及 ask 社区的类似问题 uni.navigateTo 跳转外部H5链接 失败。
在鸿蒙端可以用下面两种方案:
方案一:应用内打开,使用 web-view 组件(推荐)
新建一个通用页面承载外部链接,例如 pages/common/webview.vue:
vue复制代码
- <template>
- <web-view :src="url"></web-view>
- </template>
- <script>
- export default {
- data() {
- return {
- url: ''
- }
- },
- onLoad(option) {
- this.url = decodeURIComponent(option.url)
- }
- }
- </script>
在 pages.json 中注册该页面,然后跳转时把外部 URL 作为参数传入:
js复制代码
- uni.navigateTo({
- url: '/pages/common/webview?url=' + encodeURIComponent('https://example.com')
- })
方案二:调起系统浏览器,使用 plus.runtime.openURL
从 uni-app 鸿蒙化技术交流群的实际反馈来看,鸿蒙端通过 plus.runtime.openURL 可以正常调起华为自带浏览器:
js复制代码
- // #ifdef APP
- plus.runtime.openURL('https://example.com', (err) => {
- console.log('openURL fail: ', err)
- })
- // #endif
需要注意,鸿蒙端 plus 仅部分能力可用(群内反馈部分有实现,很多能力需要 uts 自己调),建议加上失败回调做兜底,比如 fail 时降级为方案一的 web-view 方式。可以参考 plus.runtime.openURL 文档。
补充说明:
- 如果你的场景涉及更复杂的应用间跳转(如 Deep Linking、App Linking),可以使用 uts 调用鸿蒙原生能力,参考 鸿蒙应用间跳转。
- 条件编译时注意:鸿蒙平台的标识是 APP-HARMONY,APP 可以命中安卓、iOS、鸿蒙三端,APP-PLUS 不能命中鸿蒙,参考 鸿蒙条件编译说明。
- hello uni-app 中的 ulink.vue 组件已对多端打开链接做了封装,也可以直接参考。

浙公网安备 33010602011771号