Cordova HarmonyOS
遵守Cordova(https://cordova.apache.org)官方插件接口规范
优势
Cordova HarmonyOS 所有插件遵守cordova(https://cordova.apache.org)官方接口规范,原android和Ios项目在几分钟内就可以生成原生纯血鸿蒙APP,无需做任何研发,节省大量时间和人力成本。
支持框架
支持移动端跨平台框架:
- (1)vue.js
- (2)ionic+angular.js
- (3)ionic React
- (4)jquery.js框架
开发说明
cordova,包含sdk和插件,并支持自定义插件研发,只有cordova sdk没有插件无法使用,因此cordova(https://cordova.apache.org)官方,除了提供sdk外,同时提供了大量的官方插件,并且开源,同样cordova HarmonyOS遵守官方标准,除了提供鸿蒙版cordova sdk外,也提供了大量的插件,并且仍在持续新增插件,同时支持自定义插件研发,所有插件遵守cordova官方接口规范,因此开发者可以参考cordova官方插件的开发文档开发鸿蒙版app。
开发背景
cordova是Apache基金会的开源项目,官方网站:https://cordova.apache.org,是移动端跨平台框架,地位不可撼动,大量厂商直接或间接采用此框架开发APP;但是目前不支持HarmonyOS Next版本,开发者将原Android和Ios项目移植到HarmonyOS Next版,无法适配,为此我们公司研发了cordova HarmonyOS,遵守cordova官方标准,使适配纯血鸿蒙在几分钟内就可以完成,无需投入任何研发,新开发的项目,一次研发就适用于Android、Ios和HarmonyOS三大平台,也节省了大量的时间和人力成本。
升级预告
下一版本升级cordova sdk、自带插件、自定义插件的demo程序,敬请期待。
自带插件
插件ID | 接口说明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
cordova-plugin-device | 名称:设备信息 文档地址:https://github.com/apache/cordova-plugin-device 所有接口遵守官方文档,uuid和serial读取是鸿蒙系统的ODID,鸿蒙只允许系统应用读取uuid和serial,普通应用无权读取,具体文档参考华为官方文档:文档中心 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-whitelist | 名称:网络访问白名单 文档地址:https://github.com/apache/cordova-plugin-whitelist 使用cordova HarmonyOS不存在跨域访问问题,任何域名都可以访问网络,因此为了安全性,需要配置网络访问白名单,使用方法保持和原接口一致外,做了一些修改如下:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-hot-code-push-plugin | 名称:热更新插件 文档地址:https://github.com/nordnet/cordova-hot-code-push 热更新部分js和css文件,无需升级整个app,主要是解决紧急情况下的bug,升级app还是建议上架应用市场。调用方法如下:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-network-information | 名称:网络管理 文档地址:https://github.com/apache/cordova-plugin-network-information cordova网络管理,查看网络连接状态,wifi,4G和5G等连接类型,需申请网络权限,才可以正常使用,见声明权限部分 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-bd-geolocation | 名称:百度地理位置定位 文档地址:https://github.com/laixiangran/cordova-plugin-bd-geolocation 百度地理位置定位,支持wgs84、gcj02和bd09ll坐标,需申请位置权限,才可以正常使用,见声明权限部分 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-geolocation | 名称:cordova地理位置定位官方插件 文档地址:https://github.com/apache/cordova-plugin-geolocation cordova官方地理位置定位插件,支持wgs84、gcj02和bd09ll坐标,需申请位置权限,才可以正常使用,见声明权限部分 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-inappbrowser | 名称:内置浏览器 文档地址:https://github.com/apache/cordova-plugin-inappbrowser cordova的app的内置浏览器,实现app加载服务器网页 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-sqlite-storage | 名称:数据库插件 文档地址:https://github.com/storesafe/cordova-sqlite-storage cordova官方数据库插件,缓存本地数据,支持sql语句 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-camera | 名称:相机功能 文档地址:https://github.com/apache/cordova-plugin-camera cordova相机功能,调用相机拍摄照片,无需权限申请 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-file | 名称:本地文件管理 文档地址:https://github.com/apache/cordova-plugin-file 鸿蒙file插件的使用完全遵守cordova-plugin-file官方文档,请大家参考官方文档使用该插件,但是鸿蒙的目录结构和Android、Ios不同,鸿蒙App目录结构说明参考https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/app-sandbox-directory-V5,cordova file文件目录和鸿蒙目录对应关系如下表,和Anroid、Ios一样,app启动后cordova会自动初始化目录,目录是动态的生成的,有可能HarmonyOS升级会改变目录结构(鸿蒙官方文档明确说明禁止直接使用目录结构)。
cdvfile和Android、Ios不同,说明如下: (1)cdvfile文件路径的生成,举例如下: window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) { fs.root.getFile("newPersistent.png", { create: true, exclusive: false }, function (fileEntry) { var path1 = "cdvfile://"+dirEntry.nativeURL; var path2 = "cdvfile://"+"localhost/"+dirEntry.name+dirEntry.nativeURL; //path1和path2都为cdvfile的文件路径,系统兼容两种路径格式 //该路径属于动态路径,有可能随着HarmonyOS升级而改变。 }, onErrorCreateFile); }, onErrorLoadFs); cdvfile路径也可无需程序动态生成,App缓存的文件,可以直接使用静态路径,例如: LocalFileSystem.PERSISTENT的cdvfile路径,如下: cdvfile://localhost/persistent/newPersistent.png LocalFileSystem.TEMPORARY的cdvfile路径,如下: cdvfile://localhost/temporary/newPersistent.png 保持和Andriod、Ios一致,此路径是安全路径,不会随着harmonyOS的升级而改变 (2)cdvfile文件路径的使用 window.resolveLocalFileSystemURL("cdvfile://localhost/temporary/newPersistent.png", function(fileEntry) { //获取fileEntry,然后读取文件内容,文件必须存在 }); webview中直接引用cdvfile文件 < img src="cdvfile://localhost/temporary/newPersistent.png"/> (3)https(http)://localhost的使用 App缓存的文件,也可以直接使用http(s):使用,路径的生成为:直接将cdvfile路径的cdvfile改为http或https即可 window.resolveLocalFileSystemURL("https://localhost/temporary/newPersistent.png", function(fileEntry) { //获取fileEntry,然后读取文件内容,文件必须存在 }); webview中直接通过https或http访问文件 < img src="https://localhost/temporary/newPersistent.png"/> (4)鸿蒙路径、cdvfile和http(s)对应关系如下表。
说明:只要鸿蒙目录的相同,无论通过cdvfile还是http(s)访问,都是访问的同一个文件。 (5) 不支持通过file://访问文件,请使用cdvfile://或http(s)://协议访问 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-file-transfer | 名称:网络文件传输 文档地址:https://github.com/apache/cordova-plugin-file-transfer cordova上传和下载文件 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-dialogs | 名称:dialog弹窗 文档地址:https://github.com/apache/cordova-plugin-dialogs cordova接口,弹出鸿蒙系统弹窗 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-datepicker | 名称:日期时间控件选择 文档地址:https://github.com/VitaliiBlagodir/cordova-plugin-datepicker cordova接口,调用鸿蒙系统原生日期和时间选择窗口 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
phonegap-plugin-barcodescanner | 名称:扫码 文档地址:https://github.com/phonegap/phonegap-plugin-barcodescanner 调用摄像头扫码,也可从相册选择图片扫码 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-mlkit-barcode-scanner | 名称:扫码 文档地址:https://github.com/MobisysGmbH/cordova-plugin-mlkit-barcode-scanner 调用摄像头扫码,也可从相册选择图片扫码 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-statusbar | 名称:状态栏设置 文档地址:https://github.com/apache/cordova-plugin-statusbar 设置和管理状态栏 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-media-capture | 名称:录制视频和音频 文档地址:https://github.com/apache/cordova-plugin-media-capture cordova调用摄像头拍摄视频,和阿里云oss插件或者网络传输插件相结合实现拍摄视频后上传服务器功能 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
aliyun.uploadvod | 名称:阿里云OSS插件 暂无文档,需联系开发者 阿里云OSS插件,实现移动端直接上传文件到阿里云OSS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-android-permissions | 名称:权限申请插件 文档地址:https://github.com/NeoLSN/cordova-plugin-android-permissions cordova授权插件,接口永远返回为拥有权限,主要为兼容android移植到harmony使用的,避免修改Android端的代码,harmong授权已下放到各个插件,无需单独编写代码 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
phonegap-bluetooth-plugin | 名称:经典蓝牙插件 文档地址:https://github.com/tanelih/phonegap-bluetooth-plugin cordova官方经典蓝牙插件,需申请蓝牙权限,才可以正常使用,见声明权限部分 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-ble-central | 名称:低功耗蓝牙 文档地址:https://github.com/tanelih/phonegap-bluetooth-plugin 蓝牙4.0版本,蓝牙打印更稳定、安全;cordova支持多款低功耗插件,主要是方便android和ios项目移植,需申请蓝牙权限,才可以正常使用,见声明权限部分 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-bluetooth-serial | 名称:低功耗蓝牙 文档地址:https://github.com/don/BluetoothSerial 蓝牙4.0版本,蓝牙打印更稳定、安全;cordova支持多款低功耗插件,主要是方便android和ios项目移植,需申请蓝牙权限,才可以正常使用,见声明权限部分 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-base64-to-gallery | 名称:保存图片到相册 文档地址:https://github.com/goiarlabs/cordova-base64-to-gallery cordova实现保存图片到相册 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-huawei-push | 名称:华为推送 文档地址:https://github.com/waitaction/cordova-plugin-huawei-push cordova鸿蒙推送 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-alipay-v2 | 名称:支付宝支付插件 文档地址:https://github.com/hhjjj1010/cordova-plugin-alipay-v2 依赖插件:https://ohpm.HarmonyOS.cn/#/cn/detail/@cashier_alipay%2Fcashiersdk 使用方法如下:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cordova-plugin-wechat | 名称:微信插件 文档地址:https://github.com/xu-li/cordova-plugin-wechat 依赖插件:https://ohpm.HarmonyOS.cn/#/cn/detail/@tencent%2Fwechat_open_sdk 使用方法如下:
|
Android移植鸿蒙步骤
1,打开DevEco创建项目,选择Empty Ability进入下一步,填写必要信息,这里要注意,bundle name 先填写com.example.myapplication,也就是保持默认不变,因为在没有cordova.crt证书的情况下,cordova鸿蒙版要求bundle name必须为com.example.myapplication,主要用于研发测试,如果开发测试完成要修改bundle name上架鸿蒙应用市场,请联系开发者申请cordova.crt证书,或者事先联系开发者提供技术服务。
2,项目创建成功后,复制原有Android studio的工程assets目录下面的所有文件到鸿蒙工程entry/src/main/resources/rawfile目录下,原Android工程的assets目录必须包含www目录,www目录包含index.html(必须)、cordova.js(必须)、cordova_plugins.js(必须)、plugins目录(必须)、css目录、js目录等(早期版本只复制www目录内容,新版本仍兼容新版本目录结构,推荐使用新版本目录结构)。
3,复制原android工程res/xml目录下的config.xml文件到鸿蒙工程entry/src/main/resources/rawfile目录下。
4,打开DevEco studio的Terminal终端,进入工程目录,执行 ohpm install @magongshou/harmony-cordova 安装本插件。
5,打开鸿蒙工程文件entry/src/main/etx/pages/Index.ets文件,修改代码如下:
import { MainPage, pageBackPress, pageHideEvent, pageShowEvent } from '@magongshou/harmony-cordova/Index'; //import { TestPlugin } from "../plugins/TestPlugin" //自定义插件TestPlugin,根据实际情况导入自己的自定义插件 @Entry @Component struct Index { //ArkTs侧的自定义插件:配置插件名称和对象,请查看自定义查看开发部分 cordovaPlugs:Array< PluginEntry> = []; /* cordovaPlugs:Array< PluginEntry> = [ { pluginName: 'TestPlugin', //插件名称 pluginObject:new TestPlugin() //实例化插件对象供cordova调用 } ]; */ onPageShow(){ pageShowEvent(); //页面显示通知cordova } onBackPress() { pageBackPress(); //拦截返回键由cordova处理 return true; } onPageHide() { pageHideEvent(); //页面隐藏通知cordova } build() { RelativeContainer() { //isWebDebug:DevTools工具调试开关,cordovaPlugs:自定义插件列表,启动首页index.html MainPage({isWebDebug:false,cordovaPlugs:this.cordovaPlugs}); } .height('100%') .width('100%') } }
6,打开鸿蒙工程文件/entry/src/main/ets/entryAbility/EntryAbility.ets文件,修改onCreate函数如下
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; import { webview } from '@kit.ArkWeb'; //引入webview import { pagePushNotify, setSchemeHandler } from '@magongshou/harmony-cordova/Index'; //引入cordova sdk ... //省略部分代码 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); webview.WebviewController.initializeWebEngine();//webview引擎初始化 setSchemeHandler();//设置webview scheme pagePushNotify(want.parameters);//点击通知消息传送数据给cordova,如果app没有鸿蒙推送功能,此行代码可以不加 } //增加onNewWant,app没有推送功能,可以不添加此函数 onNewWant(want: Want): void { hilog.info(0x0000, 'testTag', 'Succeeded in getting message data'); pagePushNotify(want.parameters);//点击通知消息传送数据给cordova }
7,鸿蒙混合研发,也许您会增加其他page页面,不一定应用的首页为cordova webview(index.html)的首页,例如应用增加了鸿蒙的原生的启动页面,包含首页弹窗,同意隐私政策后,然后再从启动页面进入cordova的页面,这样避免在用户没有同意隐私政策的情况下,初始化cordova sdk,因为初始化cordova sdk,系统读取了设备的网络状态,因为国内相关法律规定,在用户没有同意隐私政策的情况下,不允许读取设备的网络标识。
8,做以上代码修改后,鸿蒙的移植已经完毕,可以使用模拟器或者真机进行编译和测试了。
vue移植说明
1,vue开发完成后,需要发布的生产环境,鸿蒙的开发环境就是vue的生产环境,vue打包后生成dist目录,该目录的内容包含js、css和index.html文件
2,创建鸿蒙工程,参考Android移植步骤的创建方式,创建方式一样
3,将dist目录的内容复制到鸿蒙工程entry/src/main/resources/rawfile目录下
4,其他移植和Android移植步骤一样。
Ios移植鸿蒙步骤
如果您的项目有android和Ios的工程,请参考android项目移植项目的鸿蒙下,如果您的项目没有andriod工程,只有Ios工程,请使用如下方法移植,移植时大部分内容和安卓一样,只是复制的文件的路径不一致,以下只介绍不同部分,相同部分请参考android移植步骤。
1,复制Xcode的Ios工程目录下的Staging目录下的所有文件到鸿蒙工程entry/src/main/resources/rawfile目录下。
2,Xcode工程的config.xml文件在Staging目录下,Xcode工程的该文件不能直接被鸿蒙版cordova使用,需要进行转换,该文件主要记录的是插件的名称和初始化的类,因为鸿蒙版是根据android的config.xml进行插件初始化的,因此需要将Xcode工程config.xml转为安卓的config.xml,请将Xcode工程使用node加入安卓平台,系统会自动生成android版的config.xml。然后将文件复制到鸿蒙版工程的entry/src/main/resources/rawfile下。
附加说明:本人认为使用cordoca跨平台研发,一般至少都会包含android和ios两大平台,很少只有ios平台,没有android平台的,所以大部分移植鸿蒙参考android移植步骤,后续升级SDK会兼容Ios工程的config.xml,无需转换就可以使用。
自定义插件研发
自定义插件研发,需具备cordova插件研发和鸿蒙原生研发能力,自定义插件接口遵守cordova sdk官方规范,以自定义插件TestPlugin、为例:
(1)新建ArkTs文件,取名字为TestPlugin,示例代码如下,具体功能参考示例代码注释说明。
import { CordovaPlugin,CordovaInterface, CallbackContext,CordovaWebView, MessageStatus, PluginResult} from '@magongshou/harmony-cordova/Index'; import { PromptAction } from '@kit.ArkUI'; import { common, Want } from '@kit.AbilityKit'; import { BusinessError } from '@kit.BasicServicesKit'; export class TestPlugin extends CordovaPlugin { protected cordovaInterface?: CordovaInterface; protected cordovaWebView?: CordovaWebView; //插件初始化函数,初始化函数在页面显示前调用,因此在初始化中不能进行UI的相关操作。 initialize(cordovaInterface: CordovaInterface, cordovaWebView:CordovaWebView):void { this.cordovaInterface = cordovaInterface; this.cordovaWebView = this.cordovaWebView; return; } execute(action: string, args: ESObject[], callbackContext: CallbackContext):boolean { if(action == "eayHello") { return this.eayHello(args, callbackContext); } if(action == "openSystemBrowser") { return this.openSystemBrowser(args, callbackContext); } if(action == "openOtherPage") { //系统路由功能,webview是根页面,跳转到原生的其他页面,具体使用参考如下连接 //https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-navigation-navigation-V5 let pathStack:NavPathStack = this.cordovaInterface!.getPageStack(); pathStack.pushPathByName("TestPage", "{test:10}"); } if(action == "otherFunction") { //获取webview属性变量,用于动态修改webview属性,具体参考如下连接 //https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-webview-V5 this.cordovaWebView!.getWebAttribute()?.height('50%'); //获取webview的控制变量,用于实现具体的功能,示例代码实现在webviw执行js,具体参考如下连接 //https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-web-V5 this.cordovaWebView!.getWebviewController().runJavaScript("alert(1);"); //多次执行js侧回调函数,例如在显示执行进度时,需要多次调用 let pluginResult:PluginResult = PluginResult.createByString(MessageStatus.OK, "success"); pluginResult.setKeepCallback(true); callbackContext.sendPluginResult(pluginResult); let pluginResult2:PluginResult = PluginResult.createByString(MessageStatus.OK, "success2"); callbackContext.sendPluginResult(pluginResult2); } return true; } eayHello(args: ESObject[], callbackContext: CallbackContext):boolean { //获取UI上下文,用于原生UI交互 let uiContext:UIContext = this.cordovaWebView!.getUIContext(); let promptAction: PromptAction = uiContext?.getPromptAction(); try { //弹出系统原生窗口 promptAction.showDialog({ title: 'Title', message: 'eay hello', buttons: [ { text: '确定', color: '#000000' } ] }, (err, data) => { if (err) { return; } //执行成功通知js侧回调函数,通知函数有多个具体查看CallbackContext封装函数 callbackContext.success(); }); } catch (error) { } return true; } openSystemBrowser(args: ESObject[], callbackContext: CallbackContext):boolean { if(args.length > 0) { let url:string = args[0]; //获取UIAbilityContext let context = getContext(this) as common.UIAbilityContext let wantInfo: Want = { action: 'ohos.want.action.viewData', entities: ['entity.system.browsable'], uri: url } //跳转一个新的ability context.startAbility(wantInfo).then(() => { console.log('[跳转至外部浏览器] - success') }).catch((err: BusinessError) => { console.error('[跳转至外部浏览器] - Failed to startAbility. Code: ' + err.code + 'message:' + err.message); }) } return true; } }
(2)插件的配置:ArkTs侧插件写好以后,在entry/src/main/ets/pages/index.ets文件中配置
//省略其他代码 import { TestPlugin } from "../plugins/TestPlugin"//引入插件 struct Index { //ArkTs侧的自定义插件键值对:插件名称和实现对象,自定义插件开发,请查看自定义查看开发部分 cordovaPlugs:Array< PluginEntry> = [ { pluginName: 'TestPlugin', //插件名称 pluginObject:new TestPlugin() //实例化插件对象供cordova调用 } ]; //省略其他代码 build() { RelativeContainer() { //isWebDebug:DevTools工具调试开关,cordovaPlugs:自定义插件列表,启动首页index.html MainPage({isWebDebug:false,cordovaPlugs:this.cordovaPlugs}); } .height('100%') .width('100%') } }
(3)js侧插件调用完全遵守cordova官方调用规范,主要有如下两种方式:
1,直接调用,无需做任何配置,代码如下
cordova.exec(function(result){ console.log(result); },function(error){ console.log(error); },"TestPlugin", "openOtherPage", [{name:'chenlh'},{name:'magongshou'}]);
2,根据官方文档,对插件进行二次封装plugins/***/www/***.js,封装完毕后,在config.xml和codova_plugins.js文件中配置,具体配置可以在线查找cordova sdk自定义插件研发相关知识,这里不做详细解释,请参考Create a Plugin - Apache Cordova
(4)自定义插件实现原理简述,由于HarmonyOS提供ArkTS和C/C++ API,Cordova sdk是使用C/C++研发,自定义插件是跨语言调用,调用顺序为:js侧->C/C++侧->ArkTs侧,回调是相反顺序,不过ArkTS侧的插件也可以直接调用JS侧。自定义插件的研发根据具体实现的功能,可以选择使用ArkTS开发,也可选择C/C++开发。目前开放的只有使用ArkTs研发自定义插件,只有本开发者才可以使用C/C++研发插件,如果您在研发自定义插件时,如果觉得插件本身使用C/C++研发更为合适,请和本开发者联系以提供技术支持,当然您在使用ArkTS研发自定义插件时遇到什么问题也可以联系本开发者提供技术支持。
应用权限声明
有些插件需要设置相应的权限才可以正常使用,不使用插件,不配置声明,因此需要配置声明权限,配置方法官方文档地址:
特别说明:声明权限,有个reason的配置,需要在以下三个三件中配置
entry/src/main/resources/base/element/string.json
entry/src/main/resources/en_US/element/string.json
entry/src/main/resources/zh_CN/element/string.json
1,网络权限声明,否则发送post、get请求会失败
{ "name": "ohos.permission.INTERNET" }, { "name": "ohos.permission.GET_NETWORK_INFO", "reason": "$string:netWorkInfo", "usedScene": { "abilities": [ "EntryAbility" ], "when": "always" } }
2,蓝牙权限声明
{ "name": "ohos.permission.ACCESS_BLUETOOTH", "reason": "$string:accessBleInfo", "usedScene": { "abilities": [ "EntryAbility" ], "when": "always" } }, { "name": "ohos.permission.DISCOVER_BLUETOOTH", "reason": "$string:accessBleInfo", "usedScene": { "abilities": [ "EntryAbility" ], "when": "always" } }, { "name": "ohos.permission.USE_BLUETOOTH", "reason": "$string:accessBleInfo", "usedScene": { "abilities": [ "EntryAbility" ], "when": "always" } }
3,地理位置权限
{ "name": "ohos.permission.APPROXIMATELY_LOCATION", "reason": "$string:locationInfo", "usedScene": { "abilities": [ "EntryAbility" ], "when": "always" } }, { "name": "ohos.permission.LOCATION", "reason": "$string:locationInfo", "usedScene": { "abilities": [ "EntryAbility" ], "when": "always" } }
新项目,一次开发适用于andriod、Ios和Harmony三大平台
由于cordova官方当前并不支持HarmonyOS平台,使用node无法直接将HarmonyOS加入到cordova,也无法直接安装插件到HarmonyOS,因此对于新项目要一次开发满足三大平台的话,建议先通过node加入Android和Ios平台和安装插件,后续研发可以使用Android studio研发和调试,待研发成功后,然后再在Xcode和DevEco做跨平台适配。Xcode适配请参考cordova的官方文档,HarmonyOS适配请参考以上Android的移植步骤。
特别说明
使用鸿蒙版cordova sdk在开发测试阶段务必将bundle name修改为com.example.myapplication,如果将bunlde name改为正式的Id,鸿蒙版cordova sdk会读取entry/src/main/resources/rawfile目录的cordova.crt证书文件,用于验签,如果该文件不存在,启动应用后,应用会闪退。如果应用的bundle name为com.example.myapplication,鸿蒙版 cordova sdk会跳过验签,不检测cordova.crt文件。但是上架鸿蒙应用市场,必须将bundle name改为正式的id,所以请联系开发者申请cordova.crt证书,另外由于操作系统之间的差异,虽然保持了cordova的插件接口不变,但是返回值会有所调整,后续文档会逐步完善,在使用本插件跨平台研发时请联系开发者提供技术服务。
常见问题
1,编译报错 Error: ... useNormalizedOHMUrl is not true. 支付宝支付插件引起的,在/build-profile.json5中增加找到buildOption配置选项,增加"useNormalizedOHMUrl": true,如下:
"buildOption": { "strictMode": { "caseSensitiveCheck": true, "useNormalizedOHMUrl": true } }
2,鸿蒙返回键不起作用,就是手势事件,从左往右快速滑动,app不返回上一页面,或者到了顶层页面不退出应用 不同的框架有不同的处理方式,如果不管使用的是什么框架,只在cordova层处理的,需要监听返回键事件,代码如下:
document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { document.addEventListener("backbutton", onBackKeyDown, false); } function onBackKeyDown() { //自己处理返回 //退出app: navigator.app.exitApp(); }
如果采用ionic angularjs框架,可以采用如下代码:
function showConfirm() { //处理退出应用的逻辑 } $ionicPlatform.registerBackButtonAction(function (e) { // Is there a page to go back to? if ($location.path() == '/tab/message') { //到了顶层页面,/tab/message是等层页面的路由,这里只是举个例子,实际情况根据您的项目设置 showConfirm(); return false } else if ($ionicHistory.backView()) { // Go back in history $ionicHistory.goBack(); //自己处理返回 } else { // This is the last page: Show confirmation popup showConfirm(); return false; } e.preventDefault(); return false; }, 101);
说明:无论采用什么框架都可以在cordova层通过监听backbutton返回事件自己处理。