uni |
您所在的位置:网站首页 › uniapp基于什么 › uni |
uni-app和原生App混合开发问题
首先务必确认uni-app和原生代码,谁是主谁是从的问题。 1、如果你的应用是uni-app开发的,需要扩展一些原生能力,那么首先去插件市场看看有没有现成的插件,如果没有,就自己开发,开发文档请参考原生插件开发教程https://nativesupport.dcloud.net.cn/NativePlugin/course/android。 2、如果你的App是原生开发的,部分功能栏目想通过uni-app实现,有2种方式: 在原生App里集成uni小程序sdk,参考:https://nativesupport.dcloud.net.cn/README,相当于原生app拥有了小程序能力。如果不想集成原生sdk,那就把uni-app代码发布成H5方式,在原生App里通过webview打开。 原生插件开发现在我们只讨论第一种情况,应用是uni-app开发的,需要扩展一些原生能力,即原生插件开发。 开发者须知 已经具备了相应Android应用开发经验,使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 能开发uni-app。开发环境 JAVA环境 jdk1.8Android StudioApp离线SDK下载:请下载2.9.8+版本的android平台SDK注意 插件目前暂时不支持Kotlingradle版本注意事项 HX3.0.0+版本云打包及相应版本SDK都将gradle版本4.6-all升级到6.5-all,tools.build:gradle版本3.2.1升级到4.1.1。 步骤 一、uni-app端既然以uni-app开发主体,首先要有一个uni-app项目,新建项目testApp。 扩展 Module Module 扩展 非 UI 的特定功能 创建Android Studio的Module模块 在现有Android项目中创建library的Module。例如uniplugin_module配置刚创建的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主要依赖库,必须导入此依赖库! 创建TestModule类 Module 扩展必须继承 UniModule 类 示例: public class TestModule extends UniModule 扩展方法必须加上@UniJSMethod (uiThread = false or true) 注解。UniApp 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。UniApp是根据反射来进行调用 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; }同样因为是通过反射调用,Module 不能被混淆。请在混淆文件中添加代码: -keep public class * extends io.dcloud.feature.uniapp.common.UniModule{*;}Module 扩展的方法可以使用 int, double, float, String, Map, List ,com.alibaba.fastjson.JSONObject 类型的参数 二、原生android端在下载的离线SDK项目中修改 三、插件调试本地注册插件 以上两种方式选一即可 第一种方式 在UniPlugin-Hello-AS工程下 “app” Module根目录assets/dcloud_uniplugins.json文件。 在moudles节点下 添加你要注册的Module 或 Component第二种方式 创建一个实体类并实现UniAppHookProxy接口,在onCreate函数中添加组件注册相关参数 或 填写插件需要在启动时初始化的逻辑。 在UniPlugin-Hello-AS工程下 “app” Module根目录assets/dcloud_uniplugins.json文件,在hooksClass节点添加你创建实现UniAppHookProxy接口的实体类完整名称填入其中即可 (有些需要初始化操作的需求可以在此处添加逻辑,无特殊操作仅使用第一种方式注册即可无需集成UniAppHookProxy接口) public class RichAlert_AppProxy implements UniAppHookProxy { @Override public void onCreate(Application application) { //当前uni应用进程回调 仅触发一次 多进程不会触发 //可通过UniSDKEngine注册UniModule或者UniComponent } @Override public void onSubProcessCreate(Application application) { //其他子进程初始化回调 可用于初始化需要子进程初始化需要的逻辑 } }dcloud_uniplugins.json说明 nativePlugins: 插件跟节点 可存放多个插件 hooksClass: 生命周期代理(实现AppHookProxy接口类)格式(完整包名加类名) plugins: 插件数组 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+ 创建uni-app工程或在已有的uni-app工程编写相关的.nvue 和.vue文件。使用uni-app插件中的module 或 component。 xxx.vue 示例代码(源码请参考UniPlugin-Hello-AS项目中uniapp示例工程源码文件夹的unipluginDemo工程) 选择 发行—>原生APP-本地打包—>生成本地打包App资源 等待资源生成! 在控制台会输出编译日志,编译成功会给出App资源路径 把APP资源文件放入到UniPlugin-Hello-AS工程下 app Module根目录assets/apps/测试工程appid/www对应目录下,再修改assets/data/dcloud_control.xml!修改其中appid=“测试工程appid”!,测试工程UniPlugin-Hello-AS 已有相关配置可参考。具体可查看App离线打包。 appid注意 一定要统一否则会导致应用无法正常运行! 配置"app"Module下的 build.gradle. 在dependencies节点添加插件project引用 (以uniplugin_richalert为例) // 添加uni-app插件 implementation project(':uniplugin_richalert') 运行测试。测试运行时一切要以真机运行为主 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |