博主的开发及调试环境是 macOS 10.13.4 + Chrome/65.0.3325.181 + honorV9 EMUI8.0.0(Android8.0.0)本文适合有必定前端开发经验的小伙伴(有必定经验看原文档太累赘了,并且环境配置部分原文写的太零碎了),最后总结了一些开发过程当中遇到的坑。附文档连接:https://doc.quickapp.cn/php
本文没有提到的部分和正常前端开发保持一致,也多是我尚未遇到的坑。。。css
首先你须要一个手机厂商对应开发者帐号和快应用帐号html
因为博主的手机是华为,就在华为官网注册一个我的开发者帐号就好啦,这个部分就不具体展开了。相关地址快应用也给我提供了一份列表和指南。值得说明的是,这个帐号是须要实名制的,有上传身份证照片和我的照片审核的,审核须要1-2个工做日(华为使用芝麻信用认证能够即即刻生效,不知道其余厂家什么状况)。前端
而后打开快应用官网 https://www.quickapp.cn/, 点击右上角的注册,注册一个快应用帐号,这个部分很简单,也不展开了。
登录之后咱们能够看到导航栏上多出来一个开发者中心标签,点击进去,选择【厂商帐号绑定】选项卡,选择你的手机品牌方标签进行绑定便可,目前小米、华为、金立、魅族、努比亚、OPPO 和 VIVO 都已经能够绑定了,而中兴、联想和一加还不能绑定。该绑定过程一样须要1-2个工做日审核。node
首先你须要安装 node v6.11.3 这是快应用官方推荐的版本
注意:不要使用 v8.0.* 这个版本内部 ZipStream 实现与 node-archive 包不兼容,会引发报错android
若是你已经使用了 node 高版本,能够安装 nvm 管理 node 版本(若是你是第一次安装 node 能够直接安装 v6 版本,跳过该步骤)。
安装nvm, 注意不要使用 brew 安装,由于 curl 安装不须要手动配置 .bashrc :git
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash
而后安装对应版本node:github
nvm install v6.11.3
检查当前使用 node 版本:web
nvm current
此时应该已是咱们须要的版本了,若是不是,能够手动切换。查看已安装的 node 版本,和切换到已安装的版本:正则表达式
nvm ls # 查看已安装版本 nvm use v6.11.3 # 使用已安装版本
更多 nvm 用法直接输入:
nvm --help
到这里,咱们继续快应用开发,全局安装脚手架:
npm install -g hap-toolkit
检测是否安装成功:
hap -V
chrome 的 devTools 确定是必不可少的。除此以外咱们须要在手机安装一下两个应用:快应用调试器(左),快应用预览平台(右)
若是你不安装【快应用预览平台】,那么【快应用调试器】中的按钮都是不可点击的。而【快应用预览平台】里面其实啥也看不到,就是一个供快应用工做的壳。完整安装好之后【快应用调试器】以下图。
固然官方也给了一份 源码, 方便你们熟悉生命周期,样式,自定义组件,事件传递,组件使用。注意:下载后请记得操做:hap update --force
,增长编译支持。
最后 adb 安装(Homebrew):
brew cask install android-platform-tools
检测是否安装成功:
adb devices
咱们利用脚手架新建一个项目, 而且进入该项目, init 过程当中须要输入项目名称:
hap init demo && cd demo
注意:以后的全部操做都在这个目录下面
这是 demo 目录结构
├── sign #rpk包签名模块 │ └── debug #调试环境 │ ├── certificate.pem #证书文件 │ └── private.pem #私钥文件 ├── src │ ├── Common #公用的资源和组件文件 │ │ └── logo.png #应用图标 │ ├── Demo #页面目录 │ | └── index.ux #页面文件,可自定义页面名称 │ ├── app.ux #APP文件,可引入公共脚本,暴露公共数据和方法等 │ └── manifest.json #项目配置文件,配置应用图标、页面路由等 └── package.json #定义项目须要的各类模块及配置信息
须要注意的是,sign 用来存放签名模块,sign/debug 中有用于调试的证书的私钥,但debug签名因为是公开的,安全性没法保证。在 release 发布以前必定要添加 release 目录而且写入对应的证书和私钥:
openssl req -newkey rsa:2048 -nodes -keyout private.pem -x509 -days 3650 -out certificate.pem mkdir sign/release && mv *.pem ./sign/release/
安装相关依赖:
npm install
若是上面的安装很慢,可使用淘宝的资源:
npm install --registry=https://registry.npm.taobao.org
脚手架已经提供不少运行方式:
npm run release # 发布程序包,在 /dist/.signed.rpk,注意须要使用 release 签名模块 npm run build # 生成 build 和 dist 两个目录。前者是临时产出,后者是最终产出 npm run watch # 文件保存时自动编译和调试
项目已和产生了 rpk 包,在作好以前的准备工做已后,运行:
npm run server # 固然,你能够经过 --port XXXX 指定端口,默认12306
此时,会在控制台和 http://localhost:12306 获得一个二维码,利用【快应用调试器】中的扫码安装,便可在手机上看到效果了。
此时你退出预览界面,点击【快应用调试器】中的开始调试,会同步在 chrome Devtool 中打开调试窗口,原理同在 chrome://inspect 中使用的远程调试功能,以下图:
调试能够采用一下三种方式:
npm run build # 手动编译 + 手动刷新 npm run build && npm run notify # 手动编译 + 自动刷新 npm run watch # 自动编译 + 自动刷新
注意:使用远程调试请确保手机与PC在同一局域网
IDE / Code Editor
console
为了正常使用 console.log 修改 src/manifest.json
中的 config 以下:
{ "config": { "logLevel": "debug" } }
console 仅支持 info, log, warn, error, debug 方法。
LESS 支持
lang="less"
属性便可Async Function 支持
/* app.ux 文件(若是没有本身在 Common 里建一个)*/ <script> const global = Object.getPrototypeOf(global) || global global.regeneratorRuntime = require ('babel-runtime/regenerator') // else code... </script>
根目录下的 sign 文件上文已经提到过,其余文件目录再也不赘述,由于前端项目大多如此,这里仅仅说 src 目录:
src ├── manifest.json # 配置文件 ├── app.ux # 入口文件 ├── Page1 # 页面1 │ ├── page1.ux ├── Page2 # 页面2 │ ├── page2.ux └── Common # 公共页面和资源 ├── ComponentA.ux ├── ComponentB.ux └── xxx.png
manifest
属性 | 类型 | 默认值 | 必填 | 描述 |
---|---|---|---|---|
package | String | - | 是 | 应用包名,确认与原生应用的包名不一致,推荐采用com.company.module的格式,如:com.example.demo |
name | String | - | 是 | 应用名称,6个汉字之内,与应用商店保存的名称一致,用于在桌面图标、弹窗等处显示应用名称 |
icon | String | - | 是 | 应用图标,提供192x192大小的便可 |
versionName | String | - | 否 | 应用版本名称,如:"1.0" |
versionCode | Integer | - | 是 | 应用版本号,从1自增,推荐每次从新上传包时versionCode+1 |
minPlatformVersion | Integer | - | 否 | 支持的最小平台版本号,兼容性检查,避免上线后在低版本平台运行并致使不兼容;若是不填按照内测版本处理 |
features | Array | - | 否 | 接口列表,绝大部分接口都须要在这里声明,不然不能调用,详见每一个接口的文档说明 |
config | Object | - | 是 | 系统配置信息,详见下面说明 |
router | Object | - | 是 | 路由信息,详见下面说明 |
display | Object | - | 否 | UI显示相关配置,详见下面说明 |
config
用于定义系统配置和全局数据。
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
logLevel | String | log | 打印日志等级,分为off,error,warn,info,log,debug |
designWidth | Integer | 750 | 页面设计基准宽度,根据实际设备宽度来缩放元素大小 |
data | Object | - | 全局数据对象,属性名不能以$或_开头,在页面中可经过this进行访问;若是全局数据属性与页面的数据属性重名,则页面初始化时,全局数据会覆盖页面中对应的属性值 |
router
用于定义页面的组成和相关配置信息,若是页面没有配置路由信息,则在编译打包时跳过。
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
entry | String | - | 首页名称 |
pages | Object | - | 页面配置列表,key值为页面名称(对应页面目录名,例如Hello对应'Hello'目录),value为页面详细配置page,详见下面说明 |
router.page
用于定义单个页面路由信息。
属性 | 类型 | 默认值 | 必填 | 描述 |
---|---|---|---|---|
component | String | - | 是 | 页面对应的组件名,与ux文件名保持一致,例如'hello' 对应 'hello.ux' |
path | String | /<页面名称> | 否 | 页面路径,例如“/user”,不填则默认为/<页面名称>。path必须惟一,不能和其余page的path相同。下面page的path由于缺失,会被设置为“/Index”:"Index": {"component": "index"} |
filter | Object | - | 否 | 声明页面能够处理某种请求 |
router.page.filter
声明页面能够处理某种请求,页面能够从$page获取打开页面的参数。filter的结构以下:
"filter": { "<action>": { "uri": "<pattern>" } }
属性 | 类型 | 默认值 | 必填 | 描述 |
---|---|---|---|---|
action | String | - | 是 | 请求的动做,目前仅支持view这一种 |
uri | Pattern | - | 是 | 请求的数据的匹配规则。必须是正则表达式。如https?://.* 能够匹配全部http和https类型的网址。 |
display
用于定义与UI显示相关的配置。
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
backgroundColor | String | #ffffff | 窗口背景颜色 |
fullScreen | Boolean | false | 是不是全屏模式,默认不会同时做用于titleBar,titleBar须要继续经过titleBar控制 |
titleBar | Boolean | true | 是否显示titleBar |
titleBarBackgroundColor | String | - | 标题栏背景色 |
titleBarTextColor | String | - | 标题栏文字颜色 |
titleBarText | String | - | 标题栏文字(也可经过页面跳转传递参数(titleBarText)设置) |
menu | Boolean | false | 是否显示标题栏右上角菜单按钮 |
pages | Object | - | 各个页面的显示样式,key为页面名(与路由中的页面名保持一致),value为窗口显示样式,页面样式覆盖default样式。 |
<!-- temp.ux --> <import name="hint" src="./hint-modal"></import> <!-- 引入外部模板 --> <import src="./table"></import> <!-- 引入外部模板 --> <template> <div class="container"> <div class="mod-header"> <text class="mod-title" style="color: red; margin: 10px;">{{title}}</text> <!-- 行内样式 --> <text class="mod-detail" onclick="showDetail">?</text> <!-- 无参事件绑定 --> </div> <div class="mod-content"> <!-- block 用来表示逻辑,不渲染 --> <block for="totalData"> <!-- for 循环遍历数组 $idx, $item 分别为数组的索引和值--> <!-- 事件绑定 --> <div onclick="onTabClick($idx)" class="item {{tabIndex === $idx && 'active'}}"> <!-- 支持简单表达式 --> <text class="{{tabIndex === $idx && 'text-active'}}">{{($item || {}).name}}</text> <text class="{{tabIndex === $idx && 'text-active'}}">{{($item || {}).value}}</text> <!-- 布尔值、null、undefined、'' 不渲染,其他包括 falsy 值一概渲染 --> </div> </block> </div> <image class="mod-like" if="{{isLike}}" /> <!-- 支持if elif else, 必须是相邻节点 --> <image class="mod-dislike" else /> <table data={{dataList}}></table> <!-- 传入属性值,使用外部模板--> <hint show="{{isHintShown}}"> This is children of hint templete. </hint> <!-- 使用外部模板 --> <!-- if 和 show 的区别:if 为 false 分支的节点不会渲染进 DOM 树,而 show 为 false 的节点会渲染,只是 display: none; --> </div> </template> <style lang="less" src="./lessFile.less"></style> <!-- 引入外部 CSS/LESS --> <style lang="less"> /* 引入外部 CSS/LESS */ @import '../Common/global.less'; .container{ /* 定义样式,less 支持 */ } </style> <script> import fetch from "@system.fetch" // 引入系统 js import conf from './globalConf'; // 引入外部 js export default { props: ['title', 'dataList'], // 传入属性:必须字母开头,全小写、数字和 `-` ,不能保留字和函数,不能以符号开头 public: { // 定义变量,会被 props 和内部请求覆盖 }, private: { // 定义变量,不会被 props 覆盖 }, protected: { // 定义变量,不会被 props 覆盖, 但会被内部请求覆盖(得到经过 a 标签和 router 传递的参数) } data :{ // data 不能和 public、private、protected 一块儿使用,data 也能够是 function(返回 data 对象,onInit以前执行) // 定义变量:不能保留字和函数,不能以符号开头 totalData: [{name: 'a',value: 97},{name: 'b',value: 98}]; // 定义变量,会被 props 覆盖 }, onTabClick(index){ // 内部事件定义 console.log(index); }, events: { onIDChange(){ // 外部事件定义 } } } </script> <!-- hint.ux --> <template> <text><slot></slot></text> <!-- slot: 获取该数据的引用的 children, 该例中即:This is children of hint templete. --> </template>
除了传统保留字,添加了 show tid 等;
页面生命周期
属性 | 类型 | 参数 | 返回值 | 描述 | 触发时机 |
---|---|---|---|---|---|
onInit | Function | 无 | 无 | 监听页面初始化 | 当页面完成初始化时调用,只触发一次 |
onReady | Function | 无 | 无 | 监听页面建立完成 | 当页面完成建立能够显示时触发,只触发一次 |
onShow | Function | 无 | 无 | 监听页面显示 | 当进入页面时触发 |
onHide | Function | 无 | 无 | 监听页面隐藏 | 当页面跳转离开时触发 |
onDestroy | Function | 无 | 无 | 监听页面退出 | 当页面跳转离开(不进入导航栈)时触发 |
onBackPress | Function | 无 | Boolean | 监听返回按钮动做 | 当用户点击返回按钮时触发。返回true表示页面本身处理返回逻辑,返回false表示使用默认的返回逻辑,不返回值会做为false处理 |
onMenuPress | Function | 无 | 无 | 监听菜单按钮动做 | 当用户点击菜单按钮时触发 |
A页面的生命周期接口的调用顺序:
应用生命周期
属性 | 类型 | 参数 | 返回值 | 描述 | 触发时机 |
---|---|---|---|---|---|
onCreate | Function | 无 | 无 | 监听应用建立 | 当应用建立时调用 |
onDestroy | Function | 无 | 无 | 监听应用销毁 | 当应用销毁时触发 |
全局对象 (经过 this 访问)
的属性 | 类型 | 参数 | 描述 |
---|---|---|---|
$app | Object | - | 应用对象 |
$app.$def | Object | - | 获取在app.ux中暴露的对象 |
$app.$data | Object | - | 获取在manifest.json的config.data中声明的全局数据 |
$page | Object | - | 页面对象 |
$page.action | String | - | 获取打开当前页面的action。仅在当前页面是经过filter匹配的方式打开时有效,不然为undefined。参见manifest |
$page.uri | String | - | 获取打开当前页面的uri。仅在当前页面是经过filter匹配的方式打开时有效,不然为undefined。参见manifest |
$page.setTitleBar | Function | Object* | - |
$valid | Boolean | - | 页面对象是否有效 |
$visible | Boolean | - | 页面是否处于用户可见状态 |
* this.$page.setTitleBar 参数属性包括:
{ text: 'Hello QuickApp', //标题栏文字 textColor: '#ffff', //文字颜色 backgroundColor: '#434343', //背景颜色 backgroundOpacity: '0.8', //背景透明度 menu: false, //是否在标题栏右上角显示菜单按钮 | 设置当前 }
属性 | 类型 | 参数 | 描述 |
---|---|---|---|
$element | Function | id: String | 获取指定id的组件dom对象,若是没有指定id,则返回根组件dom对象用法:this.$element('xxx') 获取id为xxx的组件实例对象 this.$element() 获取根组件实例对象 |
$root | Function | 无 | 获取顶层ViewModel |
$parent | Function | 无 | 获取父亲ViewModel |
$child | Function | id: String | 获取指定id的自定义组件的ViewModel用法:this.$child('xxx') 获取id为xxx的div组件ViewModel |
$vm deprecated |
Function | id: String | 请使用上面this.$child('xxx')替代 |
$rootElement deprecated |
Function | 无 | 请使用上面this.$element()替代 |
$forceUpdate | Function | 无 | 强制页面刷新 |
公共属性 | 类型 | 参数 | 描述 |
---|---|---|---|
$set | Function | key: String value: Any |
添加数据属性,必须在onInit函数中使用,用法:this.$set('key',value) |
$delete | Function | key: String | 删除数据属性,若是在onInit函数中使用,用法:this.$delete('key') |
元素属性/方法 | 类型 | 参数 | 描述 |
---|---|---|---|
$set | Function | key: String value: Any |
添加数据属性,用法:this.$vm('id').$set('key',value) |
$delete | Function | key: String | 删除数据属性,用法:this.$vm('id').$delete('key') |
$on | Function | eventName: String<br/>handler: Function | 在当前页面注册监听事件, 可监听$emit() 、 $dispatch() 、 $broadcast() 等触发的自定义事件,不能用于注册组件节点的事件响应 |
$off | Function | eventName: String<br/>handler: Function | 移除事件监听,参数 fnHandler 为可选,传递仅移除指定的响应函数,不传递则移除此事件的全部监听 |
$emit | Function | eventName: String <br/>data: Object | 触发当前实例监听事件函数,与 $on() 配合使用 |
* 注意,获取元素应该在页面已渲染后,如 onReady 事件中或 onReady 事件执行完之后。
/src/manifest.json
中 config.designWidth
的值,默认750):disabled
,:checked
,:focus
等)默认支持通用事件、属性和样式<text>
、<a>
、<span>
、<label>
组件为文本容器组件,其它组件不能直接放置文本内容
<div>
: 和 HTML 同样
<popup>
: 气泡框
<text>
<refresh>
: 下拉刷新
<richtext>
: 富文本编辑器
<stack>
: 子组件排列方式为层叠排列,每一个直接子组件按照前后顺序依次堆叠,覆盖前一个子组件
<swiper>
: 轮播视图容器
<tabs>
: 选项卡
<tab-bar>
: 用来展现tab的标签区,子组件排列方式为横向排列
<tab-content>
: 用来展现tab的内容区,高度默认充满tabs剩余空间,子组件排列方式为横向排列
<list>
: 开发者在页面中实现长列表或者屏幕滚动等效果时,习惯使用div组件作循环遍历
<list-item>
;<list>
的元素随<list>
一块儿滚动。开启 scrollpage 会下降<list>
渲染性能<list-item>
、细粒度划分<list-item>
、关闭 scrollpage 四个方面<list-item>
list 的子元素
<list>
之外的组件<list-item>
后代 DOM 必须如出一辙,若是不同,请使用不一样的 type 值。type 不能为空!<div>
样式和 column-span,不支持 position<a>
: 连接
this.param1
的方式使用<image>
: 图片
<process>
: 进度条
<rating>
: 星级评分
<span>
: 格式化的文本
<text>
与<a>
的子组件<text>
: 文本内容写在标签内容区,支持转义字符""
<a>
与<span>
子组件<input>
: 接收用户的输入
<label>
: 为input、textarea组件定义标注
<option>
: <select>
的子组件,用来展现下拉选择具体项目
<picker>
: 滚动选择器,目前支持三种选择器,普通选择器,日期选择器,时间选择器。默认为普通选择器。
<select>
: 下拉菜单
<slider>
: 滑动选择器
<switch>
: 开关选择
<textarea>
: 接收用户的输入
<video>
: 视频播放器
<web>
: 用于显示在线的html页面
如下接口经过import app from '@system.app'
或require('@system.app')
方式引入
接口申明在 manifest 文件的 features 中,除了@system.app
使用前之外都须要申明。
@system.app
getInfo()
, 获得应用名称、版本名称、版本号、log级别,三级来源@system.share
内置分享,接口声明:{"name": "system.share"}
share({type: MIME Type, data:String/URL/FileList, success, fail, cancel, complete})
: 分享调用第三方分享,接口声明:{"name": "service.share","params": {"appSign": "abcdefg...","qqKey":"1234567","wxKey":"wx1234","sinaKey":"1234"}}
getProvider()
: 获取厂商信息share({shareType:int, title, summary, targetUrl,imagePath, mediaUrl, success, fail, cancel, complete})
cancel
@system.router
{"name": "system.router"}
push({url, params:Object})
: 跳转urlreplace({url, params:Object})
: 跳转url, 后退不会来back()
: 后退clear()
: 清空历史栈getLength()
: 获取历史栈长度getState()
: 获取固然页面位置,名称,路径@system.prompt
{"name": "system.prompt"}
showToast({message, duratuon:(0 or 1)})
: 显示吐司showDialog({title:, message:, buttons:[{text,color}], success({index}), fail, cancel, complete})
: 显示对话框showContextMenu({itemList:String[], itemColor:HexColor, success, fail, cancel, complete})
: 显示上下文菜单@system.notification
{"name": "system.notification"}
show({contentTitle, contentText, clickAction:{url}})
: 显示通知@system.vibrator
{"name": "system.vibrator"}
@system.webview
{"name": "system.webview"}
loadUrl({url})
: 经过 webview 加载 urlsystem.go(path)
: url 跳转@system.request
{"name": "system.request"}
upload({url, header:Object, method(POST|GET), files:{filename,name,url,type}[], data:{name,value}[], success({code,data,headers}), fail, complete})
: 上传download({url, header:Object, success({token}), fail, complete})
: 下载onDownloadComplete({token, success({url}), fail({code}), complete})
: 监听下载任务@system.fetch
{"name": "system.fetch"}
fetch({url, header:Object, method(POST|GET), files:{filename,name,url,type}[], data:{name,value}[], success({code,data,headers}), fail, complete})
: 发起请求@system.storage
{"name": "system.storage"}
get({key, default, success({data}), fail, complete})
: 获取值set({key, value, success, fail, complete})
: 存储值clear({success, fail, complete})
: 清空数据delete({key, success, fail, complete})
: 删除数据@system.file
{"name": "system.file"}
move({srcUri, dstUri, success, fail({code}), complete})
: 移动文件copy({srcUri, dstUri, success, fail({code}), complete})
: 复制文件list({uri, success(fileList:{uil,list,lastModifiedTime}[]), fail({code}), complete})
: 获取目录下文件列表get({uri, success({uil,list,lastModifiedTime}), fail({code}), complete})
: 获取文件信息delete({uri, success, fail(code**), complete})
: 获取文件信息@system.barcode
(须要用户受权)
{"name": "system.barcode"}
scan({success({result}), fail(code:201用户拒绝), cancel, complete})
: 扫描二维码@system.sensor
{"name": "system.sensor"}
subscribeAccelerometer({callback(x,y,c)})
: 获取重力感应数据unsubscribeAccelerometer()
: 中止获取重力感应数据subscribeCompass({callback(direction)})
: 获取罗盘数据unsubscribeCompass()
: 中止获取罗盘数据subscribeProximity({callback(distance)
}): 获取距离感应数据unsubscribeProximity()
: 中止获取距离感应数据subscribeLight({callback(intensity)})
: 获取光线感应数据unsubscribeLight()
: 中止获取光线感应数据@system.clipboard
{"name": "system.clipboard"}
set({text, success, fail, complete})
: 写入get({success({text}), fail, complete})
: 读取@system.geolocation
(须要用户受权)
{"name": "system.geolocation"}
getLocation({timeout, success({longitude, latitude}), fail, complete})
: 获取地理位置subscribe({callback(longitude, latitude), fail})
: 监听用户位置unsubscribe()
: 取消监听用户位置@system.shortcut
(须要用户受权)
{"name": "system.shortcut"}
hasInstalled({success, fail, complete}
): 是否已建立桌面图标install({success, fail, complete})
: 建立桌面图标@system.calandar
(须要用户受权)
{"name": "system.calandar"}
insert({title, description, startDate:number, endDate:number, timezone:string, allDay:boolean是否成天, rrule:string重复规则, remindMinutes:number[]提早提醒时间, organizer: string, success, fail, cancel})
: 插入日历事件@system.network
{"name": "system.network"}
getType({success(metered是否按流量计费, type网络类型), fail, complete})
: 获取网络类型subscribe({callback(metered, type), fail})
: 监听网络状况unsubscribe()
: 取消监听网络状况@system.device
(须要用户受权)
{"name": "system.device"}
getInfo({success({brand, manufacturer, model, product, osType, osVersionName, osVersionCode, platformVersionName, platformVersionCode, language, region, screenWidth, screenHeight}), fail, complete})
: 获取设备基本信息getId({type(device|mac|user|advertising)[], success({device, mac, user, advertising}), fail, complete})
: 获取设备标识getDeviceId({success({deviceId}), fail, complete})
: 获取设备IDgetUserId({success({userId}), fail, complete})
: 获取用户IDgetAdvertisingId({success({advertisingId}), fail, complete})
: 获取广告IDgetTotalStorage({success({totalStorage}), fail, complete})
: 获取总容量getAvailableStorage({success({availableStorage})
, fail, complete}): 获取可用容量getCpuInfo({success({cpuInfo}), fail, complete})
: 获取cpu信息@system.brightness
{"name": "system.brightness"}
getValue({success({value}), fail, complete})
: 获取屏幕亮度setValue({value, success(value:0手动;1自动), fail, complete})
: 设置屏幕亮度getMode({success(value:0手动;1自动), fail, complete})
: 获取屏幕亮度模式setMode({value, success, fail, complete})
: 设置屏幕亮度模式 1. 接口声明:{"name": "system.volume"}
@system.volume
{"name": "system.volume"}
getMediaValue({success(value:0到1), fail, complete})
: 获取音量setMediaValue({value, success, fail, complete})
: 设置音量@system.battary
{"name": "system.battary"}
getStatus({success(charging, level:0到1), fail, complete})
: 获取当前电池状态@system.package
{"name": "system.package"}
hasInstalled({package包名, success(result:boolean), fail, complete})
: 判断是否安装了某个应用install({package, success(result:boolean), fail, complete})
: 安装应用@system.record
(须要用户受权)
{"name": "system.record"}
start({success({url}), fail, complete})
: 开始录音record.stop()
: 中止录音@system.cipher
{"name": "system.cipher"}
rsa({action:encrypt|decrypt, text, key加密为公钥|解密为私钥, transformation补充项,success({text}), fail, complete})
: rsa 加密解密@system.media
(须要用户受权)
{"name": "system.media"}
takePhoto({success({uri}), fail, complete, cancel})
: 拍照takeVideo({success({uri}), fail, complete, cancel})
: 录像pickImage({success({uri}), fail, complete, cancel})
: 选择图片pickVideo({success({uri}), fail, complete, cancel})
: 选择视频@system.image
{"name": "system.image"}
getImageInfo({uri, success({uri, width, height, size}), fail, complete, cancel})
: 获取图片基础信息compressImage({uri, quality:1到100, ratio:number缩放比, format:图片格式, success({uri, width, height, size}), fail, complete, cancel})
: 压缩图片applyOperations({uri, operations:Object[](以下), quality, format, success({uri}), fail, complete, cancel}})
: 对图片按顺序执行编辑操做
{action: 'crop', x, y, width, height}
{action: 'scale', scaleX, scaleY}
{action: 'rotate', degree}
editImage({uri, success({uri}), fail, complete, cancel})
: 使用编辑器编辑图片@system.audio
{"name": "system.audio"}
play()
: 播放pause()
: 暂停@system.push
{"name": "system.push"}
getProvider()
: 获取服务提供商subscribe({success({regId}), fail, complete})
: 订阅pushunsubscribe()
: 取消订阅pushon({callback(messageId, data)})
: 添加push事件回调off()
: 移除push事件回调@system.pay
{"name": "system.pay"}
getProvider()
: 获取服务提供商pay({orderInfo:String, success({code, message, result}), fail({code, message}), complete})
: 付款@system.stats
{"name": "system.stats"}
getProvider()
: 获取服务提供商recordCountEvent({category, key, map})
: 计数类型事件recordCalculateEvent({category, key, value, map})
: 计算类型事件@system.account
{"name": "system.account"}
getProvider()
: 获取服务提供商authorize({type:string(code|token), redirectUri, scope, state, success({state, code, accessToken, tokenType, expiresIn, scope}), fail, complete)
: 认证getProfile({token, success({openid, id, unionid, nickname, avatar}), fail, complete})
: 获取用户认证信息@system.alipay
{"name": "system.alipay"}
pay({orderInfo:string, callback})
: 支付@system.wxpay
{"name": "service.wxpay", "params": {"package": "com.your.package", "sign": "abcdefg", "url": "http://your.domain/page"}}
两种方式的 manifest 配置:
getType()
: 返回调用方式(none|APP|MWEB)pay({prepayid, extra, success({prepayid,final_url}), fail(code**), complete})
: 支付
extra app 版参数以下
extra app 版参数以下
以上接口错误列表以下:
- 201 用户拒绝
- 202 参数错误
- 204 超时
- 300 I/O错误
- 301 路径不存在
- 900 签名有误
- 901 包名有误
- 1000 应用未安装|下载失败|位置开关关闭
- 1001 url配置找不到|任务不存在
- 2001 内部错误
传递方法1. <a>
标签配合 queryString 传递参数, 这个和前端一致。
<a href="/src/home/index.html?key=2333">跳转页面</a>
传递方法2. 经过 router 接口:router.push(), router.replace(), 接受一个以下结构的对象,用法这个和前端 router 一致。
{ url: '/src/home/index.html', params: { key: 2333 /* 须要传递的参数 */ } }
接收方法:上述2种传递参数的方法,其接收方法一致,在接收参数页面的 protected 对象中获取便可(可设置默认值)
<script> export default { protected: { key: 0 // 获得传过来的 key: 2333, 0 为默认值 } } </script>
回传参数:借助 this.$app.$data 实现,至关于绑定数据到全局了,这个再也不举例
这个部分和 HTML5 中的同源页面通讯一模一样。会利用到一个构造函数 new BroadcastChannel(string)
, 它接受一个字符串参数,做为实例的频道名称。它的实例具备如下属性和方法:
名称 | 类型 | 参数 | 描述 |
---|---|---|---|
name | String | - | 频道名称,区分不一样的消息频道(注意:不一样频道之间不可通讯)。 |
postMessage | Function | Any: 消息内容 | 用于在当前频道中广播消息。 |
onmessage | Function | Event:消息对象 | 订阅消息。在频道中接收到广播消息以后,会给全部订阅者派发消息事件。 |
close | Function | - | 关闭当前的频道。 |
其中 onmessage 事件有2个属性(经过 event 对象访问):
属性 | 类型 | 描述 |
---|---|---|
type | String | "message" |
data | Any | 接收到的消息内容 |
因为和 HTML5 用法同样,这里就不演示了。
父子组件使用见 template 部分
父组件到子组件
this.$broadcast()
完成事件触发,子组件经过$on()
绑定事件并响应子组件到父组件
this.$dispatch()
完成事件触发,父组件经过$on()
绑定事件并响应this.$emit()
触发在节点上绑定的事件来执行父组件的方法* 注:this.$broadcast()
、this.$emit()
和 this.$dispatch()
参数一致
* 注:触发时传递参数,再接收时使用event.detail
来获取参数
* 注:当传递结束后,能够调用event.stop()
来结束传递
配合<web>
标签框架支持经过连接从外部打开应用,格式
http://hapjs.org/app/<package>/[path][?key=value]
https://hapjs.org/app/<package>/[path][?key=value]
hap://app/<package>/[path][?key=value]
参数说明:
从传统网页调起需引入如下脚本:
<script src='//statres.quickapp.cn/quickapp/js/routerinline.min.js'/>
提供方法:
appRouter(packageName, pageName, params, confirm)
channelReady(callback)
<style> .tag{ /* 边框样式不支持缩写 */ border-bottom-color: #cccccc; /* 颜色不支持缩写 */ border-bottom-width: 2px; text{ color: #666666; } } .active{ border-bottom-color: #3333ff; text{ color: #3333ff; } } </style>