在 UniApp 中實現 App 與 H5 頁面的跳轉及通信

在移動應用開發中,內嵌 H5 頁面或與外部網頁交互是常見需求。UniApp 作為跨平臺框架,提供了靈活的方式實現 App 與 H5 的跳轉雙向通信。本文將詳細講解實現方法,并提供可直接復用的代碼示例。

文章目錄

  • 一、 App 內嵌 H5 頁面(使用 `web-view` 組件)
  • 二、 App 跳轉外部瀏覽器打開 H5
  • 三、App 與 H5 的雙向通信
  • 四、注意事項和常見問題
  • 五、完整代碼示例
  • 六、總結

一、 App 內嵌 H5 頁面(使用 web-view 組件)

1.核心場景

  • 在 App 內直接顯示第三方活動頁、幫助文檔等。
  • 保持應用內導航體驗,避免跳轉外部瀏覽器。

2.實現步驟
(1)創建 web-view 頁面
在 UniApp 項目中新建頁面 pages/webview/webview.vue

<template><view class="webview-container">// 全屏加載H5頁面<web-viewid="my-webview":src="h5Url"@message="handleH5Message"></web-view></view>
</template><script setup>
import { ref } from 'vue';const h5Url = ref('');onLoad((options) => {// 接收跳轉時傳遞的 URL 參數if(options.url){h5Url.value = decodeURIComponent(options.url);uni.setNavigationBarTitle({ title: options.title || '加載中...'});} else{uni.showToast({ title: '頁面參數錯誤', icon: 'none' });setTimeout(() => uni.navigateBack(), 1500);}
});// 接收 H5 頁面發送的消息
const handleH5Message = (e) => {console.log('收到 H5 消息:', e.detail.data);// 示例:根據消息關閉頁面if(e.detail.data.action === 'close') {uni.navigateBack();}
}
</script>

(2)跳轉到 H5 頁面
在需要跳轉的地方調用:

// 示例:在按鈕點擊事件中跳轉
const openH5Page = () => {const targetUrl = 'https://www.example.com/h5-page';uni.navigateTo({url: `/pages/webview/webview?url=${encodeURIComponent(targetUrl)}&title=活動頁`})
}

二、 App 跳轉外部瀏覽器打開 H5

1.核心場景

  • 用戶協議、隱私政策等需脫離應用環境的頁面
  • 調用第三方支付、地圖等外部服務

2.實現代碼

const openExternalBrowser = (url) => {// 判斷平臺:App 端使用 plus.runtime, H5 端使用 window.openconst platform = uni.getSystemInfoSync().platformif(platform === 'android' || platform === 'ios'){plus.runtime.openURL(url);} else {window.open(url, '_blank');}
}// 調用示例
openExternalBrowser('https://www.example.com/external-page');

三、App 與 H5 的雙向通信

1. H5 向 App 發送消息
(1)H5 頁面代碼
在 H5 頁面中,通過 uni-postMessage 發送消息:

<!DOCTYPE html>
<html>
<body><button onclick="sendMessageToApp()"> 發送消息給 APP</button><script>function sendMessageToApp() {// 發送消息給 UniAppuni.postMessage({data: {action: 'close',message: '用戶點擊了關閉按鈕'}})}</script>
</body>
</html>

(2)UniApp 接收消息
web-view 組件中監聽 @message 事件:

<web-view:src="h5Url"@message="handleH5Message"
></web-view>

2. App 向 H5 發送消息
(1)UniApp 調用 H5 方法
通過 evalJS 執行 H5 頁面的代碼

// 獲取 web-view 上下文(需指定 web-view 的 id)
const webViewContext = uni.createWebViewContext(my-webview);// 調用 H5 頁面中的函數
const sendMessageToH5 = () => {webViewContext.evalJS(handleAppMessage('Hello from App!'))
}

(2)H5 頁面接收消息
在 H5 頁面中定義全局函數:

<script>// 供 App 調用的函數function handleAppMessage(msg){alert('收到 APP 消息:' + msg)}
</script>

四、注意事項和常見問題

1.跨域問題(H5端)

  • 問題:H5 頁面與 UniApp 服務域名不同時,可能觸發跨域限制。
  • 解決方案:
    1.配置 H5 服務端支持 CORS
    2.本地開發時,在 manifest.json 中設置代理
{"h5": {"devServer": {"proxy": {"/api": {"target": "https://api.example.com","changeOrigin": true}}}}
}

2.微信小程序特殊處理

  • 配置域名白名單:在微信公眾平臺設置 request 合法域名和 web-view 業務域名
  • 強制 HTTPS:所有 H5 鏈接必須使用 HTTPS

3.頁面返回邏輯
處理 Android 返回鍵和導航欄返回按鈕

// 監聽 Android 返回鍵
uni.onBackPress(() => {uni.showModel({title: '提示',content: '確定要離開當前頁面嗎?',success: (res) => {if(res.confirm){uni.navigateBack();}}});return true; // 阻止默認返回行為
})

五、完整代碼示例

1. UniApp 項目結構

src/├── pages/│   └── webview/│       └── webview.vue   # web-view 容器頁面└── utils/└── bridge.js         # 封裝通信工具

2.通信工具封裝(bridge.js)

// 封裝通信方法
export const H5Bridge = {// 發送消息到 H5sendToH5: (message) => {const webViewContext = uni.createWebViewContext('h5-container');webViewContext.evalJS(`handleAppMessage(${JSON.stringify(message)})`)},// 接收 H5 消息onH5Message: (callback) => {uni.$on('h5-message', callback);}	
}

六、總結

通過 web-view 組件和 uni.postMessage/evalJS, UniApp 實現了 App 與 H5 頁面的無縫跳轉和雙向通信。關鍵點總結:

  1. 內嵌 H5:保持應用內體驗,適合常規內容展示
  2. 外部跳轉:適合需要調用系統能力的場景(如支付)。
  3. 通信機制:通過消息事件和 JS 執行實現雙向交互

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903271.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot 實現敏感信息脫敏

記錄于2025年4月28號晚上--梧州少帥 1. 定義枚舉類&#xff1a; public enum DesensitizeType {NAME, EMAIL } 2. 創建自定義注解&#xff1a; 用于標記需要脫敏的字段及其類型。 Retention(RetentionPolicy.RUNTIME) JacksonAnnotationsInside JsonSerialize(using Desen…

SNMP協議之詳解(Detailed Explanation of SNMP Protocol)

SNMP協議之詳解 一、前言 SNMP&#xff0c;被形象地喻為網絡世界大的工具箱&#xff0c;使他們能的“智慧守護者”&#xff0c;它為網絡管理員裝備了一套功能強夠實現對網絡設備狀態的實時監控、性能數據的全面收集、遠程配置的靈活管理以及故障事件的即時響應。借助SNMP&…

SpeedyAutoLoot

SpeedyAutoLoot自動拾取插件 SpeedyAutoLoot.lua local AutoLoot CreateFrame(Frame)SpeedyAutoLootDB SpeedyAutoLootDB or {} SpeedyAutoLootDB.global SpeedyAutoLootDB.global or {}local BACKPACK_CONTAINER BACKPACK_CONTAINER local LOOT_SLOT_CURRENCY LOOT_SLOT…

xe-upload上傳文件插件

1.xe-upload地址&#xff1a;文件選擇、文件上傳組件&#xff08;圖片&#xff0c;視頻&#xff0c;文件等&#xff09; - DCloud 插件市場 2.由于開發app要用到上傳文件組件&#xff0c;uni.chooseFile在app上不兼容&#xff0c;所以找到了xe-upload&#xff0c;兼容性很強&a…

Golang|外觀模式和具體邏輯

最終返回的是Document的切片&#xff0c;然后取得Bytes自己再去做反序列化拿到文檔的各種詳細信息。 外觀模式是一種結構型設計模式&#xff0c;它的目的是為復雜的子系統提供一個統一的高層接口&#xff0c;讓外部調用者&#xff08;客戶端&#xff09;可以更簡單地使用子系統…

2025年3月AGI技術月評|技術突破重構數字世界底層邏輯

〔更多精彩AI內容&#xff0c;盡在 「魔方AI空間」 &#xff0c;引領AIGC科技時代〕 本文作者&#xff1a;貓先生 ——當「無限照片」遇上「可控試穿」&#xff0c;我們正在見證怎樣的智能革命&#xff1f; 被低估的進化&#xff1a;開源力量改寫游戲規則 當巨頭們在AGI賽道…

可解釋人工智能(XAI):讓機器決策透明化

在人工智能&#xff08;AI&#xff09;技術飛速發展的今天&#xff0c;AI 系統已經廣泛應用于金融、醫療、交通等多個關鍵領域。然而&#xff0c;隨著 AI 系統的復雜性不斷增加&#xff0c;尤其是深度學習模型的廣泛應用&#xff0c;AI 的“黑箱”問題逐漸凸顯。AI 系統的決策過…

【Go語言】ORM(對象關系映射)庫

github.com/jinzhu/gorm 是 Go 語言中一個非常流行的 ORM&#xff08;對象關系映射&#xff09;庫&#xff0c;用于簡化與關系型數據庫的交互。以下是關于它的關鍵信息&#xff1a; 核心特點 全功能 ORM 支持主流數據庫&#xff1a;MySQL、PostgreSQL、SQLite、SQL Server 等。…

大數據企業實驗室管理的痛點 質檢LIMS系統在大數據企業的應用

在數字化轉型浪潮中&#xff0c;大數據企業正面臨海量數據管理與質量控制的雙重挑戰。實驗室作為數據生產的核心環節&#xff0c;其檢測流程的規范化、數據處理的智能化直接關系到企業數據資產的可靠性。質檢LIMS&#xff08;實驗室信息管理系統&#xff09;通過整合實驗室資源…

在Arduino U8g2庫中顯示中文的方法

U8g2庫支持中文顯示&#xff0c;但需要手動添加中文字體或使用內置的有限中文字符。以下是具體實現方法&#xff1a; 方法一 使用U8g2內置的中文字體&#xff08;不推薦&#xff09; 缺點&#xff1a;內置字體支持的漢字較少&#xff0c;可能無法顯示所有需要的字符。不推薦。…

自動駕駛分級

一、美國 SAE J3016 Taxonomy and Definitions for Terms Related to Driving Automation Systems for On-Road Motor Vehicles(2021) 1、駕駛自動化級別&#xff08;Levels of Driving Automation&#xff09; 共分為 6 個級別&#xff0c;從 無自動化&#xff08;0&#…

工業園區工廠企業數字IP廣播應急呼叫對講系統:數字IP廣播極大提升工廠企業管理效率與應急響應效能

工業園區工廠企業數字IP廣播應急呼叫對講系統:數字IP廣播極大提升工廠企業管理效率與應急響應效能 北京海特偉業科技有限公司任洪卓發布于2025年4月28日 在數字化轉型浪潮下&#xff0c;IP應急廣播呼叫對講廣播系統憑借其網絡化、智能化、融合化、多元化等優勢&#xff0c;已…

DNS主從同步及解析

DNS 域名解析原理 域名系統的層次結構 &#xff1a;DNS 采用分層樹狀結構&#xff0c;頂級域名&#xff08;如.com、.org、.net 等&#xff09;位于頂層&#xff0c;下面是二級域名、三級域名等。例如&#xff0c;在域名 “www.example.com” 中&#xff0c;“com” 是頂級域名…

再看 BBR 到 BBRv3 的公平性改進

從看一篇論文開始&#xff1a;Performance Evaluation of TCP BBRv3 in Networks with Multiple Round Trip Times&#xff0c;結論比較悲觀&#xff1a; 雖然 BBRv2/3 試圖解決 BBRv1 的公平性問題&#xff0c;但結果依舊不夠理想&#xff0c;BBR 的迭代依舊任重而道遠。 BB…

locust壓力測試

安裝 pip install locust驗證是否安裝成功 locust -V使用 網上的教程基本上是前幾年的&#xff0c;locust已經更新了好幾個版本&#xff0c;有點過時了&#xff0c;在此做一個總結 啟動 默認是使用瀏覽器進行設置的 # 使用瀏覽器 locust -f .\main.py其他參數 Usage: locust […

優先隊列和單調隊列(雙端隊列實現的)

這里寫自定義目錄標題 一、優先隊列與單調隊列二、優先隊列2.1 概念2.2 增刪查 判空2.3 示例代碼 三、雙端隊列四、單調隊列4.1 單調遞增隊列4.2 單調遞減隊列 一、優先隊列與單調隊列 二、優先隊列 2.1 概念 一種特殊的隊列&#xff0c;它與普通隊列的主要區別在于元素的出…

如何在idea中寫spark程序

在 IntelliJ IDEA 中編寫 Spark 程序是一個高效且便捷的方式&#xff0c;以下是一個詳細的步驟指南&#xff0c;幫助你在 IntelliJ IDEA 中創建和運行 Spark 程序。 一、環境準備 安裝 Java&#xff1a; 確保已經安裝了 JDK 1.8 或更高版本。可以通過以下命令檢查&#xff1a;…

BERT BERT

BERT ***** 2020年3月11日更新&#xff1a;更小的BERT模型 ***** 這是在《深閱讀的學生學得更好&#xff1a;預訓練緊湊模型的重要性》&#xff08;arXiv:1908.08962&#xff09;中提到的24種較小規模的英文未分詞BERT模型的發布。 我們已經證明&#xff0c;標準的BERT架構和…

SpringBoot啟動警告:OpenJDK 64-Bit Server VM warning

問題描述 以Debug模式啟動Spring boot項目之后&#xff0c;日志打印&#xff1a;OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended&#xff0c; 警告信息 解決方案&#xff1a;配置VM opt…

“該虛擬機似乎正在使用中“

當某一天打開虛擬機突然彈出"該虛擬機似乎正在使用中"。 遇到這種問題的解決方法很簡單&#xff0c;出現這種問題是因為錯誤關閉虛擬機導致&#xff0c;當我們點擊獲取所有權時發現不能解決問題。這里分享一種簡單的解決方法。 打開虛擬機的文件目錄 找到lck文件夾下…