uniapp 原生插件介绍
-
官网文档杂而分散,本文会逐一附上相关链接。 uniapp 原生插件介绍
-
下载HBuilderX 和 Android 平台离线 SDK,注意版本号必须一致,否则本地运行的 app 会弹框提示版本不一致。 下载链接
插件类型 module vs component
总结:
module 适用于绝大多数场景,封装原生 API 给 vue 调用,抑或是直接启动原生界面,android 的 startActivity。
component 适用于封装原生控件给vue调用,大多数为vue内嵌原生控件。
示例工程介绍
- 离线 SDK 包下载下来有三个示例工程,这里仅介绍 UniPlugin-Hello-AS 工程
app 目录下的libs 为 uniapp 平台相关的 aar 包,assets 目录为 HBuilderX vue 工程导出的资源。
__UNI_7A08102 为系统自动分配的 appId, data 目录下 dcloud_control.xml 需要与资源文件夹保持一致。
<app appid="__UNI__7A08102" appver=""/>
dcloud_uniplugins.json 为本地插件注册文件,app module 除了本地依赖插件module之外,还需要手动编辑此文件完成注册,这样 asseets 下的 js 代码才能成功加载原生插件代码。
譬如BJY-LiveUI 和 BJY-VideoPlayer 为笔者新开发的插件,为了能本地调试需要手动配置。
{
"nativePlugins": [
{
"plugins": [{
"type": "module",
"name": "BJY-LiveUI",
"class": "com.baijiayun.uniplugin.liveui.LiveUiModule"
}],
"hooksClass": "com.baijiayun.uniplugin.liveui.LiveUIAppProxy"
},
{
"hooksClass": "com.baijiayun.uniplugin.videoplayer.VideoPlayerAppProxy",
"plugins": [
{
"type": "module",
"name": "BJY-VideoPlayer",
"class": "com.baijiayun.uniplugin.videoplayer.VideoPlayerModule"
}
]
},
{
"plugins": [
{
"type": "module",
"name": "TestModule",
"class": "io.dcloud.uniplugin.TestModule"
}
]
},
]
}
同时需要 implementation 插件module
implementation project(':uniplugin_liveui')
- 插件 module 介绍
插件如需在 application里初始化代码,需要继承自 UniAppHookProxy。
public class LiveUIAppProxy implements UniAppHookProxy {
@Override
public void onCreate(Application application) {
// 可写初始化触发逻辑
LiveSDK.init(application);
}
@Override
public void onSubProcessCreate(Application application) {
//子进程初始化回调
}
}
暴露原生 API 给 vue,需要继承自 UniModule,函数必须是 public,并且加此注解
@UniJSMethod(uiThread = true)
public class LiveUiModule extends UniModule {
/**
* 三分屏模板-参加码加入
* @param code 参加码
* @param userName 用户名
*/
@UniJSMethod(uiThread = true)
public void startLiveTripleTemplateWithCode(String code, String userName) {
if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) {
LiveSDKWithUI.enterRoom(mUniSDKInstance.getContext(), new LPJoinCodeEnterRoomModel(code, userName));
}
}
}
- 插件依赖
插件仅支持 jcenter google jitpack 阿里镜像这几个公开仓库,无法配置私有仓库。。
无奈,只能查看依赖树,一个个加到libs目录,对于公开的依赖可以直接在build.gradle里配置。
坑一:文档介绍不支持 kotlin,实际上是支持的。
在 package.json->dependencies下增加
坑二:最后我的libs 目录有80M之多,超过了云打包40M的限额,得充钱,10 RMB 一次,贵得有点离谱。好在插件上架之后可以申请退费。
坑三:制作自定义基座(把插件代码和依赖打包成apk)或者云打包一天10次,超额付费 2 RMB一次才行,对插件开发非常不友好,改了原生代码或者package.json都要重新打包。
坑四:云打包完全黑盒,本地离线打包能轻松解决的问题却无限卡在制作基座。比如两个 aar中有相同的so库冲突,配置 pickFirst能解决。
需要在manifest.json,注意是manifest.json而不是插件的package.json中,这里浪费了我几个小时的时间。
"packagingOptions": [ //可选,字符串数组类型,Android平台云端打包时build.gradle的packagingOptions配置项
"pickFirst 'libs/*/xxx.so'",
"merge '**/LICENSE.txt'"
],
坑五:viewbinding & databinding 不支持
同样也折腾了几次付费打包,文档藏得太深了。也是在manifest.json开启配置
"buildFeatures" : {
"dataBinding" : true,
"viewBinding" : true
}
附上 manifest.json 说明文档
坑六:无法同步build.gradle的配置,我们项目中用到高斯模糊。需要在build.gradle 配置
"android { defaultConfig { renderscriptSupportModeEnabled true }}"
坑四和坑五本质上也是插件module的build.gradle配置无法生效,但好歹官方还是支持配置的。这个就直接回复不支持了,无奈只能删除高斯模糊的逻辑。
这里还是要给论坛里快速回复的工作人员点赞,QQ群都是小广告,论坛可能是为数不多能解决 uniapp相关问题的地方了~
最后附上这次趟坑的插件地址,欢迎使用uniapp开发的有点直播需求的同学尝尝鲜!
百家云点播回放 SDK 插件
百家云直播 UI SDK 插件