uni-app 中適配 App 平臺

文章目錄

  • 前言
    • ? 1. App 使用的 Runtime 架構:**WebView + 原生容器(plus runtime)**
      • 📌 技術棧核心:
    • ? 2. WebView + Native 的通信機制詳解(JSBridge)
      • 📤 Web → Native 調用(JS 調原生)
      • 📥 Native → Web 回調
    • ? 3. App 平臺打包說明
    • ? 4. uni-app 的 App 通信示意圖:
    • 🧠 補充說明
    • ? 一、前端 JS 調用 Native 插件示例
    • ? 二、Android 插件實現(Java)
      • 📄 1. 創建插件類:`MyPlugin.java`
      • 📄 2. 插件注冊(`AndroidManifest.xml`)
    • ? 三、iOS 插件實現(Swift)
      • 📄 1. 創建插件類:`MyPlugin.swift`
      • 📄 2. 插件注冊
    • ? 四、文件結構建議(uni\_modules)
      • 📄 `main.js` 示例
    • ? 五、注意事項


前言

uni-app 中適配 App 平臺(即打包生成 iOS/Android 原生應用)時,使用的是一種混合開發架構(Hybrid App Runtime),其核心是:


? 1. App 使用的 Runtime 架構:WebView + 原生容器(plus runtime)

📌 技術棧核心:

  • 前端代碼運行在 WebView 中(HTML + CSS + JS 渲染);
  • 原生能力(攝像頭、定位、藍牙、支付等)通過 plus.* API 調用;
  • Web 層與 Native 層之間通過 JSBridge 通信機制 實現雙向調用;

這類架構被稱為“HTML5+ Runtime”,是 DCloud 自研的一種 增強型 WebView 容器


? 2. WebView + Native 的通信機制詳解(JSBridge)

📤 Web → Native 調用(JS 調原生)

  • 使用 plus.xxx(如 plus.camera.getCamera())來發起調用;
  • DCloud 注入了 plus 對象到 WebView 的 JS 全局作用域;
  • JS 觸發調用 → Native 捕捉到請求 → 執行原生功能 → 可異步返回結果到 JS。

📥 Native → Web 回調

  • 原生模塊執行完成后,通過 evalJS()postMessage() 回調到 Web;
  • uni-app 框架統一管理回調,開發者通常不需要手動維護 bridge 通道。

? 3. App 平臺打包說明

平臺說明
Android使用 Android WebView + Java 實現容器,集成 H5+ SDK。\n打包工具:HBuilderX、CLI 構建 App 包(.apk)
iOS使用 WKWebView + Objective-C 實現容器,集成 H5+ SDK。\n打包生成 .ipa 包,支持上架 App Store
plus API統一封裝攝像頭、位置、文件系統、藍牙、推送、支付等原生能力
Native 插件可編寫自定義原生插件,使用 Java(Android)或 Swift(iOS)開發,通過 JSBridge 調用

? 4. uni-app 的 App 通信示意圖:

[ WebView 頁面(Vue) ]↓   JS 調用[ plus.xxx API ]↓
[ JSBridge 通道 ]↓
[ 原生模塊(如 Camera、Push、BLE) ]↑結果回調通過 JSBridge → JS

🧠 補充說明

項目uni-app App 平臺表現
性能基于 WebView,復雜場景性能略遜于原生,但普通業務流暢運行無礙
原生擴展支持自定義 Native 插件 + 云插件市場
通信機制類似于 React Native 的 bridge,不過由 DCloud 完全封裝,對開發者透明
安全plus API 具備權限校驗機制,需在 manifest.json 配置權限聲明

完整示例,展示在 uni-app 中的 App 端如何通過 JS 與 Native 插件(Java/Android 或 Swift/iOS)進行通信,包括:

  • 前端 JS 如何調用原生方法;
  • Android 原生插件如何實現;
  • iOS 原生插件如何實現;
  • 插件注冊與 manifest 配置說明。

? 一、前端 JS 調用 Native 插件示例

// 調用自定義插件 myPlugin.hello
uni.callNativePlugin('myPlugin', 'hello', { name: 'IT iPower' }, res => {console.log('原生返回結果:', res)
})

? 也可以使用 uniModules 提供的 Promise 封裝方式(推薦):

import MyPlugin from '@/uni_modules/myPlugin/js_sdk/main.js'MyPlugin.hello({ name: 'IT iPower' }).then(res => {console.log('調用成功', res)
})

? 二、Android 插件實現(Java)

📄 1. 創建插件類:MyPlugin.java

package io.dcloud.uniapp.plugins;import android.content.Context;
import android.widget.Toast;import org.json.JSONObject;import io.dcloud.feature.uniapp.common.UniModule;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;public class MyPlugin extends UniModule {@UniJSMethod(uiThread = true)public void hello(JSONObject options) {String name = options.optString("name", "世界");Toast.makeText(mUniSDKInstance.getContext(), "你好," + name, Toast.LENGTH_SHORT).show();// 向 JS 回傳值(如有回調)JSONObject result = new JSONObject();try {result.put("msg", "來自 Android 原生的問候");} catch (Exception e) {}this.invokeCallback(options, result);}
}

📌 說明:使用 @UniJSMethod 注解的方法可在 JS 中被調用。

📄 2. 插件注冊(AndroidManifest.xml

<service android:name="io.dcloud.uniapp.plugins.MyPlugin" />

或者在 manifest.jsonapp-plus.modules 中聲明:

"app-plus": {"modules": {"myPlugin": "io.dcloud.uniapp.plugins.MyPlugin"}
}

? 三、iOS 插件實現(Swift)

📄 1. 創建插件類:MyPlugin.swift

import Foundation
import UIKit@objc(MyPlugin)
class MyPlugin: NSObject {@objc func hello(_ options: NSDictionary, callback: @escaping FlutterResult) {let name = options["name"] as? String ?? "世界"DispatchQueue.main.async {let alert = UIAlertController(title: "Hello", message: "你好,\(name)", preferredStyle: .alert)alert.addAction(UIAlertAction(title: "OK", style: .default))UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true)}let result: [String: Any] = ["msg": "來自 iOS 原生的問候"]callback(result)}
}

📄 2. 插件注冊

manifest.json 中配置模塊映射:

"app-plus": {"modules": {"myPlugin": "MyPlugin"}
}

? 四、文件結構建議(uni_modules)

uni_modules/
└── myPlugin/├── js_sdk/│   └── main.js        // JS SDK 封裝調用├── android/│   └── MyPlugin.java├── ios/│   └── MyPlugin.swift└── manifest.json      // 插件聲明

📄 main.js 示例

function hello(data = {}) {return new Promise((resolve, reject) => {uni.callNativePlugin('myPlugin', 'hello', data, res => {resolve(res)})})
}export default {hello
}

? 五、注意事項

項目說明
HBuilderX 調試支持真機調試原生插件,使用“運行到手機”
自定義插件封裝建議使用 uni_modules 統一結構
插件通信安全注意參數校驗、平臺判斷、異常處理
插件分發可上傳到 DCloud 插件市場

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

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

相關文章

SpringBoot基礎(靜態資源導入)

靜態資源導入 在WebMvcAutoConfiguration自動配置類中 有一個添加資源的方法&#xff1a; public void addResourceHandlers(ResourceHandlerRegistry registry) { //如果靜態資源已經被自定義了&#xff0c;則直接生效if (!this.resourceProperties.isAddMappings()) {logg…

基于OpenCV的人臉識別:LBPH算法

文章目錄 引言一、概述二、代碼實現1. 代碼整體結構2. 導入庫解析3. 訓練數據準備4. 標簽系統5. 待識別圖像加載6. LBPH識別器創建7. 模型訓練8. 預測執行9. 結果輸出 三、 LBPH算法原理解析四、關鍵點解析五、改進方向總結 引言 人臉識別是計算機視覺領域的一個重要應用&…

ElasticSearch重啟之后shard未分配問題的解決

以下是Elasticsearch重啟后分片未分配問題的完整解決方案&#xff0c;結合典型故障場景與最新實踐&#xff1a; 一、快速診斷定位 ?檢查集群狀態 GET /_cluster/health?pretty # status為red/yellow時需關注unassigned_shards字段值 ? 2.查看未分配分片詳情 …

CSS- 3.1 盒子模型-塊級元素、行內元素、行內塊級元素和display屬性

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 點…

Git/GitLab日常使用的命令指南來了!

在 GitLab 中拉取并合并代碼的常見流程是通過 Git 命令來完成的。以下是一個標準的 Git 工作流&#xff0c;適用于從遠程倉庫&#xff08;如 GitLab&#xff09;拉取代碼、切換分支、合并更新等操作。 &#x1f310; 一、基礎命令&#xff1a;拉取最新代碼 # 拉取遠程倉庫的所…

HTML 表格與div深度解析區別及常見誤區

一、HTML<div>元素詳解 <div>是HTML中最基本的塊級容器元素&#xff0c;本身沒有語義&#xff0c;主要用于組織和布局頁面內容。以下是其核心用法&#xff1a; 1. 基礎結構與特性 <div><!-內部可包含任意HTML元素 --><h2>標題</h2><p…

mybatisPlus 新增時 其他字段的值和 id 保持一致實現方法

MyBatis-Plus 實現 sp_id_path 與 id 同步的方案 要實現新增時 sp_id_path 自動與 id 保持一致&#xff0c;需要在實體類和插入邏輯中做相應處理。MyBatis-Plus 提供了幾種方式來實現這一需求&#xff1a; 方案一&#xff1a;使用 MyBatis-Plus 的自動填充功能 這是最優雅的…

蘭亭妙微設計:為生命科技賦予人性化的交互語言

在醫療科技日新月異的今天&#xff0c;卓越的硬件性能唯有匹配恰如其分的交互語言&#xff0c;方能真正發揮價值。作為專注于醫療UI/UX設計的專業團隊&#xff0c;蘭亭妙微設計&#xff08;www.lanlanwork.com&#xff09;始終相信&#xff1a;每一處像素的排布&#xff0c;都應…

Tcping詳細使用教程

Tcping詳細使用教程 下載地址 https://download.elifulkerson.com/files/tcping/0.39/在windows環境下安裝tcping 在以上的下載地中找到exe可執行文件&#xff0c;其中tcping.exe適用于32位Windows系統&#xff0c;tcping64.exe適用于64位Windows操作系統。 其實tcping是個…

springCloud/Alibaba常用中間件之Seata分布式事務

文章目錄 SpringCloud Alibaba:依賴版本補充Seata處理分布式事務(AT模式)AT模式介紹核心組件介紹AT的工作流程&#xff1a;兩階段提交&#xff08;**2PC**&#xff09; Seata-AT模式使用Seata(2.0.0)下載、配置和啟動Seata案例實戰前置代碼添加全局注解 GlobalTransactional Sp…

COMSOL隨機參數化表面流體流動模擬

基于粗糙度表面的裂隙流研究對于理解地下水的流動、污染物傳輸以及與之相關的地質災害&#xff08;如滑坡&#xff09;等方面具有重要意義。本研究通過蒙特卡洛方法生成隨機表面形貌&#xff0c;并利用COMSOL Multiphysics對隨機參數化表面的微尺度流體流動進行模擬。 參數化…

初識——QT

QT安裝方法 一、項目創建流程 創建項目 入口&#xff1a;通過Qt Creator的歡迎頁面或菜單欄&#xff08;文件→新建項目&#xff09;創建新項目。 項目類型&#xff1a;選擇「Qt Widgets Application」。 路徑要求&#xff1a;項目路徑需為純英文且不含特殊字符。 構建系統…

7-15 計算圓周率

π?131?352!?3573!??357?(2n1)n!?? 輸入格式&#xff1a; 輸入在一行中給出小于1的閾值。 輸出格式&#xff1a; 在一行中輸出滿足閾值條件的近似圓周率&#xff0c;輸出到小數點后6位。 輸入樣例&#xff1a; 0.01輸出樣例&#xff1a; 3.132157 我的代碼 #i…

【圖片識別工具】批量單據識別批量重命名,批量OCR識別圖片文字并重命名,批量改名工具的使用步驟和注意事項

一、適用場景 ??財務與發票管理??&#xff1a;企業需處理大量電子發票或掃描件&#xff0c;通過OCR識別發票代碼、金額等關鍵信息&#xff0c;自動重命名為發票號_金額.pdf格式&#xff0c;便于歸檔與稅務審計。 ??物流單據處理??&#xff1a;物流公司需從運單中提取單…

Modbus TCP轉Profinet網關:數字化工廠異構網絡融合的核心樞紐

在現代工業生產中&#xff0c;隨著智能制造和工業互聯網的不斷發展&#xff0c;數字化工廠成為了制造業升級的重要方向。數字化工廠的核心在于實現設備、數據和人的互聯互通&#xff0c;而這其中&#xff0c;通信協議扮演著至關重要的角色。今天&#xff0c;我們就來探討開疆智…

win11平臺下的docker-desktop中的volume位置問題

因為需要搞個本地的mysql數據庫&#xff0c;而且本地安裝的程序較多&#xff0c;不想再安mysql了&#xff0c;就想到使用docker來安裝。而且因為數據巨大&#xff0c;所以想到直接使用轉移data文件夾的方式。 各種查詢&#xff0c;而且還使用ai查詢&#xff0c;他們都提到&…

【MySQL】項目實踐

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;MySQL 文章目錄 1. 項目實踐概述1.1 項目實踐的重要性1.2 項目中MySQL的典型應用場景 2. 數據庫設計流程2.1 需求分析與規劃2.2 設計過程示例2.3 數據庫設計工具 3. 電子商務平臺實踐案例3.1 系統架構3.2 數據庫Schema設計3.3 數…

React學習———CSS Modules(樣式模塊化)

CSS Modules CSS Modules&#xff08;樣式模塊化&#xff09;是一種用于模塊化和局部作用域化CSS樣式的技術&#xff0c;讓CSS只在當前組件內生效&#xff0c;避免全局樣式沖突的技術方案 工作原理 文件命名&#xff1a;通常以.module.css、.module.less、.module.scss等結尾…

agent 智能體應用產品:生圖、生視頻、代碼等

生圖片 Lovart&#xff1a;全球首個設計 Agent https://www.lovart.ai/ 生視頻 AI 視頻 Agent 產品&#xff1a;Medeo https://www.medeo.app/ 代碼 vscode copilot、cursor、trae 其他research manus grok等各個大模型產品

青少年ctf平臺應急響應-應急響應2

題目&#xff1a; 當前服務器被創建了一個新的用戶&#xff0c;請提交新用戶的用戶名&#xff0c;得到的結果 ssh rootchallenge.qsnctf.com -p 30327 這個命令用于通過 SSH 協議連接到指定的遠程服務器。具體解釋如下&#xff1a; ssh&#xff1a;這是在 Unix-like 系統中…