提交 9b752207 编写于 作者: Q qiang

Merge branch 'master' into dev

......@@ -178,4 +178,4 @@
实际运行效果如下(点击图片可放大):
![](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/4869eb60-60aa-11eb-b680-7980c8a877b8.jpg)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/ec6e95dd-77ad-4d14-aafa-ca503f5b9e53.jpg)
......@@ -35,6 +35,7 @@
* [统一发行页面](m3w.md)
* [案例](case.md)
* [选型评估指南](select.md)
* [应用市场上架](store.md)
* [常见问题](faq.md)
* 更新日志
* [正式版](release.md)
......@@ -81,7 +82,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>群16:719211033 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=2JJ4I0h0fi2-sPKTM2ZANX-eak6RyD41&jump_from=webapi">点此加入</a></div>
<div>群12:884860657 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=JsogY994PmSrFzeSEZ6vC5dgsy3kQ-Fz&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -101,11 +102,11 @@
<div>群19:165657124(2000人已满)</div>
<div>群18:698592271(2000人已满)</div>
<div>群17:951348804(2000人已满)</div>
<!-- <div>群16:719211033(2000人已满)</div> -->
<div>群16:719211033(2000人已满)</div>
<div>群15:516984120(2000人已满)</div>
<div>群14:465953250(2000人已满)</div>
<div>群13:699478442(2000人已满)</div>
<div>群12:884860657(2000人已满)</div>
<!-- <div>群12:884860657(2000人已满)</div> -->
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
......
......@@ -183,7 +183,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>25:165297000 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=RKv-Wgx8HXXCUOeLa6B6WeRHXdfJhXTt&jump_from=webapi">点此加入</a></div>
<div>8:695442854 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=ojVbbaSsh9pdCVIgFcruPk1mcbxzG8co&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -194,7 +194,7 @@
<div>群28:166188776(2000人已满)</div>
<div>群27:811363410(2000人已满)</div>
<div>群26:147867597(2000人已满)</div>
<!-- <div>群25:165297000(2000人已满)</div> -->
<div>群25:165297000(2000人已满)</div>
<div>群24:672494800(2000人已满)</div>
<div>群23:599958679(2000人已满)</div>
<div>群22:687186952(2000人已满)</div>
......@@ -211,7 +211,7 @@
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
<div>群8:695442854(2000人已满)</div>
<!-- <div>群8:695442854(2000人已满)</div> -->
<div>群7:942061423(2000人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(2000人已满)</div>
......
......@@ -9,6 +9,8 @@
内容联盟广告是一个原生全屏组件,大小不可控制
如果需要嵌入到页面控制大小请使用 [短视频内容联盟组件<ad-content-page>](https://uniapp.dcloud.net.cn/component/ad-content-page)
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|
......@@ -89,4 +91,3 @@ HBuilder 基座的测试广告位 `adpid` 为 `1111111112`
}
</script>
```
......@@ -117,11 +117,9 @@ options 为 object 类型,属性如下:
```
### 完整调用示例
### 推荐接入示例@ad-js
支持多页面重复调用,可以传入不同广告位,默认处理了Loading状态、快速点击、数据过期、失败重试1次逻辑
推荐使用此方案
`ad.js` 是对 `uni.createRewardedVideoAd` 的封装,一个页面缓存多页面生效,避免每个页面都预载而不展示的问题,可以传入不同广告位,内部处理了Loading状态、快速点击、数据过期、失败重试1次逻辑
```html
<template>
......@@ -319,7 +317,7 @@ class AdBase {
this._isLoad = false
this.onClose(e)
})
ad.onVerify((e) => {
ad.onVerify && ad.onVerify((e) => {
// e.isValid
})
ad.onError(({
......
......@@ -4,9 +4,9 @@
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|x|x|x|
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|快手小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|x|x|x|√|
**参数说明**
......
......@@ -4,9 +4,9 @@
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|x|x|x|
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|快手小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|x|x|x|√|
**参数说明**
......
......@@ -169,7 +169,7 @@ uni.getSavedFileList({
|参数名|类型|默认值|必填|说明|平台差异说明|
|:-|:-|:-|:-|:-|:-|
|filePath|String||是|本地文件路径||
|digestAlgorithm|String|md5|否|计算文件摘要的算法,可取值 md5、sha1。|微信小程序|
|digestAlgorithm|String|md5|否|计算文件摘要的算法,可取值 md5、sha1。|微信小程序、App 2.9.0+|
|success|Function||否|接口调用成功的回调函数||
|fail|Function||否|接口调用失败的回调函数||
|complete|Function||否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
......@@ -180,7 +180,7 @@ uni.getSavedFileList({
|:-|:-|:-|:-|
|errMsg|String|接口调用结果||
|size|Number|文件大小,以字节为单位。||
|digest|String|按照传入的 digestAlgorithm 计算得出的的文件摘要|微信小程序|
|digest|String|按照传入的 digestAlgorithm 计算得出的的文件摘要|微信小程序、App 2.9.0+|
#### uni.openDocument(OBJECT)
新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx。
......
......@@ -100,3 +100,4 @@ innerAudioContext.onError((res) => {
- 如需音频的倍速播放,可通过video的倍速播放替代实现。插件市场有封装好的插件[音频倍速播放](https://ext.dcloud.net.cn/search?q=%E9%9F%B3%E9%A2%91%E5%80%8D%E9%80%9F%E6%92%AD%E6%94%BE)
- 如果需要带ui的音频播放器样式,可以在插件市场搜索相关[插件](https://ext.dcloud.net.cn/search?q=audio)
- `Android 4.1` 及更高版本对 `PCM/WAVE` 支持范围是 `8` 位和 `16` 位线性 PCM(比特率最高可达到硬件上限)。以 8000、16000 和 44100 Hz 录制原始 PCM 所需的采样率。
......@@ -58,11 +58,11 @@ errCode 说明
**示例**
```javascript
const bgAudioMannager = uni.getBackgroundAudioManager();
bgAudioMannager.title = '致爱丽丝';
bgAudioMannager.singer = '暂无';
bgAudioMannager.coverImgUrl = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/7fbf26a0-4f4a-11eb-b680-7980c8a877b8.png';
bgAudioMannager.src = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3';
const bgAudioManager = uni.getBackgroundAudioManager();
bgAudioManager.title = '致爱丽丝';
bgAudioManager.singer = '暂无';
bgAudioManager.coverImgUrl = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/7fbf26a0-4f4a-11eb-b680-7980c8a877b8.png';
bgAudioManager.src = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3';
```
......
......@@ -23,14 +23,14 @@
**start(options) 说明**
|属性|类型|必填|说明|
|:-|:-|:-|:-|
|duration|Number|否|指定录音的时长,单位 ms ,如果传入了合法的 duration ,在到达指定的 duration 后会自动停止录音,最大值 600000(10 分钟),默认值 60000(1 分钟)|
|sampleRate|Number|否|采样率,有效值 8000/16000/44100|
|numberOfChannels|Number|否|录音通道数,有效值 1/2|
|encodeBitRate|Number|否|编码码率,有效值见下表格|
|format|String|否|音频格式,有效值 aac/mp3/wav/PCM|
|frameSize|String|否|指定帧大小,单位 KB。传入 frameSize 后,每录制指定帧大小的内容后,会回调录制的文件内容,不指定则不会回调。暂仅支持 mp3 格式。|
|属性|类型|必填|说明|平台差异说明|
|:-|:-|:-|:-|:-|
|duration|Number|否|指定录音的时长,单位 ms ,如果传入了合法的 duration ,在到达指定的 duration 后会自动停止录音,最大值 600000(10 分钟),默认值 60000(1 分钟)|App、小程序支持|
|sampleRate|Number|否|采样率,有效值 8000/16000/44100|App、小程序支持|
|numberOfChannels|Number|否|录音通道数,有效值 1/2|仅小程序支持|
|encodeBitRate|Number|否|编码码率,有效值见下表格|仅小程序支持|
|format|String|否|音频格式,有效值 aac/mp3/wav/PCM。App默认值为mp3,小程序默认值aac|App、小程序支持|
|frameSize|String|否|指定帧大小,单位 KB。传入 frameSize 后,每录制指定帧大小的内容后,会回调录制的文件内容,不指定则不会回调。暂仅支持 mp3 格式。|App、百度小程序不支持|
其中,采样率和码率有一定要求,具体有效值如下:
......
......@@ -17,7 +17,7 @@
|stop||停止视频|微信小程序|
|sendDanmu|danmu|发送弹幕,danmu 包含两个属性 text, color||
|playbackRate|rate|设置倍速播放,支持的倍率有 0.5/0.8/1.0/1.25/1.5。微信基础库2.6.3 起支持 2.0 倍速||
|requestFullScreen|无|进入全屏,可传入{direction}参数,详见 video 组件文档||
|requestFullScreen|无|进入全屏,可传入{direction}参数,详见 video 组件文档|H5和字节跳动小程序不支持{direction}参数|
|exitFullScreen|无|退出全屏||
|showStatusBar|无|显示状态栏,仅在iOS全屏下有效|微信小程序、百度小程序、QQ小程序|
|hideStatusBar|无|隐藏状态栏,仅在iOS全屏下有效|微信小程序、百度小程序、QQ小程序|
......
......@@ -279,6 +279,9 @@ uni.share({
|summary |String |- |分享的文字内容 |
|href |String |- |分享链接,ios端分享到微信时必填此字段 |
|imageUrl |String |- |分享图片,仅支持本地路径 |
|success|Function|否|接口调用成功的回调|
|fail|Function|否|接口调用失败的回调函数|
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|
**注意事项**
......
**一键生成iOS通用链接**
#### 背景介绍:
> Universal Link是苹果在WWDC 2015上提出的iOS 9的新特性之一。此特性类似于深层链接,并能够方便地通过打开一个Https链接来直接启动您的客户端应用(手机有安装App)。对比以往所使用的URLSheme, 这种新特性在实现web-app的无缝链接时,能够提供极佳的用户体验。
使用前请阅读[苹果官方文档](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW1)
> 使用前请阅读[苹果官方文档](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW1)。
> 由于苹果iOS 13系统版本安全升级,微信SDK1.8.6版本要求支持Universal Links方式跳转,以便进行合法性校验,提升安全性。更多详情请参考[微信官方说明](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html)
大白话:以前你的APP要打开其他APP是[通过URLScheme](http://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.launchApplication)实现,后来苹果提出用Https链接来启动,手机上对应的app(已安装),更方便与web-app的无缝对接。微信响应了这个方案。所以大家开发的APP无论是微信登陆、微信支付,还是微信分享等一切会跳转到微信,再跳回来的场景,需要提供这个链接。要不然你的应用打开了微信,微信就打不开你的应用。
如果不配置通用链接,使用新版本HX提交云端打包会失败,提示以下错误信息:
```javascript
``` javascript
Error code = -5000
Error message:
Error: not set parameter 'UniversalLinks' @'oauth-weixin'
```
传统方式配置通用链接需要:
1. 在苹果开发者中心:开启Associated Domains服务
2. 获取相关参数,手动创建apple-app-site-association文件
3. 部署apple-app-site-association文件到自己的云服务器,配置SSL证书解析域名
......@@ -24,57 +28,82 @@ Error: not set parameter 'UniversalLinks' @'oauth-weixin'
其中需要注意的细节较多,且调试起来困难繁琐,困扰了大量开发者。
现在通过HbuilderX(3.1.9版起)云打包,支持自动生成apple-app-site-association文件,并自动托管到:自带cdn、ssl等服务的“免费”的云服务空间[uniCloud的前端网页托管](https://uniapp.dcloud.io/uniCloud/hosting),自动完成manifest.json中的相关配置。用自动化技术替代了,如上所示传统方式令人苦恼的(2-5)4个步骤;只需如下三步直接搞定通用链接。
现在通过HBuilderX(3.1.9版起)云打包,支持自动生成apple-app-site-association文件,并自动托管到:自带cdn、ssl等服务的“免费”的云服务空间[uniCloud的前端网页托管](https://uniapp.dcloud.io/uniCloud/hosting),自动完成manifest.json中的相关配置。用自动化技术替代了,如上所示传统方式令人苦恼的(2-5)4个步骤;只需如下三步直接搞定通用链接。
#### 第一步:开启Associated Domains服务
登录[苹果开发者网站](https://developer.apple.com/),在“Certificates, Identifiers & Profiles”页面选择“Identifiers”中选择对应的App ID,确保开启Associated Domains服务
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/2eae9f97-2c4a-4dc8-97e8-e665b0c660e1.png)
**开启Associated Domains服务后需要重新生成profile文件,提交云端打包时使用**
#### 第二步骤 自动生成通用连接(Universal Links)
HBuilderX (3.2.0 版本起) 新增QQ互联和新浪微博开放平台的通用链接的设置。以微信模块为例,QQ与微博与之类似。
打开项目的manifest.json文件,在“(App) SDK配置”项中的微信登录(微信分享、微信支付)下的“iOS平台通用链接(Universal Links)”中,
点击如图所示【自动生成】
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/ea2b1e04-a858-4626-b3fa-bd4ddddd0c3b.jpg)
* 注意您必须先开通"uniCloud(阿里云版)云服务空间和开通前端网页托管"[点此查看开通教程](https://ask.dcloud.net.cn/article/38951),按提示完成操作即可。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/53e0141e-d2d4-496a-b0f2-2359005c0c4e.jpg)
* 注意:通用链接默认域名仅供测试使用,访问频次限制60次/分钟,请勿在正式发行的项目中使用。
* 如何绑定自己的域名详情:[https://uniapp.dcloud.io/uniCloud/hosting?id=domain](https://uniapp.dcloud.io/uniCloud/hosting?id=domain)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/1e081fdd-27b2-4c0b-8985-7d59756ed313.jpg)
#### 第三步:在第三方开放平台配置通用链接
#### 第三步:在微信开放平台配置通用链接
打开微信[开发平台](https://open.weixin.qq.com/),在“管理中心”页面的“移动应用”下找到已经申请的应用(没有申请应用请点击“创建移动应用”新建应用),点击“查看”打开应用详情页面。
##### 微信
打开微信[开放平台](https://open.weixin.qq.com/),在“管理中心”页面的“移动应用”下找到已经申请的应用(没有申请应用请点击“创建移动应用”新建应用),点击“查看”打开应用详情页面。
在“开发信息”栏后点击修改,在“iOS应用”下的“Universal Links”项中配置应用的通用链接,如下图所示:
![](https://img-cdn-tc.dcloud.net.cn/uploads/article/20191008/e933f7ef8ff078bf05e28a24efee74bd.png)
##### QQ
打开QQ[开放平台](https://connect.qq.com/index.html),在“管理中心”页面的“移动应用”下找到已经申请的应用(没有申请应用请点击“创建移动应用”新建应用),点击“查看”打开应用详情页面。
在“开发信息”栏后点击修改,在“iOS应用”下的“Universal Links”项中配置应用的通用链接,如下图所示:
![](https://dcloud-img.oss-cn-hangzhou.aliyuncs.com/client/ulink/QQ.jpeg)
* 注意:QQ开放平台在填写时 只需要填写到host,后边的path QQ会自动生成,比如 HBuilder中一键生成 ```[https://static-fa42aa5f-xxxxxxx-xxxxxxxx.bspapp.com/qq\_conn/11111233333/](https://static-fa42aa5f-xxxxxxx-xxxxxxxx.bspapp.com/qq_conn/11111233333/)``` 只需要填写 ```[https://static-fa42aa5f-xxxxxxx-xxxxxxxx.bspapp.com/](https://static-fa42aa5f-xxxxxxx-xxxxxxxx.bspapp.com/)```,具体请查看 [QQ 填写及校验universallinks](https://wiki.connect.qq.com/%E5%A1%AB%E5%86%99%E5%8F%8A%E6%A0%A1%E9%AA%8Cuniversallinks)
##### 微博
打开微博[开放平台](https://open.weibo.com/),在“我的应用”下找到已经申请的应用,点击“查看”打开应用详情页面。
在“应用信息”栏后点击修改,在“iOS应用”下的“Universal Links”项中配置应用的通用链接,如下图所示:![](https://dcloud-img.oss-cn-hangzhou.aliyuncs.com/client/ulink/weibo.jpeg)
至此,就已经完成了通用链接的配置全过程,云打包后生效。
#### 其他相关
##### 客户端处理通用链接。
可通过5+ API的plus.runtime.launcher判断应用启动来源,如果其值为"uniLink"则表示通过通用链接启动应。这时可通过5+ API的plus.runtime.arguments获取启动参数,通用链接启动的情况将返回完整的通用链接地址。
例:HBuilderX中自带的默认真机运行基座HBuilderX注册的通用链接:[https://demo.dcloud.net.cn/ulink/](https://demo.dcloud.net.cn/ulink/)
##### 通用链接生成原理:
1. 选择云空间获取云空间的默认/自定义域名
2. 按提前制定的规范(uni-universallinks/DCloud appid)拼接URL
3. 根据现有参数自动生成通用链接相关参数到manifest.json
4. 发起云打包时读取证书的profile文件生成apple-app-site-association并部署到前面选定的云空间根目录的.well-known目录下(请勿删除该文件,否则通用链接将失效)
###### 注意事项:
- 通用链接指向的路径可以为空,他只是一种信息传递方式。可以简单地理解为:通过解析URL的“/”后的参数到apple-app-site-association中找到指定的包名并唤醒对应的APP
- 通用链接内容保存在manifest.json中"云打包后生效",被手机读取的时机是应用被安装的时候。如果你的通用链接内容有变化,你需要重新提交云打包,并重新安装一次应用才能生效
- 通用链接最终托管在服务端,如有变动注意缓存的清理,例如尝试重启手机等操作
>如果你是本地离线打包或者由于某种原因你需要用传统的方式:私有化部署服务器来托管apple-app-site-association文件创建通用链接。你仍然可以通过手动配置manifest.json实现。详情:[https://ask.dcloud.net.cn/article/36393#unilink](https://ask.dcloud.net.cn/article/36393#unilink)
* 通用链接指向的路径可以为空,他只是一种信息传递方式。可以简单地理解为:通过解析URL的“/”后的参数到apple-app-site-association中找到指定的包名并唤醒对应的APP
* 通用链接内容保存在manifest.json中"云打包后生效",被手机读取的时机是应用被安装的时候。如果你的通用链接内容有变化,你需要重新提交云打包,并重新安装一次应用才能生效
* 通用链接最终托管在服务端,如有变动注意缓存的清理,例如尝试重启手机等操作
> 如果你是本地离线打包或者由于某种原因你需要用传统的方式:私有化部署服务器来托管apple-app-site-association文件创建通用链接。你仍然可以通过手动配置manifest.json实现。详情:[https://ask.dcloud.net.cn/article/36393#unilink](https://ask.dcloud.net.cn/article/36393#unilink)
##### 常见问题
1. 为什么我打开通用链接提示:`The requested file was not found on this server.`
1.为什么我打开通用链接提示:`The requested file was not found on this server.`
这是正常现象。通用链接并不要求是一个有效的路径,换句话说这个链接指向的目录允许为空。原理是访问这个链接时,iphone检测到当前域名为通用链接对应的域名,就读取域名服务器下的apple-app-site-association,然后根据域名后面的路径名称,验证并解析出要打开的app包名并唤醒对应的app。
2. 如何验证通用链接已经生效,有什么表现或者测试方案
2.如何验证通用链接已经生效,有什么表现或者测试方案
你可以将通用链接输入到iphone自带Safari浏览器中,下拉即可看到通用链接对应到应用名称和一个打开按钮,点击按钮即可直接在浏览器打开对应的APP。详情:[点此查看演示视频](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/4e920b86-0f67-45ac-81f6-6b97f87ff0ae.mp4)
\ No newline at end of file
......@@ -8,6 +8,8 @@
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|√|√|
注:App没有内置截屏相关功能,可以在插件市场搜索相关插件,[详见](https://ext.dcloud.net.cn/search?q=%E6%88%AA%E5%B1%8F)
**CALLBACK返回参数:**
......
......@@ -21,6 +21,7 @@
|值|说明|平台差异说明|
|:-|:-|:-|
|success|显示成功图标,此时 title 文本最多显示 7 个汉字长度。默认值||
|error|显示错误图标,此时 title 文本最多显示 7 个汉字长度。||
|loading|显示加载图标,此时 title 文本最多显示 7 个汉字长度。|支付宝小程序不支持|
|none|不显示图标,此时 title 文本在`小程序`最多可显示两行,`App`仅支持单行显示。|&nbsp;|
......
......@@ -3,7 +3,7 @@
目前需分平台编写
- 微信小程序:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/worker/wx.createWorker.html)
- 字节跳动小程序:[规范详情](https://developer.toutiao.com/docs/game/worker/tt.createWorker.html)
- 字节跳动小程序:[规范详情](https://microapp.bytedance.com/docs/zh-CN/mini-game/develop/api/worker/tt-create-worker)
- QQ小程序:[规范详情](https://q.qq.com/wiki/develop/miniprogram/API/worker/worker.html)
- H5:标准H5的worker仍然可以使用
- App:App的js是在独立的jscore运行的,如果需要在另一个线程运行js,可以使用web-view组件或renderjs,这样的js运行在webview里,和jscore里的js是两个线程。但注意多个webview之间的js是一个进程,使用webview里的js时注意会影响视图层的渲染。
## 背景
为有效治理App强制授权、过度索权、超范围收集个人信息等现象,落实《网络安全法》《消费者权益保护法》的要求,保障个人信息安全,2019年1月,中央网信办、工信部、公安部、市场监管总局等四部委发布了《关于开展App违法违规收集使用个人信息专项治理的公告》,在全国范围组织开展App违法违规收集使用个人信息专项治理,并陆续出台完善了《App违法违规收集使用个人信息行为认定方法》、《GB/T 35273-2020 信息安全技术 个人信息安全规范》等标准规范。
根据以上规范要求,各大应用市场都加强应用的检测,要求应用必须符合相关政策,否则应用将有被通报或下架的风险。
目前开发者最常碰到的以下问题:
- 违规收集个人信息
- 强制、频繁、过度索取权限
针对以上问题,请参考下文的解决方案,务必仔细阅读,注意各细节问题。
**`首先碰到此问题请更新到HbuilderX3.1.22及以上版本`**
## 如何解决"违规收集个人信息"问题
关于收集个人信息问题,首先应用必须配置“隐私与政策”协议框,其次必须在“隐私与政策”非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围,用户个人信息包括但不限于mac地址、设备序列号、imei、imsi、软件安装列表、通讯录信息、短信信息等。
**注意:根据政策要求隐私提示框显示之前不能调用涉及个人信息相关API(如设备标识),因此需要更新到HBuilderX3.1.22及以上版本重新提交云端打包**
### 第一步:配置隐私与政策提示框
必须确保应用存在《隐私政策》,在应用首次启动时弹出提示并取得用户同意。
**注意:一定要配置使用“template”模式隐私与政策提示框,详情参考[https://ask.dcloud.net.cn/article/36937](https://ask.dcloud.net.cn/article/36937)**
### 第二步:在隐私政策中添加DCloud相关条款
请在《隐私政策》中必告知用户您的应用基于DCloud uni-app(5+ App/Wap2App)开发,添加如下参考条款:
`我们的产品基于DCloud uni-app(5+ App/Wap2App)开发,应用运行期间需要收集您的设备唯一识别码(IMEI/android ID/DEVICE_ID/IDFA、SIM 卡 IMSI 信息)以提供统计分析服务,并通过应用启动数据及异常错误日志分析改进性能和用户体验,为用户提供更好的服务。`
### 第三步:在隐私政策中添加其它三方SDK的条款
#### uni-app默认集成三方SDK
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|官网链接|
|:----|:----|:----|:----|:----|:----
|阿里weexSDK|com.taobao|uni-app基础模块默认集成,用于渲染uniapp的nvue页面引擎|存储的个人文件|读取外置存储器、写入外置存储器|[http://doc.weex.io/zh](http://doc.weex.io/zh/)|
|fresco图片库|com.facebook.fresco|uni-app基础模块默认集成,用于nvue页面加载图片使用|存储的个人文件|读取外置存储器、写入外置存储器|[https://www.fresco-cn.org/](https://www.fresco-cn.org/)|
#### UniPush
UniPush是DCloud联合个推公司推出的集成型统一推送服务,使用了个推提供的SDK,因此需要在《隐私政策》中添加“个推消息推送SDK”相关说明。
建议《隐私政策》添加 “与授权合作伙伴共享”条款中,将 个推的用户隐私政策 加入其中,并向终端用户逐一明示您嵌入的SDK收集使用个人信息的目的、方式和范围。参考内容如下:
`消息推送服务供应商:由每日互动股份有限公司提供推送技术服务,我们可能会将您的设备平台、设备厂商、设备品牌、设备识别码等设备信息,应用列表信息、网络信息以及位置相关信息提供给每日互动股份有限公司,用于为您提供消息推送技术服务。我们在向您推送消息时,我们可能会授权每日互动股份有限公司进行链路调节,相互促活被关闭的SDK推送进程,保障您可以及时接收到我们向您推送的消息。详细内容请访问《个推用户隐私政策》(需将《个推用户隐私政策》超链至:http://docs.getui.com/privacy)`
UniPush模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|个推|com.getui.gtc 、com.igexin.sdk|UniPush推送|网络信息、IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://docs.getui.com/privacy/](https://docs.getui.com/privacy/)
#### Statistic
HX3.1.14+ 友盟SDK已升级到9.3.8版本 适配合规问题
+ 当你集成了统计模块。您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意!!!
+ 您务必告知用户您选择友盟+SDK服务,请在《隐私政策》中增加如下参考条款:“我们的产品集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。”
+ 您务必确保用户同意《隐私政策》之后。再调用相关api!!!!
Statistic模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|友盟|com.uc.crashsdk、com.efs、com.umeng|统计|网络信息、IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://developer.umeng.com/docs/...](https://developer.umeng.com/docs/119267/detail/182050)
#### OAuth
OAuth模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|微信|com.tencent.mm|微信登录|存储的个人文件|读取外置存储器、写入外置存储器|[https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy](https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy)|
|新浪微博|com.sina.weibo|新浪微博登录|存储的个人文件、IMEI、openid|读取外置存储器、写入外置存储器|[https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1](https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1)|
|QQ登录|com.tencent.open|QQ登录|IMEI、openid、位置信息|访问粗略位置、访问精准定位、后台访问地理位置、读取外置存储器、写入外置存储器、读取手机状态和身份|[https://ti.qq.com/agreement/qqface.html?appname=mqq_2019](https://ti.qq.com/agreement/qqface.html?appname=mqq_2019)|
|个验一键登录|com.g.elogin、com.g.gysdk|一键登录|运营商信息|读取外置存储器、写入外置存储器|[https://docs.getui.com/privacy/](https://docs.getui.com/privacy/)|
#### Share
Share模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|微信|com.tencent.mm|微信分享|存储的个人文件|读取外置存储器、写入外置存储器|[https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy](https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy)|
|新浪微博|com.sina.weibo|新浪微博分享|存储的个人文件、IMEI、openid|读取外置存储器、写入外置存储器|[https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1](https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1)|
|QQ|com.tencent.open|QQ分享|IMEI、openid、位置信息|访问粗略位置、访问精准定位、后台访问地理位置、读取外置存储器、写入外置存储器、读取手机状态和身份|[https://ti.qq.com/agreement/qqface.html?appname=mqq_2019](https://ti.qq.com/agreement/qqface.html?appname=mqq_2019)|
#### Payment
Payment模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|微信|com.tencent.mm|微信支付|存储的个人文件|读取外置存储器、写入外置存储器|[https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy](https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy)|
|支付宝|com.alipay|支付宝支付|暂无|读取网络状态|[https://render.alipay.com/p/c/k2cx0tg8](https://render.alipay.com/p/c/k2cx0tg8)|
#### Speech
Speech模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|百度语音识别|com.baidu.speech|语音识别|IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3](https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3)|
|讯飞语音|com.iflytek|语音识别|IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://www.xfyun.cn/doc/policy/privacy.html](https://www.xfyun.cn/doc/policy/privacy.html)|
#### Map & Geolocation
Map & Geolocation模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|高德|com.amap.api, com.loc, com.autonavi|地图&定位|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、访问粗略位置、访问精准定位、读取手机状态和身份|[https://lbs.amap.com/agreement/compliance](https://lbs.amap.com/agreement/compliance)|
|百度|com.baidu|地图&定位|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、访问粗略位置、访问精准定位、读取手机状态和身份|[https://map.baidu.com/zt/client/privacy/index.html](https://map.baidu.com/zt/client/privacy/index.html)|
#### uni-AD
uni-AD广告模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|快手|com.kwad.sdk|广告|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、读写外置存储器、读取手机状态和身份|[https://www.kuaishou.com/about/policy](https://www.kuaishou.com/about/policy)|
|优量汇|com.qq.e|广告|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、读写外置存储器、读取手机状态和身份|[https://imgcache.qq.com/..privacy](https://imgcache.qq.com/gdt/cdn/adn/uniondoc/ylh_sdk_privacy_statement.html)|
|穿山甲|com.bytedance.sdk. openadsdk.adhost|广告|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、读写外置存储器、读取手机状态和身份|[https://www.pangle.cn/privacy/partner](https://www.pangle.cn/privacy/partner)|
#### 腾讯x5内核
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|x5内核|com.tencent.tbs、com.tencent.smtt|x5内核渲染webview|IMEI、openid|读写外置存储器、读取手机状态和身份|[https://x5.tencent.com/docs/privacy.html](https://x5.tencent.com/docs/privacy.html)|
如果您的应用使用了依赖三方SDK的模块也需要将其合规条款添加到《隐私政策》中
#### uni原生插件
如果应用使用了uni原生插件,需要注意一下几点:
+ 使用插件时请查看插件详情页面中的 `隐私、权限声明` 。(插件使用什么sdk?获取了什么用户信息?都应由插件作者提供并填写在 `隐私、权限声明`中)
+ 将插件中用到的三方SDK信息添加到用户隐私协议中。例如集成了`百度定位`。就需要在隐私协议中说明集成了百度定位SDK。获取了xxx用户信息!用于xxx.
+ 如果发现插件有获取用户信息而插件详情页并没有提供`隐私、权限声明`,请与插件开发者或与我们反馈共同督促进行补充。
#### 其它
《隐私政策》必须非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围。
如果应用使用“通讯录”、“短信”等相关功能,请根据应用业务场景进行描述。
#### 如何解决"强制、频繁、过度索取权限"问题
对于权限问题,主要注意以下几个方面:
+ 应用中没有对应的服务或场景时,不要申请对应权限(例如没有使用到位置的服务时,不要申请定位权限)
+ 应用申请权限时,如果用户拒绝,不要直接退出APP无法使用。千万不要将应用启动时申请“读写手机存储”和“访问设备信息”权限设置为“always”,详情参考:[https://ask.dcloud.net.cn/article/36549](https://ask.dcloud.net.cn/article/36549)
+ 调用申请权限相关时,如果用户拒绝,非用户主动触发功能,不要重复调用API触发弹出申请权限窗口影响用户使用
在开发uni-app中还需要注意以下问题:
`不要在页面生命周期onShow中调用可能触发权限提示框的API,如` [uni.getLocation](https://uniapp.dcloud.io/api/location/location?id=getlocation)[uni.chooseImage](https://uniapp.dcloud.io/api/media/image?id=chooseimage)`等`
#### 如何解决“强制用户使用定向推送功能”问题
《隐私政策》中涉及到 “推荐”、“定制”、“个性化”等关键字改为“提供、展示、通知、发送、、、”等字眼,如果确实会涉及到个性化服务请在app的设置中增加个性化推送开关
#### 如何解决 用户点击《隐私政策》“同意”前,APP和SDK不要进行任何行为,包括SDK不能初始化,APP或SDK不能收集用户信息(包括但不限于IMEI、IMSI、设备MAC地址、软件列表、设备序列号、androidID)
注意:`apk是在7月8号之前基于HX3.1.18云打包生产的apk可能存在提前获取IMIE问题,打包机已修复该问题!请使用HX3.1.18重新云打包。离线打包请更新3.1.18紧急更新的aar资源即可`
+ 请先确保APK是基于3.1.18+版本生产的!
+ 确保已配置使用“template”模式隐私与政策提示框!
+ 可以通过小米手机 系统是MIUI12设备。安装你的应用。然后查看`应用详情`-->`应用行为记录`是否在点击“同意”前有获取权限信息等情况。
+ 如果你 app 是离线打包请务必关闭调试开关,修改项目dcloud_control.xml中syncDebug为false
+ 以上都符合请重新提交平台检测。
**各大应用市场上架合规审查细节可能存在差异,如果开发者碰到相关问题请及时反馈,我们会及时汇总整理供大家参考**
#### 如何解决“用户不同意强制退出应用”问题
这个问题可能是隐私弹窗显示后,用户选择了“不同意”按钮后应用退出导致的。请按以下修改。
+ 配置二次弹窗提示second,参考[https://ask.dcloud.net.cn/article/36937](https://ask.dcloud.net.cn/article/36937)
+ 二次弹窗配置按钮信息为“同意并继续”和“退出应用”
#### 关于离线SDK需要注意
如果重写了DCloudApplication,需要注意在Application初始化的三方SDK的合规操作。防止导致启动隐私弹窗前获取了用户信息无法上架
#### app上架应用市场,检测集成了广告被拒的解决方案
+ 使用HX云打包时是否勾选了三方广告!如果勾选了请在隐私协议添加广告隐私说明。误勾选请去除并重新打包上架。
+ 离线打包检测是否集成了相关三方广告SDK!如果集成了请在隐私协议添加广告隐私说明。误集成请去除并重新编译apk上架。
#### 应用没有勾选三方广告模块但是上架华为市场检测反馈集成了广告被拒
uni-AD广告基础功能包含管理其它三方广告SDK的逻辑,会通过反射判断广告SDK是否存在,在没有勾选“360广告联盟”、“今日头条穿山甲广告联盟”、“腾讯优量汇广告联盟”、”快手广告联盟“时,也可能会被华为应用市场检测为包含奇虎360、广点通/优量汇、穿山甲等广告SDK,实际上apk中并没有包含相应的广告SDK。我们已经在优化广告基础功能实现方案来避免(请关注新版本更新日志),目前可以通过以下临时方案解决:
+ 向华为应用市场申诉,说明安装包中并没有包含广告SDK,只是存在反射判断广告SDK是否存在
+ 目前我们收到此反馈此问题的都是5+ App项目,uni-app项目可能并不存在此问题,建议有条件的话将5+ App项目升级为uni-app项目
#### 看不懂文档不知道如何修改?
可开通付费技术服务 参考:[https://ask.dcloud.net.cn/article/13015](https://ask.dcloud.net.cn/article/13015)
## 相关参考
Android平台隐私与政策提示框配置方法:[https://ask.dcloud.net.cn/article/36937](https://ask.dcloud.net.cn/article/36937)
Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息:[https://ask.dcloud.net.cn/article/36549](https://ask.dcloud.net.cn/article/36549)
Android平台配置权限参考:[https://ask.dcloud.net.cn/article/36982](https://ask.dcloud.net.cn/article/36982)
\ No newline at end of file
......@@ -13,6 +13,7 @@
* [生命周期](collocation/frame/lifecycle.md)
* [页面](collocation/frame/window.md)
* [页面通讯](collocation/frame/communication.md)
* [SSR服务端渲染](collocation/ssr.md)
* [国际化](collocation/i18n.md)
* 自动化测试
* [快速开始](collocation/auto/quick-start.md)
......@@ -55,7 +56,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>25:165297000 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=RKv-Wgx8HXXCUOeLa6B6WeRHXdfJhXTt&jump_from=webapi">点此加入</a></div>
<div>8:695442854 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=ojVbbaSsh9pdCVIgFcruPk1mcbxzG8co&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -66,7 +67,7 @@
<div>群28:166188776(2000人已满)</div>
<div>群27:811363410(2000人已满)</div>
<div>群26:147867597(2000人已满)</div>
<!-- <div>群25:165297000(2000人已满)</div> -->
<div>群25:165297000(2000人已满)</div>
<div>群24:672494800(2000人已满)</div>
<div>群23:599958679(2000人已满)</div>
<div>群22:687186952(2000人已满)</div>
......@@ -83,7 +84,7 @@
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
<div>群8:695442854(2000人已满)</div>
<!-- <div>群8:695442854(2000人已满)</div> -->
<div>群7:942061423(2000人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(2000人已满)</div>
......
......@@ -22,6 +22,7 @@ uni-app提供了一批API,这些API可以操控uni-app应用,包括运行、
目前仅 [cli](https://uniapp.dcloud.net.cn/quickstart?id=_2-通过vue-cli命令行) 工程支持。有利于持续集成。
[HBuilderX uniapp自动化测试插件](https://ext.dcloud.net.cn/plugin?id=5708), 支持在HBuilderX内对uniapp普通项目、cli项目进行自动化测试。此插件简化了测试环境安装、测试用例创建、测试运行、测试设备选择等步骤。
推荐使用方式:研发提交源码到版本库后,持续集成系统自动拉取源码,自动运行自动化测试。
暂不支持百度,先忽略百度相关测试代码
......@@ -357,5 +358,3 @@ await tag.$('.test')
3. 微信小程序暂不支持父子选择器
4. 百度小程序选择元素必须有事件的元素才能被选中,否则提示元素不存在
5. 分包中的页面,打开之后要延迟时间长一点,否则不能正确获取到页面信息
......@@ -17,6 +17,7 @@
- 应用生命周期仅可在``App.vue``中监听,在其它页面监听无效。
- onlaunch里进行页面跳转,如遇白屏报错,请参考[https://ask.dcloud.net.cn/article/35942](https://ask.dcloud.net.cn/article/35942)
- onPageNotFound 页面实际上已经打开了(比如通过分享卡片、小程序码)且发现页面不存在,才会触发,api 跳转不存在的页面不会触发(如 uni.navigateTo)
**示例代码**
```html
......
......@@ -6,7 +6,6 @@
|:-|:-|:-|:-|:-|
|name|String||应用名称||
|appid|String|新建 uni-app 项目时,DCloud 云端分配。用途[详见](https://ask.dcloud.net.cn/article/35907)|应用标识||
|screenOrientation|Array||重力感应、横竖屏配置,可取值:"portrait-primary":竖屏正方向;"portrait-secondary":竖屏反方向;"landscape-primary":横屏正方向;"landscape-secondary":横屏反方向。||
|description|String||应用描述||
|versionName|String||版本名称,例如:1.0.0。详见下方Tips说明||
|versionCode|String||版本号,例如:36||
......@@ -55,6 +54,7 @@ uni 统计配置项
|属性|类型|说明|最低版本|
|:-|:-|:-|:-|
|splashscreen|Object|App 启动界面信息,[详见](/collocation/manifest?id=splashscreen)||
|screenOrientation|Array|重力感应、横竖屏配置,可取值:"portrait-primary":竖屏正方向;"portrait-secondary":竖屏反方向;"landscape-primary":横屏正方向;"landscape-secondary":横屏反方向。||
|modules|Object|权限模块,[详见](/collocation/manifest?id=modules)||
|distribute|Object|App 发布信息,[详见](/collocation/manifest?id=distribute)||
|usingComponents|Boolean|是否启用自定义组件模式,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)|1.9.0+|
......@@ -127,7 +127,7 @@ splash(启动封面)是App必然存在的、不可取消的。
|android|Object|Android 应用配置,详见: [完整 manifest.json](/collocation/manifest?id=完整-manifestjson)|
|ios|Object|iOS 应用配置,详见: [完整 manifest.json](/collocation/manifest?id=完整-manifestjson)|
|sdkConfigs|Object|SDK配置,仅打包生效 [详见](/collocation/manifest?id=sdkConfigs)|
|orientation|Array|同 screenOrientation 配置,仅打包生效,推荐使用 screenOrientation|
|orientation|Array|同 screenOrientation 配置,仅打包生效,已废弃,推荐使用 screenOrientation|
##### App SdkConfigs@sdkConfigs
......@@ -547,13 +547,13 @@ mp-qq只支持自定义组件模式,不存在usingComponents配置
"uniStatistics": {
"enable": false
},
"screenOrientation": [
"portrait-primary",
"landscape-primary",
"portrait-secondary",
"landscape-secondary"
],
"app-plus": {
"screenOrientation": [
"portrait-primary",
"landscape-primary",
"portrait-secondary",
"landscape-secondary"
],
"optimization": {
"subPackages": true
},
......
......@@ -155,7 +155,7 @@
|rpxCalcMaxDeviceWidth|Number|960|rpx 计算所支持的最大设备宽度,单位 px|App、H5(2.8.12+)|
|rpxCalcBaseDeviceWidth|Number|375|rpx 计算使用的基准设备宽度,设备实际宽度超出 rpx 计算所支持的最大设备宽度时将按基准宽度计算,单位 px|App、H5(2.8.12+)|
|rpxCalcIncludeWidth|Number|750|rpx 计算特殊处理的值,始终按实际的设备宽度计算,单位 rpx|App、H5(2.8.12+)|
|maxWidth|Number|1190|单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选)|H5(2.9.9+)|
|maxWidth|Number||单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选)|H5(2.9.9+)|
**注意**
......@@ -320,7 +320,7 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽
|leftWindow|Boolean|true|当存在 leftWindow时,当前页面是否显示 leftWindow|H5|
|topWindow|Boolean|true|当存在 topWindow 时,当前页面是否显示 topWindow|H5|
|rightWindow|Boolean|true|当存在 rightWindow时,当前页面是否显示 rightWindow|H5|
|maxWidth|Number|1190|单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选)|H5(2.9.9+)|
|maxWidth|Number||单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选)|H5(2.9.9+)|
**注意**
......
......@@ -126,33 +126,33 @@ export function createApp() {
3. 在页面或组件中使用
```html
<template>
<text v-if="item">{{ item.title }}</text>
<text v-else>...</text>
</template>
<script>
const id = 1;// 模拟ID
export default {
computed: {
item() {
return this.$store.state.items[id]
}
},
serverPrefetch() {// 服务端预取数据的生命周期
return this.fetchItem()
},
mounted() { // 仅客户端执行的生命周期
if (!this.item) { // 判断服务端是否已正常获取,若未获取,重新调用加载数据
this.fetchItem()
}
},
methods: {
fetchItem() {
return this.$store.dispatch('fetchItem', id)
}
}
}
<template>
<text v-if="item">{{ item.title }}</text>
<text v-else>...</text>
</template>
<script>
const id = 1;// 模拟ID
export default {
computed: {
item() {
return this.$store.state.items[id]
}
},
serverPrefetch() {// 服务端预取数据的生命周期
return this.fetchItem()
},
mounted() { // 仅客户端执行的生命周期
if (!this.item) { // 判断服务端是否已正常获取,若未获取,重新调用加载数据
this.fetchItem()
}
},
methods: {
fetchItem() {
return this.$store.dispatch('fetchItem', id)
}
}
}
</script>
```
......@@ -162,20 +162,20 @@ export default {
* 开通[uniCloud](https://unicloud.dcloud.net.cn)以及[前端网页托管](https://uniapp.dcloud.net.cn/uniCloud/hosting)
* 配置`vite.config.js`中的`base``前端网页托管`地址
```js
import {
defineConfig
} from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
// https://vitejs.dev/config/
export default defineConfig({
base: 'https://static-xxxx.bspapp.com/', // uniCloud 前端网页托管资源地址(主要是应用编译后的js,图片等静态资源,可以配置为二级目录)
plugins: [
uni(),
],
import {
defineConfig
} from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
// https://vitejs.dev/config/
export default defineConfig({
base: 'https://static-xxxx.bspapp.com/', // uniCloud 前端网页托管资源地址(主要是应用编译后的js,图片等静态资源,可以配置为二级目录)
plugins: [
uni(),
],
})
```
* 编译:
> cli工程:`npm run build:h5:ssr`或通过`HBuilderX`的`发行菜单->网站 PC-Web或手机H5`、勾选`ssr`
> cli工程:`npm run build:h5:ssr`或通过`HBuilderX 3.1.16及以上版本`的`发行菜单->网站 PC-Web或手机H5`、勾选`ssr`
![以ssr模式发行](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/d7574ced-e253-4b73-8187-86d6a8811364.jpg)
......
......@@ -294,7 +294,7 @@ uni-app支持的组件分为vue组件和小程序自定义组件。
- vue组件:[文档](https://uniapp.dcloud.net.cn/vue-components?id=%e6%a6%82%e5%bf%b5)
- 小程序自定义组件:其规范不是vue规范,而是小程序规范,[文档](https://uniapp.dcloud.net.cn/frame?id=%e5%b0%8f%e7%a8%8b%e5%ba%8f%e8%87%aa%e5%ae%9a%e4%b9%89%e7%bb%84%e4%bb%b6%e6%94%af%e6%8c%81)
日常开发来讲,推荐使用vue组件。uni-app支持小程序组件要是为了兼容更多生态资源。
日常开发来讲,推荐使用vue组件。uni-app支持小程序组件要是为了兼容更多生态资源。
如果扩展组件符合uni-app的`easycom`组件规范,则可以免注册,直接使用。比如uni ui扩展组件就符合`easycom`组件规范。
......
......@@ -147,7 +147,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>25:165297000 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=RKv-Wgx8HXXCUOeLa6B6WeRHXdfJhXTt&jump_from=webapi">点此加入</a></div>
<div>8:695442854 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=ojVbbaSsh9pdCVIgFcruPk1mcbxzG8co&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -158,7 +158,7 @@
<div>群28:166188776(2000人已满)</div>
<div>群27:811363410(2000人已满)</div>
<div>群26:147867597(2000人已满)</div>
<!-- <div>群25:165297000(2000人已满)</div> -->
<div>群25:165297000(2000人已满)</div>
<div>群24:672494800(2000人已满)</div>
<div>群23:599958679(2000人已满)</div>
<div>群22:687186952(2000人已满)</div>
......@@ -175,7 +175,7 @@
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
<div>群8:695442854(2000人已满)</div>
<!-- <div>群8:695442854(2000人已满)</div> -->
<div>群7:942061423(2000人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(2000人已满)</div>
......
......@@ -19,7 +19,7 @@ banner或信息流广告展现场景非常灵活,常见的展现场景为:
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快应用|360小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√(2.5.2+)|x|√|x|√|√|√|x|x|
|√(2.5.2+)|√(3.1.22+)|√|x|√|√|√|x|x|
**开通配置广告**
......@@ -27,7 +27,7 @@ banner或信息流广告展现场景非常灵活,常见的展现场景为:
开通广告步骤:
1. 开通广告
需在广告平台后台操作:
* App平台:[https://uniad.dcloud.net.cn/](https://uniad.dcloud.net.cn/)
* App/H5平台:[https://uniad.dcloud.net.cn/](https://uniad.dcloud.net.cn/)
* 小程序平台:在各自的小程序管理后台操作。
2. 申请广告位id
在各位后台申请广告位id
......@@ -40,6 +40,8 @@ banner或信息流广告展现场景非常灵活,常见的展现场景为:
|:-|:-|:-|:-|:-|
|data|Object|可选|广告数据,通过 plus.ad.getAds (参考示例代码),设置后adpid将无效|App|
|adpid|String||uni-AD App广告位id,在[uni-AD官网](https://uniad.dcloud.net.cn/)申请广告位|App|
|adpid-widescreen|String||同`adpid`, 一般用于大屏幕生效,当组件的宽度大于 750px 时生效,可以自定义生效的范围,参见 `widescreen-width`|H5|
|widescreen-width|number|750|`widescreen` 自定义组件生效宽度|H5|
|unit-id|String||广告单元id,可在小程序管理后台的流量主模块新建|微信小程序、字节跳动小程序(最低版本1.19.0+)、QQ小程序|
|ad-intervals|number||广告自动刷新的间隔时间,单位为秒,参数值必须大于等于30(该参数不传入时 Banner 广告不会自动刷新)|微信小程序(基础库2.3.1+)|
|appid|String||小程序应用 ID|百度小程序|
......@@ -60,7 +62,7 @@ banner或信息流广告展现场景非常灵活,常见的展现场景为:
**type属性 头条**
广告的类型,默认 bannner,具体类型有:banner、video(视频)、large(大图)、lImg(左图右文)、rImg(右图左文),默认值为 banner
广告的类型,默认 banner,具体类型有:banner、video(视频)、large(大图)、lImg(左图右文)、rImg(右图左文),默认值为 banner
**type属性 QQ**
......@@ -161,7 +163,7 @@ export default {
```
api的方式(仅app平台支持)
api的方式(仅app平台支持),不推荐使用这种调用方式,调用比较复杂,且不跨平台,开发者还需要手动处理缓存逻辑
``` html
<template>
......@@ -219,7 +221,7 @@ export default {
```
使用 ad/ad-draw 模拟插屏广告效果
使用 ad/ad-draw 模拟插屏广告效果@Interstitial
```html
<template>
......@@ -289,6 +291,28 @@ export default {
```
#### H5特定环境不显示广告示例@h5MicroMessengerHide
```html
<template>
<view>
<!-- 下面的示例在微信中打开H5页面不显示广告 -->
<ad class="ad" v-if="showAd" adpid="1111111111"></ad>
</view>
</template>
<script>
export default {
data() {
let showAd = !navigator.userAgent.includes("MicroMessenger")
return {
showAd
}
},
}
</script>
```
**激励视频广告**
文档地址:[https://uniapp.dcloud.io/api/a-d/rewarded-video](https://uniapp.dcloud.io/api/a-d/rewarded-video)
......@@ -298,4 +322,5 @@ export default {
- App端广告开通指南和收益相关问题:[https://ask.dcloud.net.cn/article/36769](https://ask.dcloud.net.cn/article/36769)
- App端除了ad组件,还支持开屏、激励视频等多种广告形式。详见[uni-AD官网](https://uniad.dcloud.net.cn/)
- App端uni-AD聚合了腾讯广点通、头条穿山甲、360广告联盟等服务,打包时必须勾选相应的sdk,详见:[https://ask.dcloud.net.cn/article/36718](https://ask.dcloud.net.cn/article/36718)
- H5平台仅支持uni-app
![](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/f21eb570-4f32-11eb-b680-7980c8a877b8.jpg)
......@@ -6,13 +6,13 @@
|属性名|类型|默认值|说明|平台差异说明|
|:-|:-|:-|:-|:-|
|type|String||指定 canvas 类型,支持 2d (2.9.0) 和 webgl|微信小程序 2.7.0+|
|type|String||指定 canvas 类型,支持 2d (2.9.0) 和 webgl|微信小程序 2.7.0+ 字节小程序1.78.0+|
|canvas-id|String||canvas 组件的唯一标识符||
|disable-scroll|Boolean|false|当在 canvas 中移动时且有绑定手势事件时,禁止屏幕滚动以及下拉刷新|字节跳动小程序不支持|
|@touchstart|EventHandle||手指触摸动作开始|字节跳动小程序不支持|
|@touchmove|EventHandle||手指触摸后移动|字节跳动小程序不支持|
|@touchend|EventHandle||手指触摸动作结束|字节跳动小程序不支持|
|@touchcancel|EventHandle||手指触摸动作被打断,如来电提醒,弹窗|字节跳动小程序不支持|
|@touchstart|EventHandle||手指触摸动作开始|字节小程序1.78.0+|
|@touchmove|EventHandle||手指触摸后移动|字节小程序1.78.0+|
|@touchend|EventHandle||手指触摸动作结束|字节小程序1.78.0+|
|@touchcancel|EventHandle||手指触摸动作被打断,如来电提醒,弹窗|字节小程序1.78.0+|
|@longtap|EventHandle||手指长按 500ms 之后触发,触发了长按事件后进行移动不会触发屏幕的滚动|字节跳动小程序不支持|
|@error|EventHandle||当发生错误时触发 error 事件,detail = {errMsg: 'something wrong'}|字节跳动小程序不支持|
......
......@@ -35,7 +35,7 @@ editor组件目前只有H5、App的vue页面、微信小程序、百度小程序
| @input | eventhandle | | 否 | 编辑器内容改变时触发,detail = {html, text, delta} |
| @statuschange | eventhandle | | 否 | 通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式 |
编辑器内支持部分 HTML 标签和内样式,不支持**class****id**
编辑器内支持部分 HTML 标签和内样式,不支持**class****id**
#### 支持的标签
......@@ -46,7 +46,7 @@ editor组件目前只有H5、App的vue页面、微信小程序、百度小程序
| 行内元素 | `<span> <strong> <b> <ins> <em> <i> <u> <a> <del> <s> <sub> <sup> <img>` |
| 块级元素 | `<p> <h1> <h2> <h3> <h4> <h5> <h6> <hr> <ol> <ul> <li>` |
#### 支持的内样式
#### 支持的内样式
内联样式仅能设置在行内元素或块级元素上,不能同时设置。例如 font-size` 归类为行内元素属性,在 p 标签上设置是无效的。
......
### ad
Banner 广告。
仅微信小程序平台支持,[规范详情](https://developers.weixin.qq.com/miniprogram/dev/component/ad.html)
### official-account
公众号关注组件。当用户扫小程序码打开小程序时,开发者可在小程序内配置公众号关注组件,方便用户快捷关注公众号,可嵌套在原生组件内。
仅微信小程序平台支持,[规范详情](https://developers.weixin.qq.com/miniprogram/dev/component/official-account.html)
\ No newline at end of file
......@@ -218,7 +218,7 @@ export default {
} else if (type === 'end') {
year = year + 2;
}
month = month > 9 ? month : '0' + month;;
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
}
......
......@@ -33,7 +33,7 @@
|@refresherrestore |EventHandle| |自定义下拉刷新被复位|app-vue 2.5.12+,微信小程序基础库2.10.1+|
|@refresherabort |EventHandle| |自定义下拉刷新被中止|app-vue 2.5.12+,微信小程序基础库2.10.1+|
使用竖向滚动时,需要给 ``<scroll-view>`` 一个固定高度,通过 css 设置 height。
使用竖向滚动时,需要给 ``<scroll-view>`` 一个固定高度,通过 css 设置 height;使用横向滚动式,需要给``<scroll-view>``添加``white-space: nowrap;``样式
**示例** [查看演示](https://hellouniapp.dcloud.net.cn/pages/component/scroll-view/scroll-view)
......@@ -98,7 +98,7 @@ export default {
},
goTop: function(e) {
this.scrollTop = this.old.scrollTop
this.$nextTick(function() {
this.$nextTick(() => {
this.scrollTop = 0
});
uni.showToast({
......
......@@ -24,7 +24,7 @@
|adjust-position|Boolean|true|键盘弹起时,是否自动上推页面|App-Android(softinputMode 为 adjustResize 时无效)、微信小程序、百度小程序、QQ小程序|
|disable-default-padding|boolean|false|是否去掉 iOS 下的默认内边距|微信小程序2.10.0|
|hold-keyboard|boolean|false|focus时,点击页面的时候不收起键盘|微信小程序2.8.2|
|auto-blur|boolean|false|键盘收起时,是否自动失去焦点|App 3.0.0+|
|auto-blur|boolean|false|键盘收起时,是否自动失去焦点|App-vue 3.0.0+ ,App-nvue不支持|
|@focus|EventHandle||输入框聚焦时触发,event.detail = { value, height },height 为键盘高度|仅微信小程序、App(HBuilderX 2.0+ [nvue uni-app模式](http://ask.dcloud.net.cn/article/36074)) 、QQ小程序支持 height|
|@blur|EventHandle||输入框失去焦点时触发,event.detail = {value, cursor}||
|@linechange|EventHandle||输入框行数变化时调用,event.detail = {height: 0, heightRpx: 0, lineCount: 0}|字节跳动小程序不支持,nvue ios暂不支持|
......
......@@ -113,7 +113,7 @@ vue页面在App端的渲染引擎默认是系统webview(不是手机自带浏
- uni的api在编译到web平台运行时,其实也会转为浏览器的js api。
- App端若要使用操作window、document的库,需要通过renderjs来实现。
- uni的api是多端可用的。在条件编译区,每个平台的专有api也可以使用,比如wx.、plus.等api可以分别在微信下和app下使用。
- 出于降低小程序向uni-app迁移成本的考虑,wx的api在app里也可以直接运行,比如写wx.requst和uni.requst是一样的,但仍然建议仅在微信的条件编译区使用wx的api。
- 出于降低小程序向uni-app迁移成本的考虑,wx的api在app里也可以直接运行,比如写wx.request和uni.request是一样的,但仍然建议仅在微信的条件编译区使用wx的api。
2. Tag注意
- uni-app的tag同小程序的tag,和HTML的tag不一样,比如div要改成view,span要改成text、a要改成navigator。
- 出于降低h5应用向uni-app迁移成本的考虑,写成div、span也可以运行在app和小程序上,因为uni-app编译器会把这些HTML标签编译为小程序标签。但仍然建议养成新习惯。
......
......@@ -10,7 +10,7 @@ uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-
在 C 语言中,通过 #ifdef、#ifndef 的方式,为 windows、mac 等不同 os 编译不同的代码。
``uni-app`` 参考这个思路,为 ``uni-app`` 提供了条件编译手段,在一个工程里优雅的完成了平台个性化实现。
## 条件编译
## 条件编译@preprocessor
条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。
......@@ -24,8 +24,9 @@ uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-
<b style="color:#268BD2"> %PLATFORM%</b> **可取值如下:**
|值|平台|
|值|生效条件|
|:-|:-|
|VUE3|HBuilderX 3.2.0+ [详情](https://ask.dcloud.net.cn/article/37834)|
|APP-PLUS|App|
|APP-PLUS-NVUE或APP-NVUE|App nvue|
|H5|H5|
......@@ -53,6 +54,7 @@ uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-
* 条件编译是利用注释实现的,在不同语法里注释写法不一样,js使用 ``// 注释``、css 使用 ``/* 注释 */``、vue/nvue 模板里使用 ``<!-- 注释 -->``
* 条件编译APP-PLUS包含APP-NVUE和APP-VUE,APP-PLUS-NVUE和APP-NVUE没什么区别,为了简写后面出了APP-NVUE ;
* 使用条件编译请保证`编译前``编译后`文件的正确性,比如json文件中不能有多余的逗号;
* `VUE3` 需要在项目的 `manifest.json` 文件根节点配置 `"vueVersion" : "3"`
### API 的条件编译
......
#### 3.2.0.20210801-alpha
* 【uni-app】
+ App平台、H5平台 新增 input 组件 type 支持 tel 类型
+ App平台、H5平台 新增 input 组件支持 text-content-type 属性
+ App平台、H5平台 修复 3.1.22 版本引出的 scroll-view 组件下拉刷新失效的Bug
+ App-iOS平台 修复 压缩后的视频无法通过 plus.io 接口操作的Bug
+ App-iOS平台 修复 3.1.22 版本引出的 softinputMode 配置为 adjustResize 无效的Bug
+ App-iOS平台 修复 nvue map 组件 marker 设置 label 的 bgColor 为透明值无效的Bug [详情](https://ask.dcloud.net.cn/question/126459)
+ H5平台 优化 导航栏搜索框增加清除按钮
+ 支付宝小程序平台 修复 部分内置组件事件当做自定义事件处理的Bug
+ 【重要】 uniad广告的ad组件 支持h5平台 [详情](https://uniapp.dcloud.net.cn/component/ad)
+ 【重要】 uni ui 支持 vue3 [详情](https://ext.dcloud.net.cn/plugin?id=55)
+ HBuilder官方预置项目全面支持 vue3,包括hello uni-app、hello uniCloud、uniCloud admin、uni-starter等
+ 新增 VUE3 条件编译,方便一套代码同时兼容vue2和vue3 [详情](https://uniapp.dcloud.net.cn/platform?id=preprocessor)
+ uni-ui uni-collapse 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug
+ uni-ui uni-collapse 优化 组件示例
+ uni-ui uni-collapse 新增 组件折叠动画
+ uni-ui uni-collapse 新增 value\v-model 属性 ,动态修改面板折叠状态
+ uni-ui uni-collapse 新增 title 插槽 ,可定义面板标题
+ uni-ui uni-collapse 新增 border 属性 ,显示隐藏面板内容分隔线
+ uni-ui uni-collapse 新增 title-border 属性 ,显示隐藏面板标题分隔线
+ uni-ui uni-collapse 修复 resize 方法失效的Bug
+ uni-ui uni-collapse 修复 change 事件返回参数不正确的Bug
+ uni-ui uni-collapse 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法
+ uni-ui uni-data-checkbox 优化 在uni-forms组件,与label不对齐的问题
+ uni-ui uni-data-checkbox 修复 单选默认值为0不能选中的Bug
+ uni-ui uni-easyinput 优化 errorMessage 属性支持 Boolean 类型
+ uni-ui uni-file-picker 修复 return-type为object下,返回值不正确的Bug
+ uni-ui uni-file-picker 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题
+ uni-ui uni-file-picker 优化 h5平台下上传文件导致页面卡死的问题
+ uni-ui uni-forms 修复 vue2 下条件编译导致destroyed生命周期失效的Bug
+ uni-ui uni-forms 修复 1.2.1 引起的示例在小程序平台报错的Bug
+ uni-ui uni-forms 修复 动态校验表单,默认值为空的情况下校验失效的Bug
+ uni-ui uni-forms 修复 不指定name属性时,运行报错的Bug
+ uni-ui uni-forms 优化 label默认宽度从65调整至70,使required为true且四字时不换行
+ uni-ui uni-forms 优化 组件示例,新增动态校验示例代码
+ uni-ui uni-forms 优化 组件文档,使用方式更清晰
+ uni-ui uni-list 修复 与其他组件嵌套使用时,点击失效的Bug
+ uni-ui uni-swipe-action 修复 跨页面修改组件数据 ,导致不能滑动的问题
+ hello-uniapp 新增 同时适配 vue2 和 vue3(HBuilder X 3.2.0+ 支持 vue3)
+ uniCloud admin 新增 同时适配 vue2 和 vue3(HBuilder X 3.2.0+ 支持 vue3)
+ uniCloud admin 新增 应用管理功能,管理用户可登录的应用,如某账户只能登录管理端、不能登录用户端(uni-id@3.3.1+ 支持)
+ uniCloud admin 新增 升级系统管理 list 页的表格功能,支持数据排序、筛选、搜索等功能
+ uniCloud admin 修复 刷新页面时,左侧菜单丢失高亮状态的 bug
+ uniCloud admin 修复 修改密码失败的 bug
+ 新增 插件市场 支持前端文件加密 限付费的云端一体项目类型的前端文件 [详情](https://ask.dcloud.net.cn/article/35408)
* 【uniCloud】
+ 云数据库 新增 updateAndReturn 方法,可以更新并返回更新后的值(仅可在云函数中使用) [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=update-and-return)
+ uniCloud本地调试插件 修复 部分情况下项目启动时报 npm 安装失败的Bug
+ uni-id 新增 多系统(如管理端、用户端)的配置隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-config)
+ uni-id 新增 多系统用户管理,如某账户只能登录管理端,不能登录用户端 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-user)
* 此版本升级需要开发者处理历史用户数据,请参考 [补齐用户dcloud_appid字段](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=makeup-dcloud-appid)
+ uni-id 新增 QQ登录、注册相关功能 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=qq)
+ uni-id 调整 不再支持绑定手机、邮箱时不填验证码直接绑定
* 【App插件(含5+App和uni-app的App端)】
+ 新增 一键登录 服务协议项样式支持设置复选框图标 [详情](https://uniapp.dcloud.io/univerify)
+ 优化 新浪微博 登录、分享 模块配置,去掉appsecret参数
+ 修复 一键登录 应用横屏显示时打开一键登录页面UI显示异常的Bug [详情](https://ask.dcloud.net.cn/question/126597)
+ Android平台 更新 uni-AD 今日头条穿山甲广告SDK为3.8.0.6版;腾讯优量汇广告SDK为4.380.1250版;快手广告联盟SDK为3.3.12版,快手内容联盟SDK为3.3.20版
+ Android平台 更新 腾讯X5内核版本为 4.3.0.176_44076,解决在部分设备无法加载使用X5内核的问题
+ Android平台 更新 UniPush 使用的个推SDK版本为3.2.2.0,个推核心组件SDK版本为3.1.2.0
+ Android平台 修复 3.1.22 版本引出的 template 原生隐私政策提示框内容过多时显示不正常的Bug [详情](https://ask.dcloud.net.cn/question/127582)
+ Android平台 修复 3.1.19 版本引出的 UniPush 云端打包设置 GooglePlay(AAB) 渠道,getClientInfo 无法获取推送标识信息的Bug [详情](https://ask.dcloud.net.cn/question/127434)
+ Android平台 修复 页面中 input 标签 type 为 file 时,应用没有读写手机存储权限不会主动申请导致无法正常使用的Bug
+ Android平台 修复 VideoPlayer 播放带方向信息的视频源,暂停时显示方向不正确的Bug [详情](https://ask.dcloud.net.cn/question/125783)
+ Android平台 修复 VideoPlayer 播放部分视频源,暂停时可能显示黑边的Bug [详情](https://github.com/dcloudio/uni-app/issues/2779)
+ Android平台 修复 LivePusher 推流设置的本地缓冲池过大导致延迟时间过长的Bug
+ iOS平台 更新 QQ 登录、分享SDK版本为V3.5.3;新浪微博 登录、分享SDK版本为3.3.1;微信 登录、分享、支付SDK版本为1.9.1
+ iOS平台 更新 UniPush 使用的个推SDK为2.5.10.0无IDFA版
+ iOS平台 修复 一键登录 设置服务协议复选框默认不勾选时授权按钮背景颜色显示不正确的Bug
+ iOS平台 修复 Downloader 下载文件返回的请求头 Content-Range 数据为空时引起应用崩溃的Bug
+ iOS平台 修复 百度语音识别在用户拒绝录音权限时没有返回错误回调的Bug
+ iOS平台 修复 在 iOS14 设备使用 5G 网络可能引起崩溃的Bug
#### 3.1.22.20210707-alpha
* 【uni-app】
+ 【重要】调整 App平台、H5平台 input 组件 number 类型在 iOS 平台改用仅数字键盘(九宫格),如需输入负数和小数请改用 digit 类型
+ App平台、H5平台 修复 image 组件使用 transform 样式后,大小计算错误的Bug [详情](https://ask.dcloud.net.cn/question/125987)
+ App平台、H5平台 修复 scroll-view 下拉刷新错误触发的Bug [详情](https://ask.dcloud.net.cn/question/124430)
+ App平台、H5平台 优化 input 组件移除 verifyNumber 属性,改由框架自动处理
+ App-Android平台 修复 nvue 页面 swiper 组件嵌套 list 组件时 source 信息错误的Bug [详情](https://ask.dcloud.net.cn/question/121039)
+ App-iOS平台 修复 iOS14.6 键盘弹出卡顿的Bug [详情](https://ask.dcloud.net.cn/question/125870)
+ H5平台 修复 input 组件设置 confirm-type 为 search 时,无法自动获取焦点的Bug
+ 小程序平台 修复 v-for 嵌套 slot 编译报错的Bug [详情](https://ask.dcloud.net.cn/question/125108)
+ 小程序平台 修复 v-for 中含有复杂表达式时,事件接收的 item 参数错误的Bug
+ 小程序平台 修复 部分数值变更无法更新的Bug [#2696](https://github.com/dcloudio/uni-app/issues/2696)
+ 小程序平台 修复 新版作用域插槽编译模式嵌套自定义组件不显示的Bug [详情](https://ask.dcloud.net.cn/question/126058)
+ 字节小程序平台 修复 新版开发者工具中 uni.request 发送请求失败的Bug
* 【uniCloud】
+ 【重要】云函数支持创建时选择 nodejs 版本 [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=runtime)
+ 新增 内容安全公共模块,包含图片鉴黄、文字内容违规检测,免费且全端可用 [详情](https://ext.dcloud.net.cn/plugin?id=5460)
+ clientDB 新增 multiSend 接口,用于多个clientDB联网请求合并为一次联网 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=multi-send)
+ unicloud-db组件和API 新增 getTemp 接口,用于在 multiSend 内使用 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=multi-send)
+ uni-id 调整 3.1.1版本发布,使用兼容 uniCloud 响应体规范的新错误码格式 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=errcode)
+ uniCloud本地调试插件 修复 部分情况下出现 MaxListenersExceededWarning 警告的Bug
+ uniCloud本地调试插件 修复 项目内存在项目外文件的软链时,修改无法实时生效的Bug
+ JQL数据库管理 修复 部分情况下执行数据库操作无响应的Bug
+ 客户端 修复 nvue 页面无法触发 App.vue 内注册的 db.on('error')、db.on('refreshToken') 等回调的Bug
* 【App插件(含5+App和uni-app的App端)】
+ Android平台 优化 通知栏操作逻辑,解决提交 Google Play 审核可能提示 Implicit PendingIntent Vulnerability 的问题 [详情](https://ask.dcloud.net.cn/question/126207)
+ Android平台 优化 template 原生隐私政策提示框UI样式
+ iOS平台 修复 uni-AD 开屏广告在部分应用中可能引起曝光率较低的Bug
+ iOS平台 修复 在部分情况下 WKWebView 同步共享 cookie 可能引起崩溃的Bug
#### 3.1.21.20210624-alpha
* 【uni-app】
+ App平台 修复 3.1.20 引出的 uni.showToast 接口 icon 固定为 error 类型的Bug [详情](https://ask.dcloud.net.cn/question/125773)
......@@ -13,8 +117,8 @@
+ App-Android平台 修复 uni.previewImage 长按保存图片可能失败的Bug [详情](https://ask.dcloud.net.cn/question/125357)
+ App-iOS平台 修复 调用 uni.hideKeyboard 后点击页面任意位置 input 组件自动聚焦的Bug [详情](https://ask.dcloud.net.cn/question/125233)
+ App-iOS平台 修复 nvue textarea 组件不设置 padding 时 placeholder 显示位置不正常的Bug [详情](https://ask.dcloud.net.cn/question/122376)
+ 百度小程序 修复 部分 class 写法编译后失效的Bug
+ QQ小程序 修复 默认启用 nodeModules 导致作用域插槽编译后运行报错的Bug
+ 百度小程序平台 修复 部分 class 写法编译后失效的Bug
+ QQ小程序平台 修复 默认启用 nodeModules 导致作用域插槽编译后运行报错的Bug
* 【uniCloud】
+ 新增 uniCloud响应体规范,方便前端拦截器统一处理、方便国际化 [详情](https://uniapp.dcloud.net.cn/uniCloud/unicloud-response-format)
+ 客户端 新增 添加拦截器、移除拦截器API [详情](https://uniapp.dcloud.net.cn/uniCloud/client-sdk?id=add-interceptor)
......@@ -35,7 +139,7 @@
#### 3.1.19.20210613-alpha
* 【uni-app】
+ App平台、H5平台 新增 input 组件添加 verifyNumber 属性 [详情](https://uniapp.dcloud.io/component/input)
+ App平台、H5平台 修复 insertImage 多次触发 input 事件的Bug [详情](https://ask.dcloud.net.cn/question/124809)
+ App平台、H5平台 修复 editor 组件 insertImage 多次触发 input 事件的Bug [详情](https://ask.dcloud.net.cn/question/124809)
+ App平台 新增 一键登录自定义按钮添加 provider 属性,用于动态生成 buttons 时区分按钮 [详情](https://uniapp.dcloud.io/univerify?id=用户点击一键登录自定义按钮)
+ App平台 新增 uni.chooseImage 支持 crop 配置 [详情](https://uniapp.dcloud.io/api/media/image?id=chooseimage)
+ App平台 新增 video 组件支持 header 配置 [详情](https://uniapp.dcloud.io/component/video)
......@@ -78,7 +182,7 @@
+ uni-ui uni-forms 新增 validate 事件增加 keepitem 参数,可以选择那些字段不过滤
+ uni-ui uni-forms 优化 submit 事件重命名为 validate
+ uni-ui uni-data-picker 修复 无法加载云端数据的问题
+ uni-ui uni-data-picker 修复 v-model无效问题
+ uni-ui uni-data-picker 修复 v-model 无效问题
+ uni-ui uni-data-picker 修复 loaddata 为空数据组时加载时间过长问题
+ uni-ui uni-datetime-picker 修复 图标在小程序上不显示的 bug
+ uni-ui uni-datetime-picker 优化 重命名引用组件,避免潜在组件命名冲突
......
#### 3.1.22.20210709
* 【uni-app】
+ 【重要】调整 App平台、H5平台 input 组件 number 类型在 iOS 平台改用仅数字键盘(九宫格),如需输入负数和小数请改用 digit 类型
+ App平台、H5平台 修复 editor 组件 insertImage 多次触发 input 事件的Bug [详情](https://ask.dcloud.net.cn/question/124809)
+ App平台、H5平台 修复 image 组件使用 transform 样式后,大小计算错误的Bug [详情](https://ask.dcloud.net.cn/question/125987)
+ App平台、H5平台 修复 scroll-view 下拉刷新错误触发的Bug [详情](https://ask.dcloud.net.cn/question/124430)
+ App平台、H5平台 修复 input 组件同时设置 type=number 和 maxlength 时,部分情况 value 同步错误的Bug
+ App平台、H5平台 修复 textarea 组件设置 min-height 后高度异常的Bug
+ App平台 新增 一键登录自定义按钮添加 provider 属性,用于动态生成 buttons 时区分按钮 [详情](https://uniapp.dcloud.io/univerify?id=用户点击一键登录自定义按钮)
+ App平台 新增 uni.chooseImage 支持 crop 裁剪配置 [详情](https://uniapp.dcloud.io/api/media/image?id=chooseimage)
+ App平台 新增 video 组件支持 header 配置 [详情](https://uniapp.dcloud.io/component/video)
+ App平台 新增 uni.showToast 接口 icon 支持 error 类型
+ App平台 优化 nvue 页面中去除 display:flex 相关警告
+ App平台 优化 uni.chooseLocation 搜索结果按综合排序 [详情](https://ask.dcloud.net.cn/question/125044)
+ App-Android平台 优化 快速频繁操作应用启动/关闭可能出现白屏现象的问题
+ App-Android平台 修复 uni.request 请求 header 中设置自定义 content-type 会添加 charset 的Bug [详情](https://ask.dcloud.net.cn/question/123961)
+ App-Android平台 修复 uni.previewImage 长按保存图片可能失败的Bug [详情](https://ask.dcloud.net.cn/question/125357)
+ App-Android平台 修复 websocket 请求过多可能引起崩溃的Bug
+ App-Android平台 修复 tabBar 列表项不设置 selectedIconPath 在部分手机可能引起`trying to use a recycled bitmap android.graphics.Bitmap`崩溃的Bug
+ App-Android平台 修复 nvue 页面 webview 组件设置 background 属性不生效的Bug [详情](https://ask.dcloud.net.cn/question/117845)
+ App-Android平台 修复 nvue 页面 video 组件暂定播放后可能出现黑边的Bug [详情](https://ask.dcloud.net.cn/question/124152)
+ App-Android平台 修复 nvue 页面 swiper 组件嵌套 list 组件时 source 信息错误的Bug [详情](https://ask.dcloud.net.cn/question/121039)
+ App-iOS平台 修复 调用 uni.hideKeyboard 后点击页面任意位置 input 组件自动聚焦的Bug [详情](https://ask.dcloud.net.cn/question/125233)
+ App-iOS平台 修复 nvue 页面 textarea 组件不设置 padding 时 placeholder 显示位置不正常的Bug [详情](https://ask.dcloud.net.cn/question/122376)
+ App-iOS平台 修复 iOS14.6 键盘弹出卡顿的Bug [详情](https://ask.dcloud.net.cn/question/125870)
+ H5平台 修复 input 组件设置 confirm-type 为 search 时,无法自动获取焦点的Bug
+ 小程序平台 优化 作用域插槽内支持使用作用域外数据 [#495](https://github.com/dcloudio/uni-app/issues/495)
+ 小程序平台 修复 v-for 中含有复杂表达式时,事件接收的 item 参数错误的Bug
+ 小程序平台 修复 部分数值变更无法更新的Bug [#2696](https://github.com/dcloudio/uni-app/issues/2696)
+ 百度小程序平台 修复 基础库 3.290.33 以上页面 mounted 执行两次的Bug [#2642](https://github.com/dcloudio/uni-app/issues/2642)
+ 百度小程序平台 修复 使用 usingComponents 后代码上传报错的Bug [#2652](https://github.com/dcloudio/uni-app/issues/2652)
+ 百度小程序平台 修复 部分 class 写法编译后失效的Bug
+ 支付宝小程序平台 优化 支持 useDynamicPlugins 配置 [详情](https://ask.dcloud.net.cn/article/39114)
+ QQ小程序 修复 默认启用 nodeModules 导致作用域插槽编译后运行报错的Bug
+ 字节小程序平台 修复 基础库 2.0 以上组件关系错乱的Bug [#2651](https://github.com/dcloudio/uni-app/issues/2651)
+ 字节小程序平台 修复 新版开发者工具中 uni.request 发送请求失败的Bug
* 【uniCloud】
+ 【重要】云函数支持创建时选择 nodejs 版本 [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=runtime)
+ 新增 内容安全公共模块,包含图片鉴黄、文字内容违规检测,免费且全端可用 [详情](https://ext.dcloud.net.cn/plugin?id=5460)
+ 新增 uniCloud响应体规范,方便前端拦截器统一处理、方便国际化 [详情](https://uniapp.dcloud.net.cn/uniCloud/unicloud-response-format)
+ clientDB 新增 multiSend 接口,用于多个clientDB联网请求合并为一次联网 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=multi-send)
+ unicloud-db组件和API 新增 getTemp 接口,用于在 multiSend 内使用 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=multi-send)
+ JQL数据库管理 修复 部分情况下执行数据库操作无响应的Bug
+ uni-id 调整 3.1.1版本发布,使用兼容 uniCloud 响应体规范的新错误码格式 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=errcode)
+ uniCloud本地调试插件 修复 部分情况下出现 MaxListenersExceededWarning 警告的Bug
+ uniCloud本地调试插件 修复 项目内存在项目外文件的软链时,修改无法实时生效的Bug
+ 客户端 新增 添加拦截器、移除拦截器API [详情](https://uniapp.dcloud.net.cn/uniCloud/client-sdk?id=add-interceptor)
+ 客户端 修复 HBuilderX 3.1.17 引出的 db.on("error") 回调不执行的Bug
+ 客户端 修复 leftWindow、topWindow 中使用 uniCloud 腾讯云报错的Bug [详情](https://ask.dcloud.net.cn/question/125039)
+ 客户端 修复 nvue 页面无法触发 App.vue 内注册的 db.on('error')、db.on('refreshToken') 等回调的Bug
+ DB Schema 调整 enum 属性最大可枚举500条数据
* 【App插件(含5+App和uni-app的App端)】
+ 新增 拍照和本地相册选择 支持设置 crop 裁剪编辑图片 [规范](https://www.html5plus.org/doc/zh_cn/camera.html#plus.camera.CameraOptions)
+ 新增 视频播放控件 VideoPlayer 播放http/https协议视频资源时支持设置请求的 header [规范](https://www.html5plus.org/doc/zh_cn/video.html#plus.video.VideoPlayerStyles)
+ 新增 登录鉴权服务对象支持 nativeClient 属性标识依赖的客户端App是否已安装 [规范](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.nativeClient)
+ 更新 uni-AD 穿山甲SDK Android为3.7.0.2版;快手广告联盟SDK Android为3.3.10.2版,iOS为3.3.10版;快手内容联盟SDK Android为3.3.18.1版,iOS为3.3.19版;腾讯优量汇SDK iOS为4.12.71版
+ Android平台 更新 LivePusher 直播推流模块基于开源项目[yasea](https://github.com/begeekmyfriend/yasea),支持 srs4.x
+ Android平台 优化 通知栏操作逻辑,解决提交 Google Play 审核可能提示 Implicit PendingIntent Vulnerability 的问题 [详情](https://ask.dcloud.net.cn/question/126207)
+ Android平台 优化 template 原生隐私政策提示框UI样式
+ Android平台 修复 template 原生隐私政策提示框点击同意按钮前可能读取设备标识的Bug
+ Android平台 修复 手机语言设置为阿拉伯文后无法操作页面返回的Bug [详情](https://ask.dcloud.net.cn/question/124914)
+ Android平台 修复 H5页面中 intent:// 协议无法拉起三方App的Bug [详情](https://ask.dcloud.net.cn/question/124597)
+ Android平台 修复 云端打包 提交 Google Play 审核提示包含无法识别的语言的Bug [详情](https://ask.dcloud.net.cn/question/125203)
+ Android平台 修复 getVideoInfo 方法调用无响应的Bug [详情](https://ask.dcloud.net.cn/question/122739)
+ Android平台 修复 3.1.14版本引出的 微博登录取消授权后再次调用无响应的Bug [详情](https://ask.dcloud.net.cn/question/125273)
+ Android平台 修复 targetSdkVersion 设置为 30 在部分 Android 11 设备可能无法正常拉起支付App的Bug
+ Android平台 修复 getFileInfo 在 Android11 设备上可能无法正常获取文件信息的Bug [详情](https://ask.dcloud.net.cn/question/124440)
+ Android平台 修复 storage 数据存储键值 key 中包含特殊字符时可能存取失败的Bug
+ iOS平台 新增 安全区域配置 safearea 支持 backgroundDark 属性设置暗黑模式的背景颜色 [详情](https://ask.dcloud.net.cn/article/36995#safearea)
+ iOS平台 更新 云端打包环境为XCode12.5.1,解决在 iOS15 设备无法安装的Bug
+ iOS平台 更新 视频播放控件 VideoPlayer 使用的 FFmpeg 版本为 ff4.0--ijk0.8.8--20210426--001
+ iOS平台 修复 uni-AD 开屏广告在部分应用中可能引起曝光率较低的Bug
+ iOS平台 修复 uni-AD 应用从后台切换到前台开屏广告可能被其它界面覆盖的Bug
+ iOS平台 修复 uni-AD 显示穿山甲开屏广告时在部分手机上可能`跳过`按钮无法点击的Bug
+ iOS平台 修复 plus.sqlite.isOpenDatabase 不传入参数可能引起卡死或崩溃的Bug [详情](https://ask.dcloud.net.cn/question/114091)
+ iOS平台 修复 Geolocation 定位模块在用户未授权或设备关闭定位功能时返回错误码与规范不一致的Bug
+ iOS平台 修复 在部分情况下 WKWebView 同步共享 cookie 可能引起崩溃的Bug
* 【UniMPSDK】
+ iOS平台 修复 push 方式打开小程序手势返回关闭后偶现无法再次打开小程序页面的Bug
+ iOS平台 修复 动态设置 titleNView 样式后可能导致胶囊菜单按钮弹出的 actionSheet 部分 item 显示空白的Bug
#### 3.1.17.20210608
* 【uniCloud】
+ 【重要】clientDB联表查询策略调整,请参考此文档进行进行排查并调整:[clientDB联表查询策略调整](https://ask.dcloud.net.cn/article/38966)
......
......@@ -9,9 +9,6 @@
2. DCloud与vue合作,在[vue.js官网](https://cn.vuejs.org/v2/guide/)提供了免费视频教程,也可以直达教程地址:[https://learning.dcloud.io](https://learning.dcloud.io)
3. 不需要专门去学习小程序的语法,uni-app使用的是vue的语法,不是小程序自定义的语法。
#### 如果你使用过mpvue
几乎不用学习,uni-app对vue语法的支持是mpvue的超集。这里有篇[mpvue转uni-app指南](http://ask.dcloud.net.cn/article/34945)
#### 如果你熟悉小程序,但不熟悉vue
参考三方总结[https://segmentfault.com/a/1190000015684864](https://segmentfault.com/a/1190000015684864)
......@@ -30,6 +27,7 @@
* [《uni-app 快速入门 从零开始实现新闻资讯类跨端应用》](https://coding.imooc.com/class/433.html),出品人:meHaoTian
* [《uni-app实战直播app全栈开发》](https://study.163.com/course/courseMain.htm?courseId=1210217810&share=2&shareId=480000001892585),出品人:帝莎IT学院
* [《uni-app博客实战开发教程》](https://ke.qq.com/course/3455428?tuin=258d8def),出品人:卢小兵
* [《uni-app快速入门到社区论坛项目多端开发实战》](https://www.bilibili.com/video/BV1oy4y1j75s?p=1),出品人:千锋教育
目前各大视频学习网站都有不少uni-app的学习资源,更多资源请点击搜索链接:
......
## 国内应用市场上架
最近为有效治理App强制授权、过度索权、超范围收集个人信息等现象,落实《网络安全法》《消费者权益保护法》的要求,保障个人信息安全,各大应用市场都加强应用审核的检测,要求应用必须符合相关政策,否则应用将有被通报或下架的风险。
**应用市场上架审核合规指南:**[https://ask.dcloud.net.cn/article/39073](https://ask.dcloud.net.cn/article/39073)
## Google Play上架
首先App提交云端打包时请务必勾选“GooglePlay”渠道:
![](https://dcloud-img.oss-cn-hangzhou.aliyuncs.com/uni-app/doc/channel-google.png)
Google Play上架审核要求比较严格,需要注意以下问题:
- 应用中不能存在下载/安装apk的行为,不要勾选android.permission.INSTALL_PACKAGES、android.permission.REQUEST_INSTALL_PACKAGES权限‘
- 应用中的任何功能都不能引导用户下载其它应用,以下模块不能使用:
+ QQ登录、QQ分享:手机没有安装QQ应用时,会引导用户安装
+ uni-AD 增强广告SDK:广告中存在下载安装其它三方应用的行为。**uni-AD 广告基础功能不受影响**
- 应用中不能使用动态加载代码,因此无法配置使用X5内核,详情:[https://ask.dcloud.net.cn/article/36806](https://ask.dcloud.net.cn/article/36806)
**应用必须适配Android11,设置targetSdkVersion大于等于30:**[https://ask.dcloud.net.cn/article/193](https://ask.dcloud.net.cn/article/193#targetsdkversion)
**上传安装包使用Android App Bundle(AAB)格式:**[https://ask.dcloud.net.cn/article/39052](https://ask.dcloud.net.cn/article/39052)
## App Store上架
>再次说明:uni-app并不是简单的使用Webview套壳,Webview仅负责vue页面的UI渲染,nvue页面则完全由原生UI渲染,业务逻辑代码是运行在独立的JS引擎(JSCore)中,并且封装了很多JS API调用原生能力(OC代码实现),完全可以上架苹果应用市场。
苹果App Store上架审核规范比较细,提交审核前建议仔细阅读苹果官方[App Store审核指南](https://developer.apple.com/cn/app-store/review/guidelines/)
需要注意以下问题:
- 应用功能不能过于简单
- 应用功能不能跟已经上架的应用相似,就是不能做马甲包
**使用广告标识(IDFA)相关说明:**[https://ask.dcloud.net.cn/article/36107](https://ask.dcloud.net.cn/article/36107)
**UIWebview API 已废弃:**[https://ask.dcloud.net.cn/article/36348](https://ask.dcloud.net.cn/article/36348)
# uniCloud admin 框架
### **重要公告**:
> admin 1.5.0 以上版本在 HBuilderX alpha 3.1.19 以下版本中,使用「腾讯云服务空间」时 leftWindow 存在 `uni is not undefined` 的问题,该 bug 在 HBuilderX alpha 3.1.20 已修复,[下载HBuilderX alpha 3.1.20](https://dcloud.io/hbuilderx.html)
### 什么是 uniCloud admin
uniCloud admin 框架,是基于 uni-app 和 uniCloud 的应用后台管理的开源框架。
......@@ -25,15 +22,20 @@ uniCloud admin有预置功能、插件生态和数据表管理的代码生成工
有这套组合,管理端系统的开发变的前所未有的简单、高效、低成本。
1. 预置功能
- 管理员账户初始化、登录、修改密码
- 基于uni-id的用户管理(注册、修改信息、停用启用、删除)、角色管理、权限管理
- 顶部 topWindow 的设置:比如 logo 更换、右上角部分链接更换。详见项目根目录的`admin.config.js`文件
- 左侧 leftWindow 的菜单设置:菜单包括两类,一类是动态菜单,具备业务和权限功能;另一类是静态菜单,不会根据登录用户角色变化
- 动态菜单的数据存储在数据库表opendb-admin-menus中,基于uni-id角色权限,在菜单管理中可以对菜单进行增删改查
- 开发模式下的 debug 功能,帮助开发者及时发现报错和搜索错误信息,可在`admin.config.js`文件中配置
2. 扩展插件
- uniCloud admin支持插件生态,包括cms插件、banner管理插件、日志管理插件、图表示例等,详见[插件市场](https://ext.dcloud.net.cn/?cat1=7&cat2=74&orderBy=UpdatedDate)
3. 数据表管理的代码生成工具
- 对于数据表的管理,如列表浏览、分页搜索、详情修改、新增删除,这些代码都无需自己开发。建好数据表的schema表结构,利用schema2code工具,即可自动生成该表的管理页面的代码。详见[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)
uniCloud admin是完整开源的一个uni-app项目,任何熟悉uni-app的工程师都可以自行开发扩展功能。
......
......@@ -25,7 +25,9 @@ cloudfunctions
4. 在要引入公用模块的云函数目录(本例中为`use-common`)执行`npm init -y`生成`package.json`文件
5.`use-common`目录执行`npm install ../common/hello-common`引入`hello-common`模块
`HBuilderX 3.0.0`以上版本上述步骤4、5可以在云函数上右键选择`管理公共模块依赖`来实现
**在`HBuilderX 3.0.0`以上版本上述步骤4、5可以在云函数上右键选择`管理公共模块依赖`来实现,如下图**
![管理公共模块依赖](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/fc2da708-304e-4c92-9a0a-dc48fa5e73ed.png)
公共模块依赖其他公共模块同理
......
......@@ -10,7 +10,7 @@ const db = uniCloud.database();
const collection = db.collection('user');
```
### 集合 Collection
### 集合 Collection@collection
通过 `db.collection(name)` 可以获取指定集合的引用,在集合上可以进行以下操作
......@@ -30,7 +30,7 @@ const collection = db.collection('user');
查询及更新指令用于在 `where` 中指定字段需满足的条件,指令可通过 `db.command` 对象取得。
### 记录 Record / Document
### 记录 Record / Document@doc
通过 `db.collection(collectionName).doc(docId)` 可以获取指定集合上指定 _id 的记录的引用,在记录上可以进行以下操作
......@@ -45,7 +45,7 @@ doc(docId)方法的参数只能是字符串,即数据库默认的_id字段。
如需要匹配多个`_id`的记录,应使用where方法。可以在where方法里用in指令匹配一个包含`_id`的数组。
### 查询筛选指令 Query Command
### 查询筛选指令 Query Command@query-command
以下指令挂载在 `db.command`
......@@ -64,7 +64,7 @@ doc(docId)方法的参数只能是字符串,即数据库默认的_id字段。
如果你熟悉SQL,可查询[mongodb与sql语句对照表](https://blog.csdn.net/xinghebuluo/article/details/7012788/)进行学习。
### 字段更新指令 Update Command
### 字段更新指令 Update Command@update-command
以下指令挂载在 `db.command`
......@@ -80,7 +80,7 @@ doc(docId)方法的参数只能是字符串,即数据库默认的_id字段。
| | unshift | 数组类型字段追加头元素,支持数组 |
## 支持的数据类型
## 支持的数据类型@data-type
数据库提供以下几种数据类型:
* String:字符串
......@@ -101,7 +101,8 @@ doc(docId)方法的参数只能是字符串,即数据库默认的_id字段。
### 时间 Date
Date 类型用于表示时间,精确到毫秒,可以用 JavaScript 内置 Date 对象创建。需要特别注意的是,用此方法创建的时间是客户端时间,不是服务端时间。如果需要使用服务端时间,应该用 API 中提供的 serverDate 对象来创建一个服务端当前时间的标记,当使用了 serverDate 对象的请求抵达服务端处理时,该字段会被转换成服务端当前的时间,更棒的是,我们在构造 serverDate 对象时还可通过传入一个有 offset 字段的对象来标记一个与当前服务端时间偏移 offset 毫秒的时间,这样我们就可以达到比如如下效果:指定一个字段为服务端时间往后一个小时。
Date 类型用于表示时间,精确到毫秒,可以用 JavaScript 内置 Date 对象创建。需要特别注意的是,连接本地云函数时,用此方法创建的时间是客户端当前时间,不是服务端当前时间,只有连接云端云函数才是服务端当前时间。
另外,我们还单独提供了一个 API 来创建服务端当前时间,使用 serverDate 对象来创建一个服务端当前时间的标记,**该对象暂时只支持腾讯云空间**,当使用了 serverDate 对象的请求抵达服务端处理时,该字段会被转换成服务端当前的时间,更棒的是,我们在构造 serverDate 对象时还可通过传入一个有 offset 字段的对象来标记一个与当前服务端时间偏移 offset 毫秒的时间,这样我们就可以达到比如如下效果:指定一个字段为服务端时间往后一个小时。
```js
// 服务端当前时间
......@@ -161,7 +162,6 @@ exports.main = async (event, context) => {
| 参数 | 类型 | 说明 |
| ---- | ------| ---------------------------------------- |
| inserted| Number| 插入成功条数 |
|ids | Array |批量插入所有记录的id |
示例:
......@@ -210,12 +210,12 @@ let res = await collection.doc('doc-id').set({
name: "Hey"
});
```
**注意**
**注意**
- 自动生成的_id是自增的,后创建的记录的_id总是大于先生成的_id
## 查询文档
## 查询文档@query
支持 `where()``limit()``skip()``orderBy()``get()``field()``count()` 等操作。
......@@ -235,7 +235,7 @@ limit,即返回记录的最大数量,默认值为100,也就是不设置lim
| ----| ------| ---------------------------------------- |
|data | Array | 查询结果数组 |
### 添加查询条件
### 添加查询条件@where
collection.where()
......@@ -333,7 +333,7 @@ res = {
}
```
### 获取查询数量
### 获取查询数量@count
collection.count()
......@@ -376,7 +376,7 @@ let res = await collection.limit(1).get() // 只返回第一条记录
- limit不设置的情况下默认返回100条数据;设置limit有最大值,腾讯云限制为最大1000条,阿里云限制为最大500条。
### 设置起始位置
### 设置起始位置@skip
collection.skip(value)
......@@ -394,7 +394,7 @@ let res = await collection.skip(4).get()
**注意:数据量很大的情况下,skip性能会很差,尽量使用其他方式替代,参考:[skip性能优化](uniCloud/db-performance.md?id=skip)**
### 对结果排序
### 对结果排序@order-by
collection.orderBy(field, orderType)
......@@ -420,7 +420,7 @@ let res = await collection.orderBy("name", "asc").get()
- 排序字段存在多个重复的值时排序后的分页结果,可能会出现某条记录在上一页出现又在下一页出现的情况。这时候可以通过指定额外的排序条件比如`.orderBy("name", "asc").orderBy("_id", "asc")`来规避这种情况。
### 指定返回字段
### 指定返回字段@field
collection.field()
......@@ -443,7 +443,7 @@ collection.field({ 'age': true }) //只返回age字段、_id字段,其他字
- field内指定是否返回某字段时,不可混用true/false。即{'a': true, 'b': false}是一种错误的参数格式
- 只有使用{ '_id': false }明确指定不要返回_id时才会不返回_id字段,否则_id字段一定会返回。
### 查询指令
### 查询指令@dbcmd
查询指令以dbCmd.开头,包括等于、不等于、大于、大于等于、小于、小于等于、in、nin、and、or。
......@@ -1020,7 +1020,7 @@ const res = await db.collection('class').where({
}
```
## 删除文档
## 删除文档@remove
**方式1 通过指定文档ID删除**
......@@ -1074,9 +1074,9 @@ db.collection("table1").doc("5f79fdb337d16d0001899566").remove()
})
```
## 更新文档
## 更新文档@update
### 更新指定文档
### 更新指定文档@doc-update
collection.doc().update(Object data)
......@@ -1149,7 +1149,7 @@ let res = await collection.doc('doc-id').update({
}
```
### 更新文档,如果不存在则创建
### 更新文档,如果不存在则创建@doc-set
collection.doc().set()
......@@ -1187,8 +1187,9 @@ let res = await collection.doc('doc-id').set({
}
```
### 批量更新文档
collection.update()
### 批量更新文档@where-update
`collection.update()`
```js
const dbCmd = db.command
......@@ -1197,7 +1198,52 @@ let res = await collection.where({name: dbCmd.eq('hey')}).update({
})
```
### 更新数组内指定下标的元素
### 更新并返回更新后的数据@update-and-return
> 新增于HBuilderX 3.2.0-alpha
此接口仅会操作一条数据,有多条数据匹配的情况下会只更新匹配的第一条并返回
**示例**
```js
const db = uniCloud.database()
await db.collection('test').where({
uid: '1'
}).updateAndReturn({
score: db.command.inc(2)
})
// 更新前
{
_id: 'xx',
uid: '1',
score: 0
}
// 更新后
{
_id: 'xx',
uid: '1',
score: 2
}
// 接口返回值
{
updated: 1,
doc: {
_id: 'xx',
uid: '1',
score: 2
}
}
```
**注意**
- 使用updateAndReturn时,不可使用field方法
- 可以在事务中使用,可以使用`transaction.where().updateAndReturn()`以及`transaction.doc().updateAndReturn()`
### 更新数组内指定下标的元素@update-arr-with-index
```js
const res = await db.collection('query').doc('1').update({
......@@ -1236,7 +1282,7 @@ const res = await db.collection('query').doc('1').update({
}
```
### 更新数组内匹配条件的元素
### 更新数组内匹配条件的元素@update-arr-matched
**注意:只可确定数组内只会被匹配到一个的时候使用**
......@@ -1282,11 +1328,11 @@ const res = await db.collection('query').where({
}
```
### 更新操作符
### 更新操作符@update-operator
更多数据库操作符请查看[数据库操作符](#dbcmd)
#### set
#### set@operator-set
更新指令。用于设定字段等于指定值。这种方法相比传入纯 JS 对象的好处是能够指定字段等于一个对象:
......@@ -1322,7 +1368,7 @@ let res = await db.collection('photo').doc('doc-id').update({
}
```
#### inc
#### inc@operator-inc
更新指令。用于指示字段自增某个值,这是个原子操作,使用这个操作指令而不是先读数据、再加、再写回的好处是:
......@@ -1381,7 +1427,7 @@ let res = await db.collection('user').where({
})
```
#### mul
#### mul@operator-mul
更新指令。用于指示字段自乘某个值。
......@@ -1435,7 +1481,7 @@ let res = await db.collection('user').where({
})
```
#### remove
#### remove@operator-remove
更新指令。用于表示删除某个字段。如某人删除了自己一条商品评价中的评分:
......@@ -1461,7 +1507,7 @@ let res = await db.collection('comments').doc('comment-id').update({
}
```
#### push
#### push@operator-push
向数组尾部追加元素,支持传入单个元素或数组
```js
......@@ -1487,7 +1533,7 @@ let res = await db.collection('comments').doc('comment-id').update({
}
```
#### pop
#### pop@operator-pop
删除数组尾部元素
```js
......@@ -1512,7 +1558,8 @@ let res = await db.collection('comments').doc('comment-id').update({
}
```
#### unshift
#### unshift@operator-unshift
向数组头部添加元素,支持传入单个元素或数组。使用同push
```js
......@@ -1538,7 +1585,8 @@ let res = await db.collection('comments').doc('comment-id').update({
}
```
#### shift
#### shift@operator-shift
删除数组头部元素。使用同pop
```js
......@@ -1563,13 +1611,13 @@ let res = await db.collection('comments').doc('comment-id').update({
}
```
## GEO地理位置
## GEO地理位置@geo
注意:**如果需要对类型为地理位置的字段进行搜索,一定要建立地理位置索引**
### GEO数据类型
### GEO数据类型@geo-data-type
#### Point
#### Point@geo-point
用于表示地理位置点,用经纬度唯一标记一个点,这是一个特殊的数据存储类型。
......@@ -1580,7 +1628,7 @@ let res = await db.collection('comments').doc('comment-id').update({
new db.Geo.Point(longitude, latitude)
```
#### LineString
#### LineString@geo-line-string
用于表示地理路径,是由两个或者更多的 `Point` 组成的线段。
......@@ -1596,7 +1644,7 @@ new db.Geo.LineString([
])
```
#### Polygon
#### Polygon@geo-polygon
用于表示地理上的一个多边形(有洞或无洞均可),它是由一个或多个**闭环** `LineString` 组成的几何图形。
......@@ -1614,7 +1662,7 @@ new db.Geo.Polygon([
])
```
#### MultiPoint
#### MultiPoint@geo-multi-point
用于表示多个点 `Point` 的集合。
......@@ -1630,7 +1678,7 @@ new db.Geo.MultiPoint([
])
```
#### MultiLineString
#### MultiLineString@geo-multi-line-string
用于表示多个地理路径 `LineString` 的集合。
......@@ -1647,7 +1695,7 @@ new db.Geo.MultiLineString([
```
#### MultiPolygon
#### MultiPolygon@geo-multi-polygon
用于表示多个地理多边形 `Polygon` 的集合。
......@@ -1663,9 +1711,9 @@ new db.Geo.MultiPolygon([
])
```
### GEO操作符
### GEO操作符@geo-operator
#### geoNear
#### geoNear@operator-geo-near
按从近到远的顺序,找出字段值在给定点的附近的记录。
......@@ -1693,7 +1741,7 @@ let res = await db.collection('user').where({
}).get()
```
#### geoWithin
#### geoWithin@operator-geo-within
找出字段值在指定 Polygon / MultiPolygon 内的记录,无排序
......@@ -1728,7 +1776,7 @@ let res = await db.collection('user').where({
}).get()
```
#### geoIntersects
#### geoIntersects@operator-geo-intersects
找出字段值和给定的地理位置图形相交的记录
......@@ -1759,13 +1807,13 @@ let res = await db.collection('user').where({
}).get()
```
## 事务
## 事务@transaction
事务通常用来在某个数据库操作失败之后进行回滚。
> 事务因为要锁行,是有时间限制的。从事务开始到事务提交/回滚,时间不可超过10s。
> 事务因为要锁行,是有时间限制的。从事务开始到事务提交/回滚,时间不可超过10s。另外注意:如果多条事务同时处理同一行数据,可能存在写冲突,进而导致失败。
### runTransaction
### runTransaction@run-transaction
**阿里云不支持此用法,请换成startTransaction以使用事务**
......@@ -1866,7 +1914,7 @@ exports.main = async (event) => {
}
```
### startTransaction
### startTransaction@start-transaction
发起事务。与`runTransaction`作用类似,接收参数类型不同
......@@ -2056,7 +2104,7 @@ let res = await db.collection('scores').aggregate()
参考[聚合操作符](#aggregate-operator)
### addFields
### addFields@aggregate-add-fields
聚合阶段。添加新字段到输出的记录。经过 `addFields` 聚合阶段,输出的所有记录中除了输入时带有的字段外,还将带有 `addFields` 指定的字段。
......@@ -2181,7 +2229,7 @@ let res = await db.collection('vehicles').aggregate()
specs: { fuel_type: "unleaded" } }
```
### bucket
### bucket@aggregate-bucket
聚合阶段。将输入记录根据给定的条件和边界划分成不同的组,每组即一个 `bucket`
......@@ -2297,7 +2345,7 @@ let res = await db.collection('items').aggregate()
]
```
### bucketAuto
### bucketAuto@aggregate-bucket-auto
聚合阶段。将输入记录根据给定的条件划分成不同的组,每组即一个 `bucket`。与 `bucket` 的其中一个不同之处在于无需指定 `boundaries``bucketAuto` 会自动尝试将记录尽可能平均的分散到每组中。
......@@ -2420,7 +2468,7 @@ let res = await db.collection('items').aggregate()
}
```
### count
### count@aggregate-count
聚合阶段。计算上一聚合阶段输入到本阶段的记录数,输出一个记录,其中指定字段的值为记录数。
......@@ -2489,7 +2537,7 @@ let res = await db.collection('items').aggregate()
}
```
### geoNear
### geoNear@aggregate-geo-near
聚合阶段。将记录按照离给定点从近到远输出。
......@@ -2643,7 +2691,7 @@ let res = await db.collection('attractions').aggregate()
}
```
### group
### group@aggregate-group
聚合阶段。将输入记录按给定表达式分组,输出时每个记录代表一个分组,每个记录的 _id 是区分不同组的 key。输出记录中也可以包括累计值,将输出字段设为累计值即会从该分组中计算累计值。
......@@ -2804,7 +2852,7 @@ let res = await db.collection('avatar').aggregate()
}
```
### limit
### limit@aggregate-limit
聚合阶段。限制输出到下一阶段的记录数。
......@@ -2858,7 +2906,7 @@ let res = await db.collection('items').aggregate()
}
```
### lookup
### lookup@aggregate-lookup
聚合阶段。联表查询。与同个数据库下的一个指定的集合做 left outer join(左外连接)。对该阶段的每一个输入记录,lookup 会在该记录中增加一个数组字段,该数组是被联表中满足匹配条件的记录列表。lookup 会将连接后的结果输出给下个阶段。
......@@ -3351,7 +3399,7 @@ let res = await db.collection('orders').aggregate()
]
```
### match
### match@aggregate-match
聚合阶段。根据条件过滤文档,并且把符合条件的文档传递给下一个流水线阶段。
......@@ -3431,7 +3479,7 @@ let res = await db.collection('articles')
{ "_id" : null, "count" : 3 }
```
### project
### project@aggregate-project
聚合阶段。把指定的字段传递给下一个流水线,指定的字段可以是某个已经存在的字段,也可以是计算出来的新字段。
......@@ -3605,7 +3653,7 @@ let res = await db.collection('points')
{ "_id": 3, "coordinate": [3, 3] }
```
### replaceRoot
### replaceRoot@aggregate-replace-root
聚合阶段。指定一个已有字段作为输出的根节点,也可以指定一个计算出的新字段作为根节点。
......@@ -3686,7 +3734,7 @@ let res = await db.collection('roles')
{ "full_name": "张牧之" }
```
### sample
### sample@aggregate-sample
聚合阶段。随机从文档中选取指定数量的记录。
......@@ -3726,7 +3774,7 @@ let res = await db.collection('users')
{ "_id": "696529e4-7e82-4e7f-812e-5144714edff6", "name": "b" }
```
### skip
### skip@aggregate-skip
聚合阶段。指定一个正整数,跳过对应数量的文档,输出剩下的文档。
......@@ -3740,7 +3788,7 @@ let res = await db.collection('users')
这段代码会跳过查找到的前 5 个文档,并且把剩余的文档输出。
### sort
### sort@aggregate-sort
聚合阶段。根据指定的字段,对输入的文档进行排序。
......@@ -3791,7 +3839,7 @@ let res = await db.collection('articles')
{ "_id": "2", "author": "bob", "score": 60, "age": 18 }
```
### sortByCount
### sortByCount@aggregate-sort-by-count
聚合阶段。根据传入的表达式,将传入的集合进行分组(group)。然后计算不同组的数量,并且将这些组按照它们的数量进行排序,返回排序后的结果。
......@@ -3853,7 +3901,7 @@ let res = await db.collection('passages')
{ "_id": "Python", "count": 1 }
```
### unwind
### unwind@aggregate-unwind
聚合阶段。使用指定的数组字段中的每个元素,对文档进行拆分。拆分后,文档会从一个变为一个或多个,分别对应数组的每个元素。
......@@ -3966,7 +4014,7 @@ let res = await db.collection('products')
{ "_id": "5", "product": "sweater", "size": "L" }
```
### end
### end@aggregate-end
标志聚合操作定义完成,发起实际聚合操作
......@@ -3993,7 +4041,7 @@ let res = await db.collection('books').aggregate()
## 数据库操作符@dbcmd
### 查询·逻辑操作符
### 查询·逻辑操作符@dbcmd-query
#### and
......@@ -4242,7 +4290,7 @@ function nor(expressions: Expression[]): Command
function nor(...expressions: Expression[]): Command
```
### 查询·比较操作符
### 查询·比较操作符@dbcmd-compare
#### eq
......@@ -4400,7 +4448,7 @@ let res = await db.collection('todos').where({
.get()
```
### 查询·字段操作符
### 查询·字段操作符@dbcmd-field
#### exists
......@@ -4436,7 +4484,7 @@ let res = await db.collection('todos').where({
.get()
```
### 查询·数组操作符
### 查询·数组操作符@dbcmd-array
#### all
......@@ -4577,7 +4625,7 @@ let res = await db.collection('todos').where({
.get()
```
### 查询·地理位置操作符
### 查询·地理位置操作符@dbcmd-geo
#### geoNear
......@@ -4679,7 +4727,7 @@ let res = await db.collection('restaurants').where({
}).get()
```
### 查询·表达式操作符
### 查询·表达式操作符@dbcmd-expr
#### expr
......@@ -4738,7 +4786,7 @@ let res = await db.collection('items').where(dbCmd.expr(
).get()
```
### 更新·字段操作符
### 更新·字段操作符@dbcmd-update-field
#### set
......@@ -4890,7 +4938,7 @@ let res = await db.collection('todos').doc('doc-id').update({
})
```
### 更新·数组操作符
### 更新·数组操作符@dbcmd-update-array
#### push
......
......@@ -60,7 +60,7 @@ exports.main = async (event, context) => {
|API |描述 |
|-- |-- |
|uniCloud.callFunction() |云函数中调用另一个云函数 [见下](uniCloud/cf-functions?id=callbyfunction) |
|uniCloud.callFunction() |客户端调用云函数 [见下](uniCloud/cf-functions?id=clientcallfunction)云函数中调用另一个云函数 [见下](uniCloud/cf-functions?id=callbyfunction) |
|uniCloud.database() |云数据库对象 [详情](uniCloud/cf-database.md) |
|uniCloud.uploadFile() |云函数上传文件到云存储 [详情](uniCloud/storage?id=clouduploadfile) |
|uniCloud.downloadFile() |云函数下载云存储的文件到云函数运行环境 [详情](uniCloud/storage?id=clouddownloadfile) |
......@@ -107,11 +107,11 @@ exports.main = async (event, context) => {
```js
'use strict';
exports.main = async (event, context) => {
let source = context.SOURCE // 当前云函数被何种方式调用
// client 客户端callFunction方式调用
// http 云函数url化方式调用
// timing 定时触发器调用
// server 由管理端调用,HBuilderX里上传并运行,仅阿里云支持,腾讯云这种方式调用也是client
let source = context.SOURCE // 当前云函数被何种方式调用
// client 客户端callFunction方式调用
// http 云函数url化方式调用
// timing 定时触发器调用
// server 由管理端调用,HBuilderX里上传并运行,仅阿里云支持,腾讯云这种方式调用也是client
// function 由其他云函数callFunction调用,仅阿里云支持,腾讯云这种方式调用也是client
}
```
......@@ -214,13 +214,13 @@ console.log(res)
}
}
```
**发送formdata类型数据**
实际业务中常有使用云函数发送formdata类型数据的需求,比如微信小程序提供的一些服务端接口(图片内容安全检测、识别图片二维码等),可以参考以下示例进行发送
```js
```
**发送formdata类型数据**
实际业务中常有使用云函数发送formdata类型数据的需求,比如微信小程序提供的一些服务端接口(图片内容安全检测、识别图片二维码等),可以参考以下示例进行发送
```js
'use strict';
const fs = require('fs')
const path = require('path')
......@@ -239,8 +239,8 @@ exports.main = async (event, context) => {
dataType: 'json' // 此处指定为json表示将此请求的返回值解析为json
})
return res
};
};
```
## 使用npm
......@@ -377,7 +377,7 @@ serverless默认是没有固定的服务器IP的,因为有很多服务器在
- 云函数内存使用量会随着并发量增大而增加
- 如果并发的不同请求对全局变量同时进行读写会污染全局变量,可能会导致意想不到的后果,开启单实例多并发后请不要编写修改全局变量的代码,除非你熟悉这种技术带来的特殊应用,比如下文进阶部分提到的ip过滤。
- 设置过大的单实例多并发可能会导致实例底层网络请求排队从而导致请求超时
- 设置过大的单实例多并发可能会导致实例底层网络请求排队从而导致请求超时
**适用场景**
......@@ -418,10 +418,10 @@ exports.main = async function(event, context) {
开启单实例多并发后的全局变量复用并非一定是坏的结果,如果你很了解此行为,也可以对此进行有效的利用
例:[ip-filter](https://ext.dcloud.net.cn/plugin?id=4619)中就利用云函数全局缓存一些ip访问信息来限制单ip访问频率,可以下载示例项目体验一下
### 云函数运行环境@runtime
目前腾讯云和阿里云均支持选择nodejs版本,有nodejs8、nodejs12两个选项,需要在云函数创建时设定,不可修改。需要在云函数的package.json文件的`cloudfunction-config->runtime`字段进行配置,详情参考:[云函数package.json](uniCloud/cf-functions.md?id=packagejson)
### 云函数运行环境@runtime
目前腾讯云和阿里云均支持选择nodejs版本,有nodejs8、nodejs12两个选项,需要在云函数创建时设定,不可修改。需要在云函数的package.json文件的`cloudfunction-config->runtime`字段进行配置,详情参考:[云函数package.json](uniCloud/cf-functions.md?id=packagejson)
## 云函数package.json@packagejson
......@@ -452,7 +452,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
"type": "timer",
"config": "0 0 2 1 * * *"
}],
"path": "",
"path": "",
"runtime": "Nodejs8"
}
}
......@@ -475,7 +475,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
"config": "0 0 2 1 * * *"
}],
// 云函数Url化path部分,阿里云需要以/http/开头
"path": "",
"path": "",
"runtime": "" // nodejs版本,可选Nodejs8、Nodejs12,默认:Nodejs8
}
```
......@@ -486,8 +486,8 @@ package.json是一个标准json文件,不可带注释。下面是一个package
- 在web控制台修改云函数配置后,通过HBuilderX的下载云函数菜单会在package.json内添加修改后的云函数配置
- 上传云函数时,如果项目下的package.json内包含云函数配置会同时进行云函数的配置更新
- package.json只有云端部署才生效,本地运行不生效。
- cloudfunction-config不可删除云端配置。例:云端已配置triggers(定时触发器),删除cloudfunction-config内的trigger不会删掉云端的定时触发器
- runtime参数(nodejs版本)仅可在创建云函数时生效,不可修改
- cloudfunction-config不可删除云端配置。例:云端已配置triggers(定时触发器),删除cloudfunction-config内的trigger不会删掉云端的定时触发器
- runtime参数(nodejs版本)仅可在创建云函数时生效,不可修改
## 使用cloudfunctions_init初始化云函数@init
......
......@@ -31,7 +31,7 @@
需写27行代码,如图:
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/f0798882-cbcc-4b41-affc-7bce5ebaeb0e.png)
2. 前端用ajax携带必要参数请求API,然后将请求结果赋值给data中的变量。最终把变量在图中渲染出来。
2. 前端用ajax携带必要参数请求API,然后将请求结果赋值给data中的变量。最终把变量在图中渲染出来。
需写37行代码,如图:
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/d2194fea-c90e-4f02-b241-d27167ccb015.png)
......@@ -49,7 +49,6 @@
#### 总结:基于uniCloud云端协同的开发方式,不需要写js代码,不需要写服务端的代码。直接在视图模板中写6行代码,即可完成传统开发方式需要64行代码才能完成的效果。且不仅仅是代码量的问题。整个开发过程的体验,提高了完全不止10倍的开发效率。
## clientDB图解
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/b673c28f-c41b-406d-8b7a-c3f4bfbf4b31.jpg)
......@@ -395,6 +394,43 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
只需在db schema中,将两个表的关联字段建立映射关系,就可以把2个表当做一个虚拟表来直接查询。
**关联查询后的虚拟表数据结构如下:**
> 通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟表结构
主表某字段foreignKey指向副表时
```js
{
"主表字段名1": "xxx",
"主表字段名2": "xxx",
"主表内foreignKey指向副表的字段名": [{
"副表字段名1": "xxx",
"副表字段名2": "xxx",
}]
}
```
副表某字段foreignKey指向主表时
```js
{
"主表字段名1": "xxx",
"主表字段名2": "xxx",
"副表foreignKey指向的主表字段名": {
"副表1表名": [{ // 一个主表字段可能对应多个副表字段的foreignKey
"副表1字段名1": "xxx",
"副表1字段名2": "xxx",
}],
"副表2表名": [{ // 一个主表字段可能对应多个副表字段的foreignKey
"副表2字段名1": "xxx",
"副表2字段名2": "xxx",
}],
"_value": "主表字段原始值" // 使用副表foreignKey查询时会在关联的主表字段内以_value存储该字段的原始值,新增于HBuilderX 3.1.16-alpha
}
}
```
比如有2个表,book表,存放书籍商品;order表存放书籍销售订单记录。
book表内有以下数据,title为书名、author为作者:
......
......@@ -26,21 +26,23 @@
您应该避免使用where+skip+limit的查询方式来遍历整个集合,因为这种方式随着Skip数量的增长响应时间会越来越慢,还可能会造成请求超时。
下面的代码给出了一个示例。每次查询时都指定查询条件大于上次查询结果中的最后一条记录的_id,
下面的代码给出了一个示例。**为避免示例过于复杂,先假设没有两条记录的create_date是相等,如果create_date不能唯一标识数据,可以再额外加入其他字段,比如文章作者等**
按照create_date(创建时间)降序排序,每次查询时都指定查询条件小于上次查询结果中的最后一条记录的create_date,这样不需要使用skip即可实现分页效果,同时还能保证用户在上下翻页的时候不会因为出现新增数据而引起的前后两页数据重复的问题。
```js
const db = uniCloud.database()
const dbCmd = db.command
module.exports = async function(event,context) {
const {
lastId,
lastCreateDate = Date.now(),
pageSize
} = event
if(pageSize > 100){
throw new Error('单页数据不可超过100条')
}
const res = await db.collection('book').where({
_id: dbCmd.gt(lastId)
create_date: dbCmd.lt(lastCreateDate)
})
.limit(pageSize)
.get()
......
......@@ -350,4 +350,14 @@ uniCloud客户端callFunction及数据库相关接口会返回Promise类型结
<style>
</style>
```
\ No newline at end of file
```
### 常见数据库错误
**`operation exceeded time limit`、`云数据库执行时间超限`错误**
此错误一般由数据库操作超时引发,具体如何优化请参考:[性能优化](db-performance.md)
**使用事务时出现`WriteConflict`错误**
事务的执行会锁行,同时执行的不同事务在操作同一行数据是会存在冲突导致写入失败。尽量优化流程,避免事务互相冲突
\ No newline at end of file
......@@ -81,7 +81,7 @@ uniCloud同时支持阿里云和腾讯云,它们的数据库大体相同,有
- 云函数操作数据库是较为传统的开发方式,使用nodejs写云函数、使用传统的MongoDB的API操作云数据库。
- 客户端访问云数据库,称为[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb)。这种开发方式可大幅提升开发效率,避免开发者开发服务器代码,并且支持更易用的`jql`语法操作数据库,是更为推荐的开发方式。[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb)有单独一套权限和字段值控制系统,无需单独数据库安全。(使用[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb)推荐HBuilderX 2.9.5以上版本。2.9.5以下的版本需单独下载插件,并且不支持`jql`,不再推荐使用。)
- 客户端访问云数据库,称为[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb)。这种开发方式可大幅提升开发效率,避免开发者开发服务器代码,并且支持更易用的`jql`语法操作数据库,是更为推荐的开发方式。[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb)有单独一套权限和字段值控制系统,无需担心数据库安全。(使用[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb)推荐HBuilderX 2.9.5以上版本。2.9.5以下的版本需单独下载插件,并且不支持`jql`,不再推荐使用。)
不管使用哪种方法,都有很多公共的概念或功能。本文档将讲述这些公共的内容。
......
## JQL数据库管理简介
## HBuilderX的JQL数据库管理器
为方便开发者调试查询语句,`HBuilderX 3.1.5`起内置了JQL查询调试器。用法如下
......
#### 2021-08-01
+ 云数据库 新增 updateAndReturn 方法,可以更新并返回更新后的值(仅可在云函数中使用) [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=update-and-return)
+ uniCloud本地调试插件 修复 部分情况下项目启动时报 npm 安装失败的Bug
+ uni-id 新增 多系统(如管理端、用户端)的配置隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-config)
+ uni-id 新增 多系统用户管理,如某账户只能登录管理端,不能登录用户端 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-user)
* 此版本升级需要开发者处理历史用户数据,请参考 [补齐用户dcloud_appid字段](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=makeup-dcloud-appid)
+ uni-id 新增 QQ登录、注册相关功能 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=qq)
+ uni-id 调整 不再支持绑定手机、邮箱时不填验证码直接绑定
#### 2021-07-07
+ 【重要】云函数支持创建时选择 nodejs 版本 [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-functions.md?id=runtime)
+ 新增 内容安全公共模块,包含图片鉴黄、文字内容违规检测,免费且全端可用 [详情](https://ext.dcloud.net.cn/plugin?id=5460)
+ clientDB 新增 multiSend 接口,用于多个clientDB联网请求合并为一次联网 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=multi-send)
+ unicloud-db组件和API 新增 getTemp 接口,用于在 multiSend 内使用 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=multi-send)
+ uni-id 调整 3.1.1版本发布,使用兼容uniCloud响应体规范的新错误码格式 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=errcode)
+ uniCloud本地调试插件 修复 部分情况下出现 MaxListenersExceededWarning 警告的Bug
+ uniCloud本地调试插件 修复 项目内存在项目外文件的软链时,修改无法实时生效的Bug
+ JQL数据库管理 修复 部分情况下执行数据库操作无响应的Bug
+ 客户端SDK 修复 nvue 页面无法触发 App.vue 内注册的 db.on('error')、db.on('refreshToken') 等回调的Bug
#### 2021-07-06
+ web控制台 新增 违规文件列表
+ web控制台 修复 云存储删除文件总数不变的Bug
+ web控制台 调整 云函数日志默认查询开始时间为2小时前
......
......@@ -270,6 +270,7 @@ DB Schema定义好字段类型为file后,可以通过schema2code工具,直
"title": "图片",
"description": "多张图片",
"arrayType": "file",
"multiple": true, // 允许选择多张图片
"fileMediaType": "image", // 可选值 all|image|video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件
"fileExtName": "jpg,png", // 扩展名过滤,多个用 , 分割
"maxLength": 3 // 限制最大数量
......
......@@ -17,6 +17,8 @@
在使用腾讯云时如果访问云存储文件提示`The requested URL '/1123.jpg' was not found on this server`这种错误,一般是cdn流量用尽导致的。可以升级配置或转为按量计费(目前仅支持企业类型认证的账号可以使用按量计费的服务空间)。
在允许用户上传图片的应用里,违规检测是必不可少的,为此uniCloud提供了内容安全检测模块,可以很方便的实现图片鉴黄等功能。详情参考:[内容安全](https://ext.dcloud.net.cn/plugin?id=5460)
## 客户端API
在uni-app前端进行云存储的操作(不是在云函数里操作),包括在前端上传、删除文件。
......
......@@ -32,6 +32,13 @@
### 安装
**从插件市场导入**
1. 访问插件市场[uni-cloud-router](https://ext.dcloud.net.cn/plugin?id=3660),点击右侧使用HBuilderX导入插件
2. 在要使用uni-cloud-router的云函数目录(例:uniCloud/cloudfunctions/router)右键点击`管理公共模块依赖`,选择uni-cloud-router并确定
**使用npm安装**
```bash
npm install --save uni-cloud-router
```
......@@ -82,9 +89,7 @@ module.exports = {
```js
const { Controller } = require("uni-cloud-router");
module.exports = class HelloController extends (
Controller
) {
module.exports = class HelloController extends Controller {
sayHello() {
return this.service.hello.sayHello();
}
......@@ -97,9 +102,7 @@ module.exports = class HelloController extends (
```js
const { Service } = require("uni-cloud-router");
module.exports = class HelloService extends (
Service
) {
module.exports = class HelloService extends Service {
sayHello() {
return {
data: "welcome to uni-cloud-router!",
......@@ -116,9 +119,13 @@ module.exports = class HelloService extends (
```js
sayHello() {
uni.request('hello/sayHello', {}).then(res => {
this.title = res.data
uniCloud.callFunction({
name: 'hello/sayHello',
data: {}
})
.then(res => {
this.title = res.data
});
}
```
......@@ -145,9 +152,7 @@ sayHello() {
// controller/post.js
const Controller = require("uni-cloud-router").Controller;
// 必须继承 Controller 类
module.exports = class PostController extends (
Controller
) {
module.exports = class PostController extends Controller {
async create() {
const { ctx, service } = this;
// 校验参数
......@@ -240,9 +245,7 @@ class PostController extends Controller {
// service/post.js
const Service = require("uni-cloud-router").Service;
// 必须继承 Service
module.exports = class PostService extends (
Service
) {
module.exports = class PostService extends Service {
async create(data) {
return this.db.add(data);
}
......@@ -291,8 +294,6 @@ module.exports = (options) => {
示例:
- [uni-id 校验 token 中间件](https://github.com/dcloudio/uni-template-admin/blob/master/cloudfunctions-aliyun/uni-admin/middleware/auth.js)
- [uni-id 校验 permission 中间件](https://github.com/dcloudio/uni-template-admin/blob/master/cloudfunctions-aliyun/uni-admin/middleware/permission.js)
- [云函数URL化 中间件](https://github.com/fxy060608/uni-cloud-router/blob/master/src/middleware/http.ts)
- [ip拦截中间件](https://ext.dcloud.net.cn/plugin?id=4619)
......@@ -368,9 +369,9 @@ module.exports = (options) => {
}
```
## 客户端
### 客户端使用云函数
### 发送请求
#### 发送请求
```js
// 使用 uniCloud 访问
......@@ -400,7 +401,7 @@ uni.request({
})
```
### 返回结果
#### 返回结果
```js
{
......@@ -410,3 +411,4 @@ uni.request({
// 其他信息
}
```
......@@ -82,7 +82,7 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及微博
`uni-id`的git仓库:[https://gitee.com/dcloud/uni-id.git](https://gitee.com/dcloud/uni-id.git)
# 快速上手
# 快速上手@start
使用uni-id需要按照以下步骤操作
......@@ -91,11 +91,11 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及微博
1. HBuilderX 3.1.0+
2. 插件市场导入`uni-id`公用模块uni_modules版本,HBuilderX会自动导入依赖的`uni-config-center`[插件市场 uni-id](https://ext.dcloud.net.cn/plugin?id=2116)
3.`uni-config-center`公用模块下创建`uni-id`目录,在创建的uni-id目录下再创建`config.json`文件配置uni-id所需参数(请参考下面config.json的说明),**注意:如果HBuilderX版本低于3.1.8,批量上传云函数及公共模块后需要单独再上传一次uni-id**
4.`cloudfunctions/common`下上传`uni-id`模块
5. 在要使用`uni-id`的云函数右键选择`管理公共模块依赖`添加`uni-id`到云函数
4.`cloudfunctions/common`下上传`uni-config-center`模块以及`uni-id`模块
5. 在要使用`uni-id`的云函数右键选择`管理公共模块依赖`添加`uni-id`到云函数,添加依赖后需要重新上传该云函数
6. 创建`uni-id-users``opendb-verify-codes`集合(opendb-verify-codes是验证码表。可以使用示例项目里面的db_init.json进行初始化、也可以在web控制台新建表时选择这些表模块)
**非uni_modules版本**
**非uni_modules版本(非uni_modules版本已不再更新)**
1. HBuilderX 2.9+
2. 插件市场导入`uni-id`公用模块,[插件市场 uni-id](https://ext.dcloud.net.cn/plugin?id=2116)
......@@ -106,7 +106,7 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及微博
或者直接导入[uni-id在插件市场的示例工程](https://ext.dcloud.net.cn/plugin?id=2116)
## config.json的说明
## config.json的说明@config
注意:
......@@ -159,6 +159,11 @@ exports.main = async (event, context) => {
"appid": "weixin appid",
"appsecret": "weixin appsecret"
},
// App QQ登录所用到的appid、appsecret需要在腾讯开放平台获取,注意:不是公众平台而是开放平台
"qq": {
"appid": "qq appid",
"appsecret": "qq appsecret"
},
"apple": { // 使用苹果登录时需要
"bundleId": "your bundleId"
}
......@@ -174,6 +179,16 @@ exports.main = async (event, context) => {
}
}
},
"mp-qq": {
"tokenExpiresIn": 259200,
"oauth": {
// QQ小程序登录所用的appid、appsecret需要在对应的小程序管理控制台获取
"qq": {
"appid": "qq appid",
"appsecret": "qq appsecret"
}
}
},
"mp-alipay": {
"tokenExpiresIn": 259200,
"oauth": {
......@@ -380,7 +395,7 @@ function hasPermission(token, permission) {
`uni-id`作为一个云函数的公共模块,暴露了各种API,供云函数调用。
## 基础功能
## 基础功能@base
### 创建uni-id实例@create-instance
......@@ -1029,6 +1044,8 @@ exports.main = async function(event,context) {
### 自行初始化uni-id@init
> 此接口已废弃,如需自行传入配置请使用uniID.createInstance接口创建uniID实例来使用
用法:`uniID.init(Object InitParams);`
此接口仅适用于不希望使用config.json初始化而是希望通过js的方式传入配置的情况,多数情况下不推荐使用。**如果你要使用clientDB,且必须要用这种方式初始化uni-id,必须在uni-id的config.json内也写上同样的配置。**
......@@ -1072,7 +1089,7 @@ exports.main = async function(event,context) {
}
```
## 手机号码
## 手机号码@mobile
### 发送短信验证码@sendsmscode
......@@ -1398,7 +1415,7 @@ exports.main = async function(event,context) {
```
## 邮箱
## 邮箱@email
### 邮箱验证码直接登录
......@@ -1541,7 +1558,7 @@ exports.main = async function(event,context) {
}
```
## 微信小程序
## 微信@weixin
### 微信登录
......@@ -1679,8 +1696,6 @@ export default {
### 获取微信openid
> 此接口即将废弃
用法:`uniID.code2SessionWeixin(Object Code2SessionWeixinParams);`
**参数说明**
......@@ -1786,8 +1801,6 @@ exports.main = async function(event,context) {
### 微信数据解密
> 此接口即将废弃
用法:`uniID.wxBizDataCrypt(Object WxBizDataCryptParams);`
**参数说明**
......@@ -1819,7 +1832,184 @@ exports.main = async function(event,context) {
}
```
## 支付宝小程序
## QQ@qq
> 新增于3.3.0版本
### QQ登录
**目前仅支持app和小程序的qq登录**
用法:`uniID.loginByQQ(Object LoginByQQParams);`
**注意**
- 需要在config.json内使用QQ登录的平台下配置appid和appsecret
- uniId会自动判断客户端平台
- 登录成功之后应持久化存储token、token过期时间,键值为:`uni_id_token、uni_id_token_expired`,例:`uni.setStorageSync('uni_id_token', res.result.token)`
**APP QQ登录详细配置流程**
1. 在manifest.json内配置QQ登录用appid
2. **打包****使用**自定义基座(注意一定要在manifest.json填写QQ appid后再制作自定义基座),[自定义基座使用说明](https://ask.dcloud.net.cn/article/35115)
3. 在uni-id的config.json内app-plus对应的QQ登录信息内配置appid和appsecret
**参数说明**
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| code | String | 小程序登录必填|QQ小程序登录返回的code |
| accessToken | String | APP登录必填 |QQ APP登录返回的access_token |
| myInviteCode | String | 否 |设置当前注册用户自己的邀请码,type为`register`时生效 |
| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 |
| role | Array | 否 |设定用户角色,当前用户为新注册时生效 |
**响应参数**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number | 是 |错误码,0表示成功 |
| message | String | 是 |详细信息 |
| uid | String | 是 |用户uid |
| type | String | 是 |操作类型,`login`为登录、`register`为注册 |
| openid | String | 是 |用户openid |
| unionid | String | 否 |用户unionid,能取到此参数时会返回 |
| token | String | 是 |登录成功之后返回的token信息 |
| userInfo | Object | 否 |用户全部信息,`type``login`时返回 |
| tokenExpired | String | 是 |token过期时间 |
| mobileConfirmed | Boolean | 是 |是否已验证手机号 |
| emailConfirmed | Boolean | 是 |是否已验证邮箱 |
| sessionKey | String | - |客户端为QQ小程序时返回 |
| accessToken | String | - |客户端为APP时返回,值等于传入的accessToken |
**示例代码**
```js
// 云函数login-by-qq代码
const uniID = require('uni-id')
exports.main = async function(event,context) {
const res = await uniID.loginByQQ({
code: event.code,
accessToken: event.accessToken
})
return res
}
// 客户端代码
// 代码较长建议直接参考插件市场示例项目:https://ext.dcloud.net.cn/plugin?id=2116
export default {
data() {
return {
hasQQAuth: false
}
},
onLoad() {
uni.getProvider({
service: 'oauth',
success: (res) => {
if (res.provider.indexOf('qq') > -1) {
this.hasQQAuth = true
}
}
})
},
methods: {
getQQCode() {
return new Promise((resolve, reject) => {
uni.login({
provider: 'qq',
success(res) {
// #ifdef APP-PLUS
resolve({
accessToken: res.authResult.access_token,
})
// #endif
// #ifdef MP-QQ
resolve({
code: res.code,
})
// #endif
},
fail(err) {
reject(new Error('QQ登录失败'))
}
})
})
},
loginByQQ() {
this.getQQCode().then(({
code,
accessToken
} = {}) => {
return uniCloud.callFunction({
name: 'login-by-qq',
data: {
code,
accessToken
}
})
}).then((res) => {
uni.showModal({
showCancel: false,
content: JSON.stringify(res.result)
})
if (res.result.code === 0) {
uni.setStorageSync('uni_id_token', res.result.token)
uni.setStorageSync('uni_id_token_expired', res.result.tokenExpired)
}
}).catch((e) => {
console.error(e)
uni.showModal({
showCancel: false,
content: 'QQ登录失败,请稍后再试'
})
})
},
}
}
```
### 绑定QQ
用法:`uniID.bindQQ(Object BindQQParams);`
**参数说明**
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| uid | String| 是 |用户Id,可以通过checkToken返回 |
| code | String| QQ小程序必填|QQ登录返回的code |
| accessToken | String| APP必填 |QQ登录返回的access_token |
**响应参数**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
| message | String| 是 |详细信息 |
| openid | String| 是 |用户openid |
| unionid | String| 否 |用户unionid,能取到此参数时会返回 |
| sessionKey | String| - |客户端为QQ小程序时返回 |
| accessToken | String| - |客户端为APP时返回,值为传入的accessToken |
### 解绑QQ
用法:`uniID.unbindQQ(String uid);`
**参数说明**
| 字段| 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| uid | String| 是 |用户Id,可以通过checkToken返回 |
**响应参数**
| 字段| 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code| Number| 是 |错误码,0表示成功|
| message | String| 是 |详细信息 |
## 支付宝@alipay
### 支付宝登录
......@@ -1872,8 +2062,6 @@ exports.main = async function(event,context) {
### 获取支付宝用户ID
> 此接口即将废弃
用法:`uniID.code2SessionAlipay(Object Code2SessionAlipayParams);`
**参数说明**
......@@ -1969,7 +2157,7 @@ exports.main = async function(event,context) {
}
```
## Apple(苹果)
## Apple(苹果)@apple
### Apple登录@loginbyapple
......@@ -2094,8 +2282,6 @@ export default {
### Apple登录校验identityToken
> 此接口即将废弃
用法:`uniID.verifyAppleIdentityToken(Object Code2SessionAppleParams);`
**参数说明**
......@@ -2561,7 +2747,97 @@ exports.main = async function(event,context) {
}
```
# 数据库结构
## 授权、禁止用户在特定客户端登录@authorize-app
> 新增于3.3.0版本
用户授权或者取消授权用户登录某客户端。
需要注意的是客户端APPID信息是由端上传上来的,并非完全可信,尽量在入口处进行校验。例:
```js
exports.main = async function(event, context){
if(context.APPID !== '__UNI__xxx1') {
throw new Error('非法访问')
}
}
```
### 设置允许登录的客户端
用法:`uniID.setAuthorizedAppLogin(Object SetAuthorizedAppLoginParams);`
覆盖原有dcloud_appid字段,设置指定用户允许登录的客户端
**参数说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| uid | String| 是 |用户Id |
| dcloudAppidList | Array | 是 |指定允许登录的客户端的DCloud Appid列表 |
```js
const res = await uniID.setAuthorizedAppLogin({
uid: 'xxxx',
dcloudAppidList: ['__UNI__xxx1', '__UNI__xxx2'] // 允许登录的DCloud Appid列表
})
```
### 新增允许登录的客户端
用法:`uniID.authorizeAppLogin(Object AuthorizeAppLoginParams);`
在已有允许登录的客户端列表中插入新的客户端的DCloud Appid
**参数说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| uid | String| 是 |用户Id |
| dcloudAppid | String| 是 |指定允许登录的客户端的DCloud Appid |
```js
const res = await uniID.authorizeAppLogin({
uid: 'xxxx',
dcloudAppid: '__UNI__xxx1' // 允许登录的客户端的DCloud Appid
})
```
### 移除允许登录的客户端
用法:`uniID.forbidAppLogin(Object ForbidAppLoginParams);`
从已有允许登录的客户端列表中移除一个客户端的DCloud Appid,禁止后用户不可在特定客户端登录
**参数说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| uid | String| 是 |用户Id |
| dcloudAppid | String| 是 |指定禁止登录的客户端的DCloud Appid |
```js
const res = await uniID.forbidAppLogin({
uid: 'xxxx',
dcloudAppid: '__UNI__xxx1' // 禁止登录的客户端的DCloud Appid
})
```
## 调试功能
> 此类目下接口仅可用于开发调试,不要在生产环境使用
### 获取当前uni-id实例使用的配置内容
> 新增于3.3.0版本
由于uni-id提供了多种传入配置的方式`config.json、uniID.createInstance、uniID.init(已不推荐使用)`,开发者在使用插件作者或者其他人开发的功能时容易搞错到底在哪进行配置。可以使用此接口查看实际使用的配置文件内容,方便开发调试
用法:`uniID.dev.getConfig()`
此接口会返回uni-id实例使用的配置内容。
# 数据库结构@db-schema
`uni-id`的所有数据表,都在[opendb](https://gitee.com/dcloud/opendb/)规范中。
......@@ -2649,6 +2925,12 @@ exports.main = async function(event,context) {
}
```
### 用户表索引@uni-id-users-indexes
目前opendb内提供的uni-id-users表包含完整的索引,数据库在索引量多且频繁更新的情况下可能会出现写入缓慢的情况,因此推荐开发者在使用uni-id-users表时可以适当删除部分没有用到的索引。
例:项目内只使用了微信登录,不使用其他登录方式,可以只保留`wx_unionid、wx_openid.mp-weixin、wx_openid.app-plus`这些账号相关的索引,删除其他账号的索引
## 验证码表
表名:`opendb-verify-codes`
......@@ -2717,34 +2999,36 @@ exports.main = async function(event,context) {
errCode和errMsg对照表如下:
|错误码(errCode) |详细信息(errMsg) |说明 |
|--- |--- |--- |
|0 |成功 |操作成功 |
|uni-id-account-banned |账号已禁用 |账号已禁用 |
|uni-id-user-not-exist |用户不存在 |用户不存在 |
|uni-id-multi-user-matched |匹配到多个账号 |匹配到多个账号 |
|uni-id-password-error |密码错误 |密码错误 |
|uni-id-password-error-exceed-limit |密码错误次数过多 |密码错误次数过多 |
|uni-id-account-already-registed |此{type}已注册 |此账号已注册、包括手机号、微信等 |
|uni-id-account-not-registed |此{type}尚未注册 |此账号尚未注册、包括手机号、微信等 |
|uni-id-invalid-invite-code |邀请码无效 |邀请码无效 |
|uni-id-get-third-party-account-failed |获取{account}失败 |获取三方平台账号失败 |
|uni-id-param-required |{param}不可为空 |字段不可为空 |
|uni-id-check-device-feature-failed |设备特征校验未通过 |设备特征校验未通过 |
|uni-id-token-not-exist |云端已不包含此token |云端已不包含此token |
|uni-id-token-expired |token已过期 |token已过期 |
|uni-id-check-token-failed |token校验未通过 |token校验未通过 |
|uni-id-invalid-old-password |旧密码错误 |旧密码错误 |
|uni-id-param-error |{param}参数错误,{reason}|参数错误 |
|uni-id-invalid-verify-code |验证码错误或已失效 |验证码错误或已失效 |
|uni-id-send-sms-code-failed |验证码发送失败 |验证码发送失败 |
|uni-id-account-already-bound |此{type}已绑定 |此账号已绑定、包括手机号、微信等 |
|uni-id-unbind-failed |解绑失败 |解绑失败 |
|uni-id-set-invite-code-failed |邀请码设置失败 |邀请码设置失败 |
|uni-id-modify-invite-code-is-not-allowed |邀请码不可修改 |邀请码不可修改 |
|uni-id-database-operation-failed |数据库读写异常 |数据库读写异常 |
|uni-id-role-not-exist |角色不存在 |角色不存在 |
|uni-id-permission-not-exist |权限不存在 |权限不存在 |
|错误码(errCode) |详细信息(errMsg) |说明 |
|--- |--- |--- |
|0 |成功 |操作成功 |
|uni-id-account-banned |账号已禁用 |账号已禁用 |
|uni-id-user-not-exist |用户不存在 |用户不存在 |
|uni-id-multi-user-matched |匹配到多个账号 |匹配到多个账号 |
|uni-id-user-info-error |用户信息不正确 |用户信息不正确 |
|uni-id-user-account-conflict |用户账号冲突 |用户账号冲突(例如同时授权拥有同一个手机号的司机与乘客登录管理端) |
|uni-id-password-error |密码错误 |密码错误 |
|uni-id-password-error-exceed-limit |密码错误次数过多 |密码错误次数过多 |
|uni-id-account-already-registed |此{type}已注册 |此账号已注册、包括手机号、微信等 |
|uni-id-account-not-registed |此{type}尚未注册 |此账号尚未注册、包括手机号、微信等 |
|uni-id-invalid-invite-code |邀请码无效 |邀请码无效 |
|uni-id-get-third-party-account-failed |获取{account}失败 |获取三方平台账号失败 |
|uni-id-param-required |{param}不可为空 |字段不可为空 |
|uni-id-check-device-feature-failed |设备特征校验未通过 |设备特征校验未通过 |
|uni-id-token-not-exist |云端已不包含此token |云端已不包含此token |
|uni-id-token-expired |token已过期 |token已过期 |
|uni-id-check-token-failed |token校验未通过 |token校验未通过 |
|uni-id-invalid-old-password |旧密码错误 |旧密码错误 |
|uni-id-param-error |{param}参数错误,{reason}|参数错误 |
|uni-id-invalid-verify-code |验证码错误或已失效 |验证码错误或已失效 |
|uni-id-send-sms-code-failed |验证码发送失败 |验证码发送失败 |
|uni-id-account-already-bound |此{type}已绑定 |此账号已绑定,包括手机号、微信等 |
|uni-id-unbind-failed |解绑失败 |解绑失败 |
|uni-id-set-invite-code-failed |邀请码设置失败 |邀请码设置失败 |
|uni-id-modify-invite-code-is-not-allowed |邀请码不可修改 |邀请码不可修改 |
|uni-id-database-operation-failed |数据库读写异常 |数据库读写异常 |
|uni-id-role-not-exist |角色不存在 |角色不存在 |
|uni-id-permission-not-exist |权限不存在 |权限不存在 |
**自`1.1.0`版本使用此错误码规范**
......@@ -2971,6 +3255,119 @@ uni-id会自动加载custom-token.js进行处理,在所有生成token的操作
- 使用custom-token时自行调用createToken接口会变为异步操作,需使用`await uniID.createToken(...)`
- 不要删除原始token内的字段
## 隔离不同端用户@isolate-user
一个完整的项目,通常需要客户端、管理端等,但是不同端的用户在同一服务空间下使用uni-id会比较难处理。比如不同端需要不同的配置文件、登录接口需要开发者自行隔离开。自`uni-id 3.3.0`起,支持对不同端用户进行隔离,此功能在此版本是直接开启的。
uni-id 3.3.0版本起用户注册时会自动在用户表的记录内标记为注册端用户,如果没有授权登录其他端的话是不可以在其他端登录的
如何授权登录其他端请参考:[授权、禁止用户在特定客户端登录](uniCloud/uni-id?id=authorize-app)
需要注意的是客户端APPID信息是由端上传上来的,并非完全可信,尽量在入口处进行校验。例:
```js
exports.main = async function(event, context){
if(context.APPID !== '__UNI__xxx1') {
throw new Error('应用ID非法')
}
}
```
**DCloud Appid是一个很重要的配置,如无必要请勿随意更换。**
> 不同端用户数据通过用户表的dcloud_appid字段隔离,同一个手机号、微信号也可以同时注册管理端和用户端,绑定账号同理。
**注意**
- uni-id会自动在用户表每条用户记录插入`dcloud_appid`字段(此字段是一个数组,标识此用户可以在哪些端登录)。
- 为兼容旧版本,针对没有dcloud_appid字段的用户,允许登录任意端。
- 如果用户数据库记录中`dcloud_appid`字段是一个空数组,表示当前用户不能在任何客户端登录
- 已有dcloud_appid的用户,如果使用相同的用户标识(用户名、邮箱、手机、微信等)+ 不同的DCloud Appid登录会被判定为不同的用户,如果此时数据库没有对应的记录,会报用户不存在的错误
## 隔离不同端配置@isolate-config
> `uni-id 3.3.0`及以上版本
uni-id的config.json支持配置为数组,每项都是一个完整的配置,对不同的配置使用`dcloudAppid`字段进行区分(**此字段与项目内的manifest.json里面的DCloud AppId一致**),uni-id会自动根据客户端的appid来判断该使用哪套配置。如果使用云函数url化请参考:[云函数Url化时使用](uniCloud/uni-id?id=url)
需要注意的是客户端APPID信息是由端上传上来的,并非完全可信,尽量在入口处进行校验。例:
```js
exports.main = async function(event, context){
if(context.APPID !== '__UNI__xxx1') {
throw new Error('应用ID非法')
}
}
```
**示例**
> 数组每一项都是一个完整的配置文件,全部选项请参考:[uni-id 配置](uniCloud/uni-id?id=config)
**注意:如果允许同一账号在不同端使用相同的账号+密码登录需要将不同端的passwordSecret设置成一样的**
```js
[{
"dcloudAppid": "__UNI__xxxx1", // 务必替换为对应项目manifest.json内的DCloud Appid
"isDefaultConfig": true, // 默认配置标记,未匹配到dcloudAppid的情况下使用默认配置
"passwordSecret": "passwordSecret-demo",
"tokenSecret": "tokenSecret-demo",
"tokenExpiresIn": 7200,
"tokenExpiresThreshold": 600,
"app-plus": {
"tokenExpiresIn": 2592000,
"oauth": {
"weixin": {
"appid": "weixin appid",
"appsecret": "weixin appsecret"
}
}
}
}, {
"dcloudAppid": "__UNI__xxxx2", // 务必替换为对应项目manifest.json内的DCloud Appid
"passwordSecret": "passwordSecret-demo",
"tokenSecret": "tokenSecret-demo",
"tokenExpiresIn": 7200,
"tokenExpiresThreshold": 600,
"app-plus": {
"tokenExpiresIn": 2592000,
"oauth": {
"weixin": {
"appid": "weixin appid",
"appsecret": "weixin appsecret"
}
}
}
}]
```
## 云函数Url化时使用@url
云函数url化时uni-id无法自行获取客户端相关信息,需要开发者自行创建uniID实例并传入相关信息,以下为一个简单示例
```js
// 客户端代码示例
uni.request({
url: 'https://xxx.xxx/xxx?appid=your_appid&platform=your_platform&deviceId=your_deviceId'
})
// 云函数代码示例
const uniID = require('uni-id')
exports.main = async function(event, context) {
const {
appid,
platform
} = event.queryStringParameters // 不同类型的请求获取参数的方式略有差异,具体如何取参数请参考:https://uniapp.dcloud.net.cn/uniCloud/http
context.APPID = appid
context.PLATFORM = platform
const uniIDIns = uniID.createInstance({
context
})
// uniIDIns.login() 使用uniIDIns来调用uni-id相关接口
}
```
# 迁移指南@migration
## 自1.x.x版本升级到2.x.x@m1to2
......@@ -3032,6 +3429,80 @@ uni-id 3.1.0版本主要有以下两个调整
- 此调整兼容旧版本,以登录接口为例,优先匹配用户输入用户名对应的账号,如果不存在则匹配全小写用户名对应的账号(uni-id内部进行处理实际不会增加数据库读写次数)
- 新注册用户会将用户名/邮箱存储为全小写格式,老用户可能还存在包含大写字母的邮箱及用户名
#### 补齐用户dcloud_appid字段@makeup-dcloud-appid
此调整详情见:[隔离不同端用户](uniCloud/uni-id.md?id=isolate-user)
> uni-id3.3.0以下版本升级到3.3.0及以上版本时,需要参照本章节补齐用户数据
uni-id在3.3.0提供了根据客户端appid(项目manifest.json内配置的DCloud Appid)隔离不同用户的功能,旧版本的uni-id在注册用户时并未将当前客户端的appid存储在用户的记录内,更新到新版后这些没有dcloud_appid字段的用户和之前一样可以登录所有端。开发者使用云函数本地运行可以自行对用户数据进行修补,为用户创建dcloud_appid字段
**更新后用户将只允许登录与自己数据库记录内匹配的端**
云函数示例代码如下:
**注意:如果要更新的记录很多可能会超时失败,此时无需重试等待数据库自行完成更新即可**
**如果仅有一端,将所有用户的数据更新为同一个dcloud_appid即可,例:**
```js
exports.main = async function() {
const db = uniCloud.database()
const userCollection = db.collection('uni-id-users')
const res = await userCollection.where({
dcloud_appid: db.command.exists(false) // 更新所有不存在dcloud_appid字段的用户
}).update({
dcloud_appid: ['你项目内manifest.json里面的DCloud Appid,__UNI_xxxx形式'] // 注意这里是个数组,务必正确填写
})
return res
}
```
**如果之前就有区分不同端的用户,可以将自己区分用户的条件加上再进行更新,例:**
```js
// 更新教师端用户的云函数
exports.main = async function() {
const db = uniCloud.database()
const userCollection = db.collection('uni-id-users')
const res = await userCollection.where({
user_type: 'teacher', // 教师端用户
dcloud_appid: db.command.exists(false)
}).update({
dcloud_appid: ['教师端项目内manifest.json里面的DCloud Appid,__UNI_xxxx形式'] // 注意这里是个数组,务必正确填写
})
return res
}
// 更新学生端用户的云函数
exports.main = async function() {
const db = uniCloud.database()
const userCollection = db.collection('uni-id-users')
const res = await userCollection.where({
user_type: 'student', // 学生端用户
dcloud_appid: db.command.exists(false)
}).update({
dcloud_appid: ['学生端项目内manifest.json里面的DCloud Appid,__UNI_xxxx形式'] // 注意这里是个数组,务必正确填写
})
return res
}
```
**如果允许用户在多个端登录需要将多端的DCloud Appid都传进来,例:**
```js
exports.main = async function() {
const db = uniCloud.database()
const userCollection = db.collection('uni-id-users')
const res = await userCollection.where({
dcloud_appid: db.command.exists(false) // 更新所有不存在dcloud_appid字段的用户
}).update({
dcloud_appid: ['DCloud Appid1','DCloud Appid1'] // 注意这里是个数组,务必正确填写
})
return res
}
```
# FAQ
- token数组为什么越来越长
......@@ -3045,6 +3516,3 @@ uni-id 3.1.0版本主要有以下两个调整
- 关于邀请码
+ 目前仅手机号+验证码的注册方式支持填写邀请码
- 区分前后端用户
+ 不支持分表,推荐给用户添加标记来区分前后端用户
......@@ -46,7 +46,7 @@ HBuilderX中敲下`udb`代码块,得到如下代码,然后通过collection
|collection|string|表名。支持输入多个表名,用 `,` 分割|
|field|string|指定要查询的字段,多个字段用 `,` 分割。不写本属性,即表示查询所有字段。支持用 oldname as newname方式对返回字段重命名|
|where|string|查询条件,对记录进行过滤。[见下](/uniCloud/unicloud-db?id=where)|
|orderby|string|排序字段及正序倒设置|
|orderby|string|排序字段及正序倒设置|
|foreign-key|String|手动指定使用的关联关系,HBuilderX 3.1.10+ [详情](/uniCloud/clientdb?id=lookup-foreign-key)|
|page-data|String|分页策略选择。值为 `add` 代表下一页的数据追加到之前的数据中,常用于滚动到底加载下一页;值为 `replace` 时则替换当前data数据,常用于PC式交互,列表底部有页码分页按钮,默认值为`add`|
|page-current|Number|当前页|
......@@ -54,7 +54,7 @@ HBuilderX中敲下`udb`代码块,得到如下代码,然后通过collection
|getcount|Boolean|是否查询总数据条数,默认 `false`,需要分页模式时指定为 `true`|
|getone|Boolean|指定查询结果是否仅返回数组第一条数据,默认 false。在false情况下返回的是数组,即便只有一条结果,也需要[0]的方式获取。在值为 true 时,直接返回结果数据,少一层数组,一般用于非列表页,比如详情页|
|action|string|云端执行数据库查询的前或后,触发某个action函数操作,进行预处理或后处理,[详情](/uniCloud/uni-clientDB?id=%e4%ba%91%e7%ab%af%e9%83%a8%e5%88%86)。场景:前端无权操作的数据,比如阅读数+1|
|manual|Boolean|是否手动加载数据,默认为 false,页面onready时自动联网加载数据。如果设为 true,则需要自行指定时机通过方法`this.$refs.udb.loadData()`来触发联网,其中的`udb`指组件的ref值。一般onLoad因时机太早取不到this.$refs.udb,在onReady里可以取到|
|manual|Boolean|**已过时,使用 `loadtime` 替代** 是否手动加载数据,默认为 false,页面onready时自动联网加载数据。如果设为 true,则需要自行指定时机通过方法`this.$refs.udb.loadData()`来触发联网,其中的`udb`指组件的ref值。一般onLoad因时机太早取不到this.$refs.udb,在onReady里可以取到|
|gettree|Boolean|是否查询树状结构数据,HBuilderX 3.0.5+ [详情](/uniCloud/clientdb?id=gettree)|
|startwith|String|gettree的第一层级条件,此初始条件可以省略,不传startWith时默认从最顶级开始查询,HBuilderX 3.0.5+|
|limitlevel|Number|gettree查询返回的树的最大层级。超过设定层级的节点不会返回。默认10级,最大15,最小1,HBuilderX 3.0.5+|
......@@ -149,15 +149,11 @@ where中指定要查询的条件。比如只查询某个字段的值符合一定
</script>
```
**注意**
- 此方式目前在微信小程序会报错,近期会进行修复
方式2. 不在属性中写,而在js中拼接字符串
```html
<template>
<view>
<unicloud-db collection="uni-id-users" :where="sWhere"></unicloud-db>
<unicloud-db ref="udb" collection="uni-id-users" :where="sWhere" loadtime="manual"></unicloud-db>
</view>
</template>
<script>
......@@ -170,6 +166,10 @@ where中指定要查询的条件。比如只查询某个字段的值符合一定
}
onLoad() {
this.sWhere = "id=='" + this.tempstr + "'"
// 组件上配置了 loadtime = "manual", 这里需要手动加载数据
this.$nextTick(() => {
this.$refs.udb.loadData()
})
// 多条件示例
......
......@@ -31,7 +31,7 @@
```js
// 插件市场导入
const unipay = require('unipay')
const unipay = require('uni-pay')
// npm安装
const unipay = require('@dcloudio/unipay')
......@@ -41,7 +41,7 @@ const unipay = require('@dcloudio/unipay')
- 插件市场导入的用法请参考[云函数公用模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common)
## 初始化
## 初始化@init
进行初始化操作返回 unipay 实例
......@@ -49,16 +49,18 @@ const unipay = require('@dcloudio/unipay')
**入参说明**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
| :--------: | :-----: | :----: | :--------------------------------------------------: | :------------------------------------: |
| appId | String | 是 | - | 当前应用在对应支付平台的 appId |
| mchId | String | 是 | - | 商户号 |
| key | String | 是 | - | 支付商户 key (API密钥) |
| pfx | String | Buffer | 使用退款功能必填 | 微信支付商户 API 证书,主要用于退款 |
| timeout | Number | 否 | 5000 | 请求超时时间,单位:毫秒 |
| signType | String | 否 | MD5 | 签名类型 |
| sandbox | Boolean | 否 | false | 是否启用沙箱环境 |
| clientType | String | 否 | 默认自动获取客户端类型,同 `context` 内的 `PLATFORM` | 客户端类型,主要用于返回客户端支付参数 |
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
| :--------:| :-----: | :----:| :--------------------------------------------------:| :------------------------------------: |
| appId | String | 是 | - | 当前应用在对应支付平台的 appId |
| mchId | String | 是 | - | 商户号 |
| subAppId| String | 否 | - | 子商户appId |
| subMchId| String | 否 | - | 子商户号 |
| key | String | 是 | - | 支付商户 key (API密钥) |
| pfx | String | Buffer| 使用退款功能必填 | 微信支付商户 API 证书,主要用于退款 |
| timeout | Number | 否 | 5000 | 请求超时时间,单位:毫秒 |
| signType | String | 否 | MD5 | 签名类型 |
| sandbox | Boolean | 否 | false | 是否启用沙箱环境 |
| clientType| String | 否 | 默认自动获取客户端类型,同 `context` 内的 `PLATFORM`| 客户端类型,主要用于返回客户端支付参数 |
```js
const unipayIns = unipay.initWeixin({
......@@ -132,8 +134,8 @@ const unipayIns = unipay.initAlipay({
| body | String| 微信支付必填 | - | 商品描述 | 微信支付 |
| outTradeNo| String| 必填 | - | 商户订单号,64 个字符以内、只能包含字母、数字、下划线;需保证在商户端不重复 | |
| totalFee | Number| 必填 | - | 订单金额,单位:分 | 支付宝小程序、微信小程序|
| notifyUrl | String| 必填 | - | 支付结果通知地址 | |
| tradeType | String| 非小程序支付、App支付时必填 | - | `1.0.6+`交易类型"JSAPI": "公众号支付、微信小程序支付、支付宝小程序支付"、"APP:"APP支付"、"NATIVE":"网站二维码支付"| - |
| notifyUrl | String| 必填 | - | 支付结果通知地址**需要注意支付宝支付时退款也会通知到此地址,务必处理好自己的业务逻辑** | |
| tradeType | String| 非小程序支付、App支付时必填 | - | `1.0.6+`交易类型"JSAPI": "公众号支付、微信小程序支付、支付宝小程序支付"、"APP:"APP支付"、"NATIVE":"网站二维码支付"|- |
**返回值说明**
......@@ -312,7 +314,7 @@ exports.main = async function (event) {
| refundFee | Number | 必填 | - | 退款总金额 | 微信支付 |
| refundFeeType | String | 选填 | - | 货币种类 | - |
| refundDesc | String | 选填 | - | 退款原因 | - |
| notifyUrl | String | 微信支付选填,支付宝不支持 | - | 退款通知 url | 微信支付 |
| notifyUrl | String | 微信支付选填,支付宝不支持 | - | 退款通知 url,支付宝会通知获取支付参数时的通知地址 | 微信支付 |
**返回值说明**
......@@ -542,6 +544,8 @@ exports.main = async function (event) {
### 支付结果通知处理
**注意:支付宝在非全量退款时也会发送通知到支付时设置的notify_url**
`unipayIns.verifyPaymentNotify`,用于在使用云函数 Url 化的云函数内检验并处理支付结果。
**入参说明**
......@@ -587,7 +591,11 @@ exports.main = async function (event) {
}
```
### 退款结果通知
### 退款结果通知@verify-refund-notify
**注意:支付宝在非全量退款时才会发送通知,通知地址为支付时设置的notify_url**
> uni-pay 1.0.17版本起新增对支付宝退款结果通知的支持
`unipayIns.verifyRefundNotify`,用于在使用云函数 Url 化的云函数内检验并处理支付结果。
......@@ -597,19 +605,19 @@ exports.main = async function (event) {
**返回值说明**
| 参数名 | 类型 | 说明 | 支持平台 |
| :-----------------: | :----: | :---------------------------------------------------: | :------: |
| totalFee | Number | 订单总金额 | - |
| refundFee | Number | 申请退款金额 | - |
| settlementTotalFee | Number | 应结订单金额 | - |
| settlementRefundFee | Number | 退款金额 | - |
| outTradeNo | String | 商户订单号 | - |
| transactionId | String | 平台订单号 | - |
| refundId | String | 平台退款单号 | - |
| outRefundNo | String | 商户退款单号 | - |
| refundStatus | String | SUCCESS-退款成功,CHANGE-退款异常,REFUNDCLOSE—退款关闭 | - |
| refundAccount | String | 退款资金来源 | - |
| refundRecvAccout | String | 退款入账账户 | - |
| 参数名 | 类型 | 说明 | 支持平台|
| :-----------------: | :----:| :---------------------------------------------------: | :------:|
| totalFee | Number| 订单总金额 | - |
| refundFee | Number| 申请退款金额 | - |
| settlementTotalFee | Number| 应结订单金额,支付宝不返回 | - |
| settlementRefundFee | Number| 退款金额,支付宝不返回 | - |
| outTradeNo | String| 商户订单号 | - |
| transactionId | String| 平台订单号 | - |
| refundId | String| 平台退款单号,支付宝不返回 | - |
| outRefundNo | String| 商户退款单号 | - |
| refundStatus | String| SUCCESS-退款成功,CHANGE-退款异常,REFUNDCLOSE—退款关闭| - |
| refundAccount | String| 退款资金来源,支付宝不返回 | - |
| refundRecvAccout | String| 退款入账账户,支付宝不返回 | - |
**使用示例**
......@@ -637,3 +645,33 @@ exports.main = async function (event) {
}
}
```
### 获取通知类型@check-notify-type
> 新增于 uni-id 1.0.17
`unipayIns.checkNotifyType`,用于在使用云函数 Url 化的云函数内检验当前通知的类型。由于支付宝支付在非全量退款时会调用支付时设置的notify_url,可以使用此接口在调用校验通知之前判断通知类型
**入参说明**
只接收对应云函数的`event`作为参数
**返回值说明**
此接口会返回一个字符串,可能的值如下
- `refund`:当前是一个退款通知
- `payment`:当前是一个支付结果通知
**使用示例**
```js
exports.main = async function (event) {
let res = await unipayIns.checkNotifyType(event)
if(res === 'refund') {
// 退款通知
} else if(res === 'payment') {
// 支付结果通知
}
}
```
\ No newline at end of file
......@@ -39,7 +39,7 @@ uni_modules 项目根目录下
├── hybrid 存放本地网页的目录,<a href="/component/web-view">详见</a>
├── pages 业务页面文件存放的目录
├── static 存放应用引用静态资源(如图片、视频等)的目录,<b>注意:</b>静态资源只能存放于此
── wxcomponents 存放小程序组件的目录,<a href="/frame?id=%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%BB%84%E4%BB%B6%E6%94%AF%E6%8C%81">详见</a>
── wxcomponents 存放小程序组件的目录,<a href="/frame?id=%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%BB%84%E4%BB%B6%E6%94%AF%E6%8C%81">详见</a>
├── license.md 插件使用协议说明
├── package.json 插件配置,必选(除此之外均`可选`)
├── readme.md 插件文档
......@@ -91,7 +91,7 @@ package.json在每个`uni_modules`插件中都必须存在,包含了插件的
"uni_modules": { // uni_modules配置
"dependencies": [], // 依赖的 uni_modules 插件ID列表
"encrypt": [ // 配置云函数,公共模块,clientDB Action加密
"uniCloud/cloudfunctions/uni-admin/controller/permission.js"
"uniCloud/cloudfunctions/uni-admin/controller/permission.js" // 注意这里是真实的文件路径,uni_modules下的uniCloud不带-aliyun、-tcb后缀,但是项目根目录下的uniCloud是带有后缀的
],
"platforms": { // 平台兼容性:y 表示 Yes,支持;n 表示 No,不支持;u 表示 Unknown,不确定;默认为 u
"cloud": { // 云端平台兼容性
......@@ -160,6 +160,22 @@ package.json在每个`uni_modules`插件中都必须存在,包含了插件的
* 若未在uni_modules.config.json中配置平台,则上传该插件uniCloud资源时,会提示上传至选择哪个服务空间
* 若已在uni_modules.config.json中配置平台,则上传时以配置为准,自动归属至指定的服务空间
#### npmignore@npmignore
uni_modules插件发布到插件市场是通常需要忽略掉一些目录或文件,比如`unpackage``.hbuilderx``node_modules`等,这时可以通过npmignore文件来实现文件的忽略。
文件名:**.npmignore**,注意开头有个点。典型的npmignore文件内容如下:
```
.hbuilderx
unpackage
node_modules
package-lock.json
```
**注意**
- 项目根目录下的`.npmignore`对发布项目、插件模板生效。`uni_modules/插件Id/.npmignore`对发布插件生效
### 开发 uni_modules 插件
#### 新建uni_modules目录
......
......@@ -196,31 +196,32 @@ univerifyStyle 数据结构:
"borderRadius": "0px" // 其他登录按钮圆角 默认值:"24px" (按钮高度的一半)
},
"privacyTerms": {
"defaultCheckBoxState":"true", // 条款勾选框初始状态 默认值: true
"defaultCheckBoxState":"true", // 条款勾选框初始状态 默认值: true
"uncheckedImage":"", // 可选 条款勾选框未选中状态图片(仅支持本地图片 建议尺寸 24x24px)(3.2.0+ 版本支持)
"checkedImage":"", // 可选 条款勾选框选中状态图片(仅支持本地图片 建议尺寸24x24px)(3.2.0+ 版本支持)
"textColor": "#BBBBBB", // 文字颜色 默认值:#BBBBBB
"termsColor": "#5496E3", // 协议文字颜色 默认值: #5496E3
"prefix": "我已阅读并同意", // 条款前的文案 默认值:“我已阅读并同意”
"suffix": "并使用本机号码登录", // 条款后的文案 默认值:“并使用本机号码登录”
"privacyItems": [
// 自定义协议条款,最大支持2个,需要同时设置url和title. 否则不生效
"privacyItems": [ // 自定义协议条款,最大支持2个,需要同时设置url和title. 否则不生效
{
"url": "https://", // 点击跳转的协议详情页面
"title": "用户服务协议" // 协议名称
}
]
},
"buttons": { // 自定义登陆按钮
"iconWidth": "45px", // 图标宽度(高度等比例缩放) 默认值:45px
"list": [
{
"provider": "apple",
"iconPath": "/static/apple.png" // 图标路径仅支持本地图片
},
{
"provider": "weixin",
"iconPath": "/static/wechat.png" // 图标路径仅支持本地图片
}
]
"buttons": { // 自定义页面下方按钮仅全屏模式生效(3.1.14+ 版本支持)
"iconWidth": "45px", // 图标宽度(高度等比例缩放) 默认值:45px
"list": [
{
"provider": "apple",
"iconPath": "/static/apple.png" // 图标路径仅支持本地图片
},
{
"provider": "weixin",
"iconPath": "/static/wechat.png" // 图标路径仅支持本地图片
}
]
}
}
```
......
......@@ -12,5 +12,5 @@
"message": "chore(release): publish %s"
}
},
"version": "2.0.0-alpha-31920210707001"
"version": "2.0.0-31920210709003"
}
{
"name": "@dcloudio/uni-app-plus-nvue",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app app-plus-nvue",
"main": "dist/index.js",
"repository": {
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
{
"name": "@dcloudio/uni-app-plus",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app app-plus",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-automator",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app automator",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-cli-shared",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-cli-shared",
"main": "lib/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-h5-ui",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app h5 ui",
"main": "dist/index.umd.min.js",
"repository": {
......
{
"name": "@dcloudio/uni-h5",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app h5",
"main": "dist/index.umd.min.js",
"repository": {
......
{
"name": "@dcloudio/uni-i18n",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "@dcloudio/uni-i18n",
"main": "dist/uni-i18n.cjs.js",
"module": "dist/uni-i18n.esm.js",
......
{
"name": "@dcloudio/uni-migration",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app migration",
"main": "lib/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-mp-alipay",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app mp-alipay",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-mp-baidu",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app mp-baidu",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-mp-kuaishou",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app mp-kuaishou",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-mp-qq",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app mp-qq",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-mp-toutiao",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app mp-toutiao",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-mp-vue",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "@dcloudio/uni-mp-vue",
"main": "dist/vue.runtime.esm.js",
"module": "dist/vue.runtime.esm.js",
......
{
"name": "@dcloudio/uni-mp-weixin",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app mp-weixin",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-quickapp-native",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app quickapp-native",
"main": "dist/vue.prod.js",
"repository": {
......
{
"name": "@dcloudio/uni-quickapp-webview",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app quickapp-webview",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-stat",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "",
"main": "dist/index.js",
"repository": {
......
{
"name": "@dcloudio/uni-template-compiler",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-template-compiler",
"main": "lib/index.js",
"repository": {
......
{
"name": "@dcloudio/vue-cli-plugin-hbuilderx",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "HBuilderX plugin for vue-cli 3",
"main": "index.js",
"repository": {
......
{
"name": "@dcloudio/vue-cli-plugin-uni-optimize",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app optimize plugin for vue-cli 3",
"main": "index.js",
"repository": {
......
{
"name": "@dcloudio/vue-cli-plugin-uni",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app plugin for vue-cli 3",
"main": "index.js",
"repository": {
......@@ -17,7 +17,7 @@
"author": "fxy060608",
"license": "Apache-2.0",
"dependencies": {
"@dcloudio/uni-stat": "^2.0.0-alpha-31920210707001",
"@dcloudio/uni-stat": "^2.0.0-31920210709003",
"buffer-json": "^2.0.0",
"copy-webpack-plugin": "^5.1.1",
"cross-env": "^5.2.0",
......
{
"name": "@dcloudio/webpack-uni-mp-loader",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "webpack-uni-mp-loader",
"main": "index.js",
"repository": {
......
{
"name": "@dcloudio/webpack-uni-pages-loader",
"version": "2.0.0-alpha-31920210707001",
"version": "2.0.0-31920210709003",
"description": "uni-app pages.json loader",
"main": "lib/index.js",
"repository": {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册