網(wǎng)站首頁 編程語言 正文
uni-app和原生App混合開發(fā)問題
首先務必確認uni-app和原生代碼,誰是主誰是從的問題。
1、如果你的應用是uni-app開發(fā)的,需要擴展一些原生能力,那么首先去插件市場看看有沒有現(xiàn)成的插件,如果沒有,就自己開發(fā),開發(fā)文檔請參考原生插件開發(fā)教程https://nativesupport.dcloud.net.cn/NativePlugin/course/android。
2、如果你的App是原生開發(fā)的,部分功能欄目想通過uni-app實現(xiàn),有2種方式:
- 在原生App里集成uni小程序sdk,參考:https://nativesupport.dcloud.net.cn/README,相當于原生app擁有了小程序能力。
- 如果不想集成原生sdk,那就把uni-app代碼發(fā)布成H5方式,在原生App里通過webview打開。
原生插件開發(fā)
現(xiàn)在我們只討論第一種情況,應用是uni-app開發(fā)的,需要擴展一些原生能力,即原生插件開發(fā)。
開發(fā)者須知
- 已經(jīng)具備了相應Android應用開發(fā)經(jīng)驗,使用Android Studio開發(fā)過Android原生。
- 也應該對HTML,JavaScript,CSS等有一定的了解, 能開發(fā)uni-app。
開發(fā)環(huán)境
- JAVA環(huán)境 jdk1.8
- Android Studio
- App離線SDK下載:請下載2.9.8+版本的android平臺SDK
注意
- 插件目前暫時不支持Kotlin
- gradle版本注意事項
HX3.0.0+版本云打包及相應版本SDK都將gradle版本4.6-all升級到6.5-all,tools.build:gradle版本3.2.1升級到4.1.1。
步驟
一、uni-app端
既然以uni-app開發(fā)主體,首先要有一個uni-app項目,新建項目testApp。
擴展 Module
Module 擴展 非 UI 的特定功能
創(chuàng)建Android Studio的Module模塊
- 在現(xiàn)有Android項目中創(chuàng)建library的Module。例如uniplugin_module
- 配置剛創(chuàng)建的Module的build.gradle信息。
示例:
//導入aar需要的配置
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
//必須添加的依賴
compileOnly 'com.android.support:recyclerview-v7:28.0.0'
compileOnly 'com.android.support:support-v4:28.0.0'
compileOnly 'com.android.support:appcompat-v7:28.0.0'
compileOnly 'com.alibaba:fastjson:1.1.46.android'
compileOnly fileTree(include: ['uniapp-v8-release.aar'], dir: '../app/libs')
}
Tips:
uniapp-v8-release.aar是擴展module主要依賴庫,必須導入此依賴庫!
創(chuàng)建TestModule類
Module 擴展必須繼承 UniModule 類
示例:
public class TestModule extends UniModule
- 擴展方法必須加上@UniJSMethod (uiThread = false or true) 注解。UniApp 會根據(jù)注解來判斷當前方法是否要運行在 UI 線程,和當前方法是否是擴展方法。
- UniApp是根據(jù)反射來進行調(diào)用 Module 擴展方法,所以Module中的擴展方法必須是 public 類型。
示例:
//run ui thread
@UniJSMethod(uiThread = true)
public void testAsyncFunc(JSONObject options, UniJSCallback callback) {
Log.e(TAG, "testAsyncFunc--"+options);
if(callback != null) {
JSONObject data = new JSONObject();
data.put("code", "success");
callback.invoke(data);
}
}
//run JS thread
@UniJSMethod (uiThread = false)
public JSONObject testSyncFunc(){
JSONObject data = new JSONObject();
data.put("code", "success");
return data;
}
同樣因為是通過反射調(diào)用,Module 不能被混淆。請在混淆文件中添加代碼:
-keep public class * extends io.dcloud.feature.uniapp.common.UniModule{*;}
Module 擴展的方法可以使用 int, double, float, String, Map, List ,com.alibaba.fastjson.JSONObject 類型的參數(shù)
二、原生android端
在下載的離線SDK項目中修改
三、插件調(diào)試
本地注冊插件
以上兩種方式選一即可
- 第一種方式
在UniPlugin-Hello-AS工程下 “app” Module根目錄assets/dcloud_uniplugins.json文件。 在moudles節(jié)點下 添加你要注冊的Module 或 Component - 第二種方式
創(chuàng)建一個實體類并實現(xiàn)UniAppHookProxy接口,在onCreate函數(shù)中添加組件注冊相關(guān)參數(shù) 或 填寫插件需要在啟動時初始化的邏輯。
在UniPlugin-Hello-AS工程下 “app” Module根目錄assets/dcloud_uniplugins.json文件,在hooksClass節(jié)點添加你創(chuàng)建實現(xiàn)UniAppHookProxy接口的實體類完整名稱填入其中即可 (有些需要初始化操作的需求可以在此處添加邏輯,無特殊操作僅使用第一種方式注冊即可無需集成UniAppHookProxy接口)
public class RichAlert_AppProxy implements UniAppHookProxy {
@Override
public void onCreate(Application application) {
//當前uni應用進程回調(diào) 僅觸發(fā)一次 多進程不會觸發(fā)
//可通過UniSDKEngine注冊UniModule或者UniComponent
}
@Override
public void onSubProcessCreate(Application application) {
//其他子進程初始化回調(diào) 可用于初始化需要子進程初始化需要的邏輯
}
}
dcloud_uniplugins.json說明
nativePlugins: 插件跟節(jié)點 可存放多個插件
hooksClass: 生命周期代理(實現(xiàn)AppHookProxy接口類)格式(完整包名加類名)
plugins: 插件數(shù)組
name : 注冊名稱
class : module 或 component 實體類完整名稱
type : module 或 component類型。
{
"nativePlugins": [
{
"hooksClass": "uni.dcloud.io.uniplugin_richalert.apphooks",
"plugins": [
{
"type": "module",
"name": "DCloud-RichAlert",
"class": "uni.dcloud.io.uniplugin_richalert.RichAlertModule"
}
]
}
]
}
四、集成uni-app項目測試插件
-
安裝最新HbuilderX 大于等于1.4.0+
-
創(chuàng)建uni-app工程或在已有的uni-app工程編寫相關(guān)的.nvue 和.vue文件。使用uni-app插件中的module 或 component。
-
xxx.vue 示例代碼(源碼請參考UniPlugin-Hello-AS項目中uniapp示例工程源碼文件夾的unipluginDemo工程)
-
選擇 發(fā)行—>原生APP-本地打包—>生成本地打包App資源 等待資源生成!
-
在控制臺會輸出編譯日志,編譯成功會給出App資源路徑
-
把APP資源文件放入到UniPlugin-Hello-AS工程下 app Module根目錄assets/apps/測試工程appid/www對應目錄下,再修改assets/data/dcloud_control.xml!修改其中appid=“測試工程appid”!,測試工程UniPlugin-Hello-AS 已有相關(guān)配置可參考。具體可查看App離線打包。
-
appid注意 一定要統(tǒng)一否則會導致應用無法正常運行!
-
配置"app"Module下的 build.gradle. 在dependencies節(jié)點添加插件project引用 (以uniplugin_richalert為例)
// 添加uni-app插件
implementation project(':uniplugin_richalert')
- 運行測試。測試運行時一切要以真機運行為主
原文鏈接:https://blog.csdn.net/yu75567218/article/details/113345522
相關(guān)推薦
- 2022-03-03 text-overflow:ellipsis,當對象內(nèi)文本溢出時顯示省略標記(...)
- 2022-03-21 .NetCore使用Swagger+API多版本控制的流程分析_實用技巧
- 2022-12-12 flutter中如何使用和擴展ThemeData實現(xiàn)詳解_Dart
- 2022-12-29 react如何將字符串轉(zhuǎn)義成html語句_React
- 2022-03-31 Python基礎(chǔ)中的列表你了解嗎_python
- 2022-05-06 SQL語句獲取表結(jié)構(gòu)
- 2024-02-26 IDEA隱藏指定文件/文件夾
- 2022-07-06 c#?模擬串口通信?SerialPort的實現(xiàn)示例_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支