diff --git a/docs/.vuepress/config/siderbar/index.js b/docs/.vuepress/config/siderbar/index.js index 33937983491627b47a776e0318578e161a3dab84..66d0c1b4287b56f40c52b62ab27b1ae59518558e 100644 --- a/docs/.vuepress/config/siderbar/index.js +++ b/docs/.vuepress/config/siderbar/index.js @@ -2,7 +2,7 @@ import uniapp from './uni-app'; import uniCloud from './uniCloud'; export default { - "uni-app": uniapp, - uniCloud, + "/": uniapp, + '/uniCloud/': uniCloud, weChatOfficialAccountImg: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/78a8e7b0-4f2d-11eb-8ff1-d5dcf8779628.jpg' } diff --git a/docs/.vuepress/config/siderbar/uni-app.js b/docs/.vuepress/config/siderbar/uni-app.js index 4b25f94447d8393c17e2e6d5c479fc7c258c08fb..634613a58e9e85051e869b8b4e4fa7b9a136d209 100644 --- a/docs/.vuepress/config/siderbar/uni-app.js +++ b/docs/.vuepress/config/siderbar/uni-app.js @@ -75,6 +75,11 @@ export default { "state": 1, "prefix": "群9" }, + { + "number": "959059626", + "state": 1, + "prefix": "群10" + }, { "number": "296811328", "state": 1, @@ -120,11 +125,6 @@ export default { "state": 1, "prefix": "群19" }, - { - "number": "165796402", - "state": 1, - "prefix": "群20" - }, { "number": "717019120", "state": 1, @@ -201,10 +201,10 @@ export default { "prefix": "群35" }, { - "number": "959059626", + "number": "165796402", "state": 0, - "prefix": "群10" + "prefix": "群20" } ], - joinQQGroupHref: 'https://qm.qq.com/cgi-bin/qm/qr?k=Gsc_5TDAO-SlE9ozv0XzG-J8yvVbtuy-&jump_from=webapi&authKey=FgzOD4eibK/nPH7vLYZBNnE42dABX+2Wt75xiTvi2UNH8pepvphpIhDiBWZt7DpA' + joinQQGroupHref: 'https://qm.qq.com/cgi-bin/qm/qr?k=H-U40nzIXq_F6NAWUOXBjvynZi2DsdOw&jump_from=webapi&authKey=oPGPBZDJhx60tm34ShKL4TNkH1zAfM1q+OXn6Tm9cN9nauPNUpfG8OMN0LJYdASG' } diff --git a/docs/api/plugins/login.md b/docs/api/plugins/login.md index 2af5798f370544006286b42ec20344c1e275a1a5..1fe03a42cd0fd210af399a4ba6b9c3f3ca7e6a98 100644 --- a/docs/api/plugins/login.md +++ b/docs/api/plugins/login.md @@ -122,6 +122,8 @@ uni.login({ ### uni.getUserInfo(OBJECT) +> 微信小程序端用户头像昵称获取规则已调整,参考 [用户信息接口调整说明](https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801)、[小程序用户头像昵称获取规则调整公告](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01) + 获取用户信息。 **平台差异说明** @@ -154,7 +156,7 @@ uni.login({ |zh_TW|繁体中文| |en|英文| -**注意:**在小程序 withCredentials 为 true 时或是在 App 调用 uni.getUserInfo,要求此前有调用过 uni.login 且登录态尚未过期。微信基础库2.10.4版本对用户信息相关接口进行了调整,使用 uni.getUserInfo 获取得到的 userInfo 为匿名数据,建议使用 uni.getUserProfile 获取用户信息。 +**注意:** 在小程序 withCredentials 为 true 时或是在 App 调用 uni.getUserInfo,要求此前有调用过 uni.login 且登录态尚未过期。微信基础库2.10.4版本对用户信息相关接口进行了调整,使用 uni.getUserInfo 获取得到的 userInfo 为匿名数据,建议使用 uni.getUserProfile 获取用户信息。 **success 返回参数说明** @@ -221,6 +223,8 @@ uni.login({ ### uni.getUserProfile(OBJECT) +> 微信小程序端基础库2.27.1及以上版本,**[wx.getUserProfile 接口](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html)被收回**,详见[《小程序用户头像昵称获取规则调整公告》](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01)。 + 获取用户信息。每次请求都会弹出授权窗口,用户同意后返回 userInfo。 **平台差异说明** @@ -231,7 +235,8 @@ uni.login({ **注意:** -该API仅支持微信小程序端,微信小程序调整了相关接口(详见[《小程序登录、用户信息相关接口调整说明》](https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801?highLine=getUserProfile%253Afail))。每次触发 uni.getUserProfile 均会弹出授权窗口,用户授权后可成功获取用户信息。该API暂不支持在事件中使用异步操作,否则会触发错误:{errMsg: "getUserProfile:fail can only be invoked by user TAP gesture."} +- 如业务需获取用户头像昵称,可以使用[「头像昵称填写能力」](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html)(基础库 2.21.2 版本开始支持,覆盖iOS与安卓微信 8.0.16 以上版本)。 +- 该API仅支持微信小程序端(基础库2.10.4-2.27.0版本),微信小程序调整了相关接口(详见[《小程序登录、用户信息相关接口调整说明》](https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801?highLine=getUserProfile%253Afail))。每次触发 uni.getUserProfile 均会弹出授权窗口,用户授权后可成功获取用户信息。该API暂不支持在事件中使用异步操作,否则会触发错误:{errMsg: "getUserProfile:fail can only be invoked by user TAP gesture."} 抖音从基础库 2.30.0 开始支持本方法,低版本需做兼容处理。[详见](https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-profile/) @@ -253,7 +258,7 @@ uni.login({ |zh_TW|繁体中文| |en|英文| -**注意:**可以使用 `if(uni.getUserProfile)` 判断uni.getUserProfile是否可用。 +**注意:** 可以使用 `if(uni.getUserProfile)` 判断uni.getUserProfile是否可用。 **success 返回参数说明** diff --git a/docs/api/request/request.md b/docs/api/request/request.md index 7c2c132fe163c5180f156b48a4cb203220ff32de..14a95fbc68a3724faf28ddb85f9e3c8c512aa9ea 100644 --- a/docs/api/request/request.md +++ b/docs/api/request/request.md @@ -1,187 +1,187 @@ -### uni.request(OBJECT) -发起网络请求。 - -> 在各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。 - -**OBJECT 参数说明** - -|参数名|类型|必填|默认值|说明|平台差异说明| -|:-|:-|:-|:-|:-|:-| -|url|String|是||开发者服务器接口地址|| -|data|Object/String/ArrayBuffer|否||请求的参数|App 3.3.7 以下不支持 ArrayBuffer 类型| -|header|Object|否||设置请求的 header,header 中不能设置 Referer。|App、H5端会自动带上cookie,且H5端不可手动修改| -|method|String|否|GET|有效值详见下方说明|| -|timeout|Number|否|60000|超时时间,单位 ms|H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序| -|dataType|String|否|json |如果设为 json,会尝试对返回的数据做一次 JSON.parse|| -|responseType|String|否|text |设置响应的数据类型。合法值:text、arraybuffer|支付宝小程序不支持| -|sslVerify|Boolean|否|true|验证 ssl 证书|仅App安卓端支持(HBuilderX 2.3.3+),不支持离线打包| -|withCredentials|Boolean|否|false|跨域请求时是否携带凭证(cookies)|仅H5支持(HBuilderX 2.6.15+)| -|firstIpv4|Boolean|否|false|DNS解析时优先使用ipv4|仅 App-Android 支持 (HBuilderX 2.8.0+)| -|success|Function|否||收到开发者服务器成功返回的回调函数|| -|fail|Function|否||接口调用失败的回调函数|| -|complete|Function|否||接口调用结束的回调函数(调用成功、失败都会执行)| | - -**method 有效值** - -注意:method有效值必须大写,每个平台支持的method有效值不同,详细见下表。 - -|method|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序、飞书小程序|快手小程序|京东小程序| -|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| -|GET|√|√|√|√|√|√|√|√| -|POST|√|√|√|√|√|√|√|√| -|PUT|√|√|√|x|√|√|x|x| -|DELETE|√|√|√|x|√|x|x|x| -|CONNECT|x|√|√|x|x|x|x|x| -|HEAD|x|√|√|x|√|x|x|x| -|OPTIONS|√|√|√|x|√|x|x|x| -|TRACE|x|√|√|x|x|x|x|x| - -**success 返回参数说明** - -|参数|类型|说明| -|:-|:-|:-| -|data|Object/String/ArrayBuffer|开发者服务器返回的数据| -|statusCode|Number|开发者服务器返回的 HTTP 状态码| -|header|Object|开发者服务器返回的 HTTP Response Header| -|cookies|``Array.``|开发者服务器返回的 cookies,格式为字符串数组| - -**data 数据说明** - -最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String。转换规则如下: - -- 对于 ``GET`` 方法,会将数据转换为 query string。例如 ``{ name: 'name', age: 18 }`` 转换后的结果是 ``name=name&age=18``。 -- 对于 ``POST`` 方法且 ``header['content-type']`` 为 ``application/json`` 的数据,会进行 JSON 序列化。 -- 对于 ``POST`` 方法且 ``header['content-type']`` 为 ``application/x-www-form-urlencoded`` 的数据,会将数据转换为 query string。 - -**示例** - -```javascript -uni.request({ - url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。 - data: { - text: 'uni.request' - }, - header: { - 'custom-header': 'hello' //自定义请求头信息 - }, - success: (res) => { - console.log(res.data); - this.text = 'request success'; - } -}); -``` - -**返回值** - -如果希望返回一个 `requestTask` 对象,需要至少传入 success / fail / complete 参数中的一个。例如: - -```javascript -var requestTask = uni.request({ - url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。 - complete: ()=> {} -}); -requestTask.abort(); -``` - -如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象:[Promise 封装](/api/README?id=promise-%E5%B0%81%E8%A3%85) - -通过 `requestTask`,可中断请求任务。 - -**requestTask 对象的方法列表** - -|方法|参数|说明| -|:-|:-|:-| -|abort||中断请求任务| -|offHeadersReceived||取消监听 HTTP Response Header 事件,仅`微信小程序平台`支持,[文档详情](https://developers.weixin.qq.com/miniprogram/dev/api/RequestTask.offHeadersReceived.html)| -|onHeadersReceived||监听 HTTP Response Header 事件。会比请求完成事件更早,仅`微信小程序平台`支持,[文档详情](https://developers.weixin.qq.com/miniprogram/dev/api/RequestTask.onHeadersReceived.html)| - -**示例** - -```javascript -const requestTask = uni.request({ - url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。 - data: { - name: 'name', - age: 18 - }, - success: function(res) { - console.log(res.data); - } -}); - -// 中断请求任务 -requestTask.abort(); -``` - -**Tips** - -- 请求的 ``header`` 中 ``content-type`` 默认为 ``application/json``。 -- 避免在 ``header`` 中使用中文,或者使用 encodeURIComponent 进行编码,否则在百度小程序报错。(来自:[快狗打车前端团队](https://juejin.im/user/2612095359650712)) -- 网络请求的 ``超时时间`` 可以统一在 ``manifest.json`` 中配置 [networkTimeout](/collocation/manifest?id=networktimeout)。 -- H5 端本地调试需注意跨域问题,参考:[调试跨域问题解决方案](https://ask.dcloud.net.cn/article/35267) -- 注意由于百度小程序iOS客户端,请求失败时会进入fail回调,需要针对百度增加相应的处理以解决该问题。 -- 注意小程序端不支持自动保持 cookie,服务器应避免验证 cookie。如果服务器无法修改,也可以使用一些模拟手段,比如这样的工具[https://github.com/charleslo1/weapp-cookie](https://github.com/charleslo1/weapp-cookie) 可以请求时带上 cookie 并将响应的 cookie 保存在本地。 -- H5端 cookie 受跨域限制(和平时开发网站时一样),旧版的 uni.request 未支持 withCredentials 配置,可以直接使用 xhr 对象或者其他类库。 -- 根据 W3C 规范,H5 端无法获取 response header 中 Set-Cookie、Set-Cookie2 这2个字段,对于跨域请求,允许获取的 response header 字段只限于“simple response header”和“Access-Control-Expose-Headers”([详情](https://www.w3.org/TR/cors/#access-control-allow-credentials-response-header)) -- [uni-app 插件市场](https://ext.dcloud.net.cn/search?q=%E6%8B%A6%E6%88%AA%E5%99%A8)有flyio、axios等三方封装的拦截器可用 -- 低版本手机自身不支持 ipv6,如果服务器仅允许 ipv6,会导致老手机无法正常运行或访问速度非常慢 -- localhost、127.0.0.1等服务器地址,只能在电脑端运行,手机端连接时不能访问。请使用标准IP并保证手机能连接电脑网络 -- debug 模式,安卓端暂时无法获取响应头,url中含有非法字符(如未编码为%20的空格)时会请求失败 -- iOS App第一次安装启动后,会弹出是否允许联网的询问框,在用户点击同意前,调用联网API会失败。请注意判断这种情况。比如官方提供的新闻模板示例(HBuilderX新建项目可选择),会判断如果无法联网,则提供一个错误页,提示用户设置网络及下拉刷新重试。 -- 良好体验的App,还会判断当前是否处于飞行模式([参考](https://ext.dcloud.net.cn/plugin?id=594))、是wifi还是3G([参考](https://uniapp.dcloud.io/api/system/network)) -- 部分安卓设备,真机运行或debug模式下的网速,低于release模式很多。 -- 使用一些比较小众的证书机构(如:CFCA OV OCA)签发的 ssl 证书在安卓设备请求会失败,因为这些机构的根证书不在系统内置根证书库,可以更换其他常见机构签发的证书(如:Let's Encrypt),或者配置 sslVerify 为 false 关闭 ssl 证书验证(不推荐)。 -- 离线打包不支持 `sslVerify` 配置 -- 单次网络请求数据量建议控制在50K以下(仅指json数据,不含图片),过多数据应分页获取,以提升应用体验。 - - -### uni.configMTLS(OBJECT) - -https 请求配置自签名证书 - -|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序、飞书小程序|QQ小程序|快手小程序|京东小程序| -|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| -|√`(3.2.7+)`|x|x|x|x|x|x|x|x| - -**OBJECT 参数说明** - -|参数|类型|必填|说明| -|:--|:--|:--|:--| -|certificates|Array<`certificate`>|是| `certificates` 为数组,支持为多个域名配置自签名证书| -|success|Function(`callbackObject`)|否|接口调用成功的回调函数| -|fail|Function(`callbackObject`)|否|接口调用失败的回调函数| -|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)| - -**certificate 参数说明** -证书配置项 - -|参数|类型|必填|说明| -|:--|:--|:--|:--| -| host | String |是| 对应请求的域名(注意:不要协议部分) | -| client | String |否| 客户端证书(服务器端需要验证客户端证书时需要配置此项,格式要求请参考下面的证书格式说明,注意 `iOS` 平台客户端证书只支持 `.p12` 类型的证书)| -| clientPassword | String |否| 客户端证书对应的密码(客户端证书存在时必须配置此项)| -| server |Array<String>|否| 服务器端证书(客户端需要对服务器端证书做校验时需要配置此项,格式要求请参考下面的证书格式说明,注意 `iOS` 平台服务器端证书只支持 `.cer` 类型的证书)| - -**证书格式说明** - 1. 文件路径形式:可将证书文件放到工程的 ‘static’ 目录中,然后填写文件路径,示例:`'/static/client.p12'` - 2. `Base64String`:将证书文件的二进制转换为 `Base64String` 字符串,然后在字符串前面添加`'data:cert/pem;base64,'`前缀,示例:`'data:cert/pem;base64,xxx'` xxx 代表真实的证书 base64String - -**callbackObject 参数说明** - -|属性|类型 |说明| -|:--|:--|:--| -|code|Number| 成功返回 0,失败返回相应 code 码| - -**示例** -```js -uni.configMTLS({ - certificates: [{ - 'host': 'www.test.com', - 'client': '/static/client.p12', - 'clientPassword': '123456789', - 'server': ['/static/server.cer'], - }], - success ({code}) {} -}); -``` - +### uni.request(OBJECT) +发起网络请求。 + +> 在各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。 + +**OBJECT 参数说明** + +|参数名|类型|必填|默认值|说明|平台差异说明| +|:-|:-|:-|:-|:-|:-| +|url|String|是||开发者服务器接口地址|| +|data|Object/String/ArrayBuffer|否||请求的参数|App 3.3.7 以下不支持 ArrayBuffer 类型| +|header|Object|否||设置请求的 header,header 中不能设置 Referer。|App、H5端会自动带上cookie,且H5端不可手动修改| +|method|String|否|GET|有效值详见下方说明|| +|timeout|Number|否|60000|超时时间,单位 ms|H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序| +|dataType|String|否|json |如果设为 json,会尝试对返回的数据做一次 JSON.parse|| +|responseType|String|否|text |设置响应的数据类型。合法值:text、arraybuffer|支付宝小程序不支持| +|sslVerify|Boolean|否|true|验证 ssl 证书|仅App安卓端支持(HBuilderX 2.3.3+),不支持离线打包| +|withCredentials|Boolean|否|false|跨域请求时是否携带凭证(cookies)|仅H5支持(HBuilderX 2.6.15+)| +|firstIpv4|Boolean|否|false|DNS解析时优先使用ipv4|仅 App-Android 支持 (HBuilderX 2.8.0+)| +|success|Function|否||收到开发者服务器成功返回的回调函数|| +|fail|Function|否||接口调用失败的回调函数|| +|complete|Function|否||接口调用结束的回调函数(调用成功、失败都会执行)| | + +**method 有效值** + +注意:method有效值必须大写,每个平台支持的method有效值不同,详细见下表。 + +|method|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序、飞书小程序|快手小程序|京东小程序| +|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +|GET|√|√|√|√|√|√|√|√| +|POST|√|√|√|√|√|√|√|√| +|PUT|√|√|√|x|√|√|x|x| +|DELETE|√|√|√|x|√|x|x|x| +|CONNECT|x|√|√|x|x|x|x|x| +|HEAD|√|√|√|x|√|x|x|x| +|OPTIONS|√|√|√|x|√|x|x|x| +|TRACE|x|√|√|x|x|x|x|x| + +**success 返回参数说明** + +|参数|类型|说明| +|:-|:-|:-| +|data|Object/String/ArrayBuffer|开发者服务器返回的数据| +|statusCode|Number|开发者服务器返回的 HTTP 状态码| +|header|Object|开发者服务器返回的 HTTP Response Header| +|cookies|``Array.``|开发者服务器返回的 cookies,格式为字符串数组| + +**data 数据说明** + +最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String。转换规则如下: + +- 对于 ``GET`` 方法,会将数据转换为 query string。例如 ``{ name: 'name', age: 18 }`` 转换后的结果是 ``name=name&age=18``。 +- 对于 ``POST`` 方法且 ``header['content-type']`` 为 ``application/json`` 的数据,会进行 JSON 序列化。 +- 对于 ``POST`` 方法且 ``header['content-type']`` 为 ``application/x-www-form-urlencoded`` 的数据,会将数据转换为 query string。 + +**示例** + +```javascript +uni.request({ + url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。 + data: { + text: 'uni.request' + }, + header: { + 'custom-header': 'hello' //自定义请求头信息 + }, + success: (res) => { + console.log(res.data); + this.text = 'request success'; + } +}); +``` + +**返回值** + +如果希望返回一个 `requestTask` 对象,需要至少传入 success / fail / complete 参数中的一个。例如: + +```javascript +var requestTask = uni.request({ + url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。 + complete: ()=> {} +}); +requestTask.abort(); +``` + +如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象:[Promise 封装](/api/README?id=promise-%E5%B0%81%E8%A3%85) + +通过 `requestTask`,可中断请求任务。 + +**requestTask 对象的方法列表** + +|方法|参数|说明| +|:-|:-|:-| +|abort||中断请求任务| +|offHeadersReceived||取消监听 HTTP Response Header 事件,仅`微信小程序平台`支持,[文档详情](https://developers.weixin.qq.com/miniprogram/dev/api/RequestTask.offHeadersReceived.html)| +|onHeadersReceived||监听 HTTP Response Header 事件。会比请求完成事件更早,仅`微信小程序平台`支持,[文档详情](https://developers.weixin.qq.com/miniprogram/dev/api/RequestTask.onHeadersReceived.html)| + +**示例** + +```javascript +const requestTask = uni.request({ + url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。 + data: { + name: 'name', + age: 18 + }, + success: function(res) { + console.log(res.data); + } +}); + +// 中断请求任务 +requestTask.abort(); +``` + +**Tips** + +- 请求的 ``header`` 中 ``content-type`` 默认为 ``application/json``。 +- 避免在 ``header`` 中使用中文,或者使用 encodeURIComponent 进行编码,否则在百度小程序报错。(来自:[快狗打车前端团队](https://juejin.im/user/2612095359650712)) +- 网络请求的 ``超时时间`` 可以统一在 ``manifest.json`` 中配置 [networkTimeout](/collocation/manifest?id=networktimeout)。 +- H5 端本地调试需注意跨域问题,参考:[调试跨域问题解决方案](https://ask.dcloud.net.cn/article/35267) +- 注意由于百度小程序iOS客户端,请求失败时会进入fail回调,需要针对百度增加相应的处理以解决该问题。 +- 注意小程序端不支持自动保持 cookie,服务器应避免验证 cookie。如果服务器无法修改,也可以使用一些模拟手段,比如这样的工具[https://github.com/charleslo1/weapp-cookie](https://github.com/charleslo1/weapp-cookie) 可以请求时带上 cookie 并将响应的 cookie 保存在本地。 +- H5端 cookie 受跨域限制(和平时开发网站时一样),旧版的 uni.request 未支持 withCredentials 配置,可以直接使用 xhr 对象或者其他类库。 +- 根据 W3C 规范,H5 端无法获取 response header 中 Set-Cookie、Set-Cookie2 这2个字段,对于跨域请求,允许获取的 response header 字段只限于“simple response header”和“Access-Control-Expose-Headers”([详情](https://www.w3.org/TR/cors/#access-control-allow-credentials-response-header)) +- [uni-app 插件市场](https://ext.dcloud.net.cn/search?q=%E6%8B%A6%E6%88%AA%E5%99%A8)有flyio、axios等三方封装的拦截器可用 +- 低版本手机自身不支持 ipv6,如果服务器仅允许 ipv6,会导致老手机无法正常运行或访问速度非常慢 +- localhost、127.0.0.1等服务器地址,只能在电脑端运行,手机端连接时不能访问。请使用标准IP并保证手机能连接电脑网络 +- debug 模式,安卓端暂时无法获取响应头,url中含有非法字符(如未编码为%20的空格)时会请求失败 +- iOS App第一次安装启动后,会弹出是否允许联网的询问框,在用户点击同意前,调用联网API会失败。请注意判断这种情况。比如官方提供的新闻模板示例(HBuilderX新建项目可选择),会判断如果无法联网,则提供一个错误页,提示用户设置网络及下拉刷新重试。 +- 良好体验的App,还会判断当前是否处于飞行模式([参考](https://ext.dcloud.net.cn/plugin?id=594))、是wifi还是3G([参考](https://uniapp.dcloud.io/api/system/network)) +- 部分安卓设备,真机运行或debug模式下的网速,低于release模式很多。 +- 使用一些比较小众的证书机构(如:CFCA OV OCA)签发的 ssl 证书在安卓设备请求会失败,因为这些机构的根证书不在系统内置根证书库,可以更换其他常见机构签发的证书(如:Let's Encrypt),或者配置 sslVerify 为 false 关闭 ssl 证书验证(不推荐)。 +- 离线打包不支持 `sslVerify` 配置 +- 单次网络请求数据量建议控制在50K以下(仅指json数据,不含图片),过多数据应分页获取,以提升应用体验。 + + +### uni.configMTLS(OBJECT) + +https 请求配置自签名证书 + +|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序、飞书小程序|QQ小程序|快手小程序|京东小程序| +|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +|√`(3.2.7+)`|x|x|x|x|x|x|x|x| + +**OBJECT 参数说明** + +|参数|类型|必填|说明| +|:--|:--|:--|:--| +|certificates|Array<`certificate`>|是| `certificates` 为数组,支持为多个域名配置自签名证书| +|success|Function(`callbackObject`)|否|接口调用成功的回调函数| +|fail|Function(`callbackObject`)|否|接口调用失败的回调函数| +|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)| + +**certificate 参数说明** +证书配置项 + +|参数|类型|必填|说明| +|:--|:--|:--|:--| +| host | String |是| 对应请求的域名(注意:不要协议部分) | +| client | String |否| 客户端证书(服务器端需要验证客户端证书时需要配置此项,格式要求请参考下面的证书格式说明,注意 `iOS` 平台客户端证书只支持 `.p12` 类型的证书)| +| clientPassword | String |否| 客户端证书对应的密码(客户端证书存在时必须配置此项)| +| server |Array<String>|否| 服务器端证书(客户端需要对服务器端证书做校验时需要配置此项,格式要求请参考下面的证书格式说明,注意 `iOS` 平台服务器端证书只支持 `.cer` 类型的证书)| + +**证书格式说明** + 1. 文件路径形式:可将证书文件放到工程的 ‘static’ 目录中,然后填写文件路径,示例:`'/static/client.p12'` + 2. `Base64String`:将证书文件的二进制转换为 `Base64String` 字符串,然后在字符串前面添加`'data:cert/pem;base64,'`前缀,示例:`'data:cert/pem;base64,xxx'` xxx 代表真实的证书 base64String + +**callbackObject 参数说明** + +|属性|类型 |说明| +|:--|:--|:--| +|code|Number| 成功返回 0,失败返回相应 code 码| + +**示例** +```js +uni.configMTLS({ + certificates: [{ + 'host': 'www.test.com', + 'client': '/static/client.p12', + 'clientPassword': '123456789', + 'server': ['/static/server.cer'], + }], + success ({code}) {} +}); +``` + diff --git a/docs/api/ui/locale.md b/docs/api/ui/locale.md index 495b2ac8d3a2d89848dcba1c5f3a4c67a6149328..dab1f8fed42bd81a32194d47853740b7575ce094 100644 --- a/docs/api/ui/locale.md +++ b/docs/api/ui/locale.md @@ -56,4 +56,5 @@ * 法语 fr * 西班牙语 es * 在 [manifest.json](/collocation/manifest) -> locale 可以配置应用的默认语言。 -* 仅 3.1.5 - 3.2.4 版本会自动使用 vue-i18n 内配置的语言。 \ No newline at end of file +* 仅 3.1.5 - 3.2.4 版本会自动使用 vue-i18n 内配置的语言。 +* 在小程序平台仅影响用户业务层(vue-i18n)的语言配置,不能影响小程序原生组件和接口的语言。 \ No newline at end of file diff --git a/docs/component/ad-rewarded-video.md b/docs/component/ad-rewarded-video.md index b586f1f5d6276f5428b702def63b1b72a3da6592..b50f58b984a1053fdc83d651223375d7eb403b4d 100644 --- a/docs/component/ad-rewarded-video.md +++ b/docs/component/ad-rewarded-video.md @@ -497,7 +497,7 @@ const ProviderType = { KS: "ks" }; -const collectionName = "uni-ad-callback-log"; +const collectionName = "ad-callback-log"; // 如果选择了腾讯云,需要手动预创建表 class DB { diff --git a/docs/plugin/uts-for-android.md b/docs/plugin/uts-for-android.md index 27f37b628f1258a535747b3737afaf286163a2dc..8cde8d2971440d6d6335a3b6378d1e5ce3d38745 100644 --- a/docs/plugin/uts-for-android.md +++ b/docs/plugin/uts-for-android.md @@ -111,7 +111,7 @@ onAppActivityRequestPermissionsResult((requestCode: number,permissions: MutableL + 1 本章节内的实例代码均取自Hello UTS [项目地址](https://gitcode.net/dcloud/hello-uts) + 2 本章节设计的配置,均需自定义基座后才能生效 -+ 3 截止到HX 3.6.8,还不支持R文件的自动生成,因此本章节中涉及R文件生成部分暂时还不支持。这是个遗留问题,稍后版本会支持。 ++ 3 R文件的自动生成,已经在HBuilder X 3.6.9 版本支持,请使用最新版本开发 ### 3.1 配置AndroidManifest.xml @@ -778,7 +778,7 @@ uts中,需要区分全局方法、成员方法 |语法|kotlin|uts| |---|-------|---| |继承类|:|extends| -|实现接口|:|extends| +|实现type接口|:|extends| ```kotlin @@ -888,8 +888,9 @@ getUniActivity()!.startActivity(intent); 某些场景下开发者需要获得 指定double数据类型的数据 -前端常用的写法: +开发者下意识的写法可能是: ``` +// 这样是错误的 let a:Int =3 let b:Int =4 let c:Double = a/b @@ -898,6 +899,7 @@ let c:Double = a/b 但是Android原生环境中,数据类型的精度是向下兼容的,如果想要获得一个double类型,必须要有一个double类型参与运算: ``` +// 这样才是正确的 let a:Int =3 let b:Int =4 let c:Double = a * 1.0 / b diff --git a/docs/plugin/uts-plugin.md b/docs/plugin/uts-plugin.md index 4661df2a3f688a17462aabf405157a98bf220851..6d53dc7695238f39d507649da54fed9541d50a4e 100644 --- a/docs/plugin/uts-plugin.md +++ b/docs/plugin/uts-plugin.md @@ -124,19 +124,19 @@ package.json 为 uni_modules 插件配置清单文件,负责描述插件的基 │ │ ├─res //Android原生res资源目录,可选 │ │ ├─AndroidManifest.xml //Android原生应用清单文件,可选 │ │ ├─config.json //Android原生配置文件 -│ │ └─index.uts -│ ├─app-ios //iOS 平台目录 -│ │ ├─Frameworks //iOS 插件依赖的第三方 framework 依赖库存放目录,可选 -│ │ ├─Resources //iOS 插件所依赖的资源文件存放目录,可选 -│ │ ├─info.plist //iOS 插件所需要添加到主 info.plist 文件中的配置文件,可选 -│ │ ├─config.json //iOS 插件配置文件 -│ │ └─index.uts +│ │ └─index.uts //Android原生插件能力实现 +│ ├─app-ios //iOS平台目录 +│ │ ├─Frameworks //iOS原生依赖的第三方 framework 依赖库存放目录,可选 +│ │ ├─Resources //iOS原生所依赖的资源文件存放目录,可选 +│ │ ├─info.plist //iOS原生所需要添加到主 info.plist 文件中的配置文件,可选 +│ │ ├─config.json //iOS原生配置文件 +│ │ └─index.uts //iOS原生插件能力实现 │ ├─web //web平台目录 │ │ └─index.uts -│ └─mp-xxx // 其他平台目录 -├─package.json // 插件清单文件 -├─index.d.ts // 插件能力声明,可选 -└─index.uts // 插件能力实现 +│ ├─mp-xxx // 其他平台目录 +│ ├─index.d.ts // 插件能力声明,可选 +│ └─index.uts // 跨平台插件能力实现,可选 +└─package.json // 插件清单文件 @@ -453,6 +453,22 @@ import * as UTSHello from "../../../uni_modules/uts-osapi"; UTSHello.getBatteryCapacity() ``` +**特别注意** + +需要特别注意的是,import UTS插件时,只能到插件的根目录,不能直接引入到最终的文件 + +``` +// 正确的写法 +import * as UTSHello from "../../../uni_modules/uts-osapi"; + +``` +``` +// 错误的写法 +import * as UTSHello from "../../../uni_modules/uts-osapi/index.uts"; + +``` + + **显性引用** @@ -468,6 +484,8 @@ import { getBatteryCapacity() ``` + + 关于电量这个插件,插件市场已经提供好了现成的插件,除了Android,还同时支持了web和小程序,可以去下载体验。[详见](https://ext.dcloud.net.cn/plugin?id=9295) 更多开发示例,可以参考 [HelloUTS](https://gitcode.net/dcloud/hello-uts)。 diff --git a/docs/release.md b/docs/release.md index 701af26f5453aa952273140ba7ae4349c3d2ebf4..2a32e5dff8828ebabae5a7a60e1dca0f6cfeecb0 100755 --- a/docs/release.md +++ b/docs/release.md @@ -1,3 +1,13 @@ +#### 3.6.5.20221121 +* 【uni-app】 + + 修复 Vue2 项目中 TypeScript 使用 onLoad 等生命周期报错的Bug [详情](https://ask.dcloud.net.cn/question/157035) + + App-Android平台 修复 uni.getStorageSync 在某些情况下可能报`SyntaxError`错误的Bug [详情](https://ask.dcloud.net.cn/question/154284) + + 百度小程序平台 修复 onInit 生命周期不触发的Bug [详情](https://ask.dcloud.net.cn/question/154352) + + 支付宝小程序平台 修复 uni.showToast 不支持 duration 参数的Bug [详情](https://ask.dcloud.net.cn/question/147279) + + 支付宝小程序平台 修复 uni.showLoading 提示 mask 参数无效的Bug [详情](https://ask.dcloud.net.cn/question/156944) +* 【uniCloud】 + + 【重要】阿里云商用版正式上线 [详情](https://ask.dcloud.net.cn/article/40144) + #### 3.6.4.20220922 * 【uni-app】 + 修复 uni-app App调试插件 运行空白的Bug diff --git a/docs/tutorial/app-privacy-android.md b/docs/tutorial/app-privacy-android.md index c2073c6648aafc7fc933dfa0008ffd8aa6d2b271..449436b0c47937916cafaf34e731d82f7845847b 100644 --- a/docs/tutorial/app-privacy-android.md +++ b/docs/tutorial/app-privacy-android.md @@ -66,7 +66,8 @@ "disagreeMode":{ "support": false, "loadNativePlugins": false, - "visitorEntry": true + "visitorEntry": true, + "showAlways": true }, "styles": { "backgroundColor": "#00FF00", @@ -106,8 +107,8 @@ 用户不同意隐私协议的响应配置 + support 用户拒绝隐私协议后,是否直接进入游客模式,默认关闭 + loadNativePlugins 游客模式下,是否加载原生插件 - + visitorEntry HX 3.6.7 版本后支持,默认false,当设置为true,隐私协议弹窗 会出现 游客模式 按钮 - + + visitorEntry HBuilderX 3.6.7 版本后支持,默认false,当设置为true,隐私协议弹窗 会出现 游客模式 按钮 + + showAlways HBuilderX 3.6.10 版本后支持,默认true 标记用户拒绝协议后,下次启动是否继续弹出 - second 配置二次确认提示框显示内容,message属性值不为空时弹出二次确认提示框 + title 二次确认提示框上的标题 diff --git a/docs/tutorial/syntax-uts.md b/docs/tutorial/syntax-uts.md index 6a977499eec1813c3bf283c687ad873c31447099..9d5cf72b7e5ed198c38fe50c5e75b1384e720ed6 100644 --- a/docs/tutorial/syntax-uts.md +++ b/docs/tutorial/syntax-uts.md @@ -21,48 +21,72 @@ uts 采用了与 ts 基本一致的语法规范,支持绝大部分 ES6 API。 ## 基本语法 ### 声明 -uts 有两种声明方式 +js是无类型的,TypeScript 的 type 就是类型的意思,给js加上了类型。它的类型定义方式是在变量名后面通过加冒号和类型来进行定义。 -1. let +uts 中声明变量可以用 let 或 const,详见下。 + +#### 变量定义(let) 声明一个可重新赋值的变量。语法 `let [变量名] : [类型] = 值;`。 > 相当于 TypeScript 中的 let,kotlin 中的 var ```ts -let str = "hello"; // 声明一个字符串变量 +let str :string = "hello"; // 声明一个字符串变量 str = "hello world"; // 重新赋值 ``` -2. const +类型除了 string 之外,更多类型[见下](#基本类型) + +#### 常量定义(const) 声明一个只读常量,只能为其赋值一次。语法 `const [变量名] : [类型] = 值;`。 > 相当于 TypeScript 中的 const, kotlin 中的 val ```ts -const str = "hello"; // 声明一个字符串变量 +const str :string = "hello"; // 声明一个字符串变量 str = "hello world"; // 报错,不允许重新赋值 ``` 注意事项: -1. 当前 uts 并未限制使用 var 来声明变量,但当使用 var 来声明变量时需要注意不同平台差异 -- 编译至 JavaScript 平台时,等同于 JavaScript 平台的 var (存在变量提升现象) -- 编译至 Kotlin 平台时,等同于 Kotlin 平台的 var(允许重新赋值) +- 当前 uts 并未限制使用 var 来声明变量,但当使用 var 来声明变量时需要注意不同平台差异 + * 编译至 JavaScript 平台时,等同于 JavaScript 平台的 var (存在变量提升现象) + * 编译至 Kotlin 平台时,等同于 Kotlin 平台的 var(允许重新赋值) +- 类型定义的冒号,左右可以有一个空格,也可以没有空格。`let str:string` 和 `let str : string` 和 `let str :string` 和 `let str: string` 都是合法的。 -### 变量 +#### 变量命名规则 在 uts 中,使用变量名需要遵守一定的规则。 - 变量名称可以包含数字和字母。 - - 除了下划线 \_ 外,不能包含其他特殊字符,包括空格。 - - 变量名不能以数字开头。 > 注意:与 TypeScript 不同的是,uts 不允许以 $ 开头命名变量 +#### 类型自动推导 + +uts具备类型自动推导。在定义变量时如果直接赋值,而不使用冒号定义类型,也可以合法运行。 + +如下2种写法都是合法的,两个变量都是string类型: + +```ts +let s1 :string = "hello"; +let s2 = "hello"; +``` + +#### any类型 + +如果定义变量时没有声明类型,也没有赋值。那么这个变量会被视为any类型。虽然可以使用,但uts中非常不建议这样使用。 + +```ts +let s; +s = "123" +console.log(s) // hello world +``` + ### 操作符 #### 赋值运算符(Assignment operators) @@ -141,27 +165,55 @@ console.log("my " + "string"); // console logs the string "my string". const status = age >= 18 ? "adult" : "minor"; ``` -## 基本类型 +### 代码语句的分割 + +uts的多个代码语句,可以以回车或分号分割。行尾的分号可以省略。如果写在一行,应以分号分割。 + +如下的代码都是合法的: + +```ts +let a:number = 1 //行尾可以不加分号 +let b:number = 2; +let c:number = 3 ; let d:number = 4 // 同行需要用分号分割 +``` + +## 数据类型 ### 布尔值(Boolean) -有 2 个值分别是:true 和 false。 +有 2 个值分别是:`true` 和 `false`。 ### 数字(Number) -整数或浮点数,例如: 42 或者 3.14159。 +整数或浮点数,例如: `42` 或者 `3.14159` 或者 `-1` 。 ### 字符串(String) -字符串是一串表示文本值的字符序列,例如:"hello" 。 +字符串是一串表示文本值的字符序列,例如:`"hello world"`。 + +### 日期(Date) + +日期对象表示日期,包括年月日时分秒等各种日期。详[见下](#Date) + + ### null 一个表明 null 值的特殊关键字。 +### Object类型 + +对象(object)是指内存中的可以被标识符引用的一块区域,是一种引用类型。包括Array,Date,Map,Set,JSON等,uts 有一个内置对象的标准库。详[见下](#内置对象和api)。 + +### any类型 + +未定义类型,即任意类型。一般不推荐使用。 + ## 字面量 -字面量是由语法表达式定义的常量;或,通过由一定字词组成的语词表达式定义的常量 +字面量是由语法表达式定义的常量;或,通过由一定字词组成的语词表达式定义的常量。 在 uts 中,你可以使用各种字面量。这些字面量是按字面意思给出的固定的值,而不是变量 @@ -173,9 +225,6 @@ const status = age >= 18 ? "adult" : "minor"; ```ts const coffees = ["French Roast", "Colombian", "Kona"] -const a=[3] -console.log(a.length) // 1 -console.log(a[0]) // 3 ``` 数组字面值同时也是数组对象。 @@ -513,17 +562,19 @@ try { ``` -## 函数 +## 函数(function) -函数是 uts 中的基本组件之一。 一个函数是 uts 过程 — 一组执行任务或计算值的语句。要使用一个函数,你必须将其定义在你希望调用它的作用域内。 +函数是编程语言常见的功能,它可以封装一批代码,对外接收参数,然后返回值。被封装的逻辑,可以被不同的其他代码调用,达到共同复用逻辑的目的。 -一个 uts 函数用 function 关键字定义,后面跟着函数名和圆括号。 +函数用 function 关键字定义,后面跟着函数名和圆括号。 + +同时注意,定义函数涉及作用域。 ### 定义函数 -#### 函数声明 +#### 普通函数声明 -一个函数定义(也称为函数声明,或函数语句)由一系列的 function 关键字组成,依次为: +一个函数定义(也称为函数声明,或函数语句)由一系列在 function 关键字后的内容组成,依次为: - 函数的名称。 - 函数参数列表,包围在括号中并由逗号分隔。 @@ -532,45 +583,79 @@ try { > 注意:函数必须明确标明返回值类型 -例如,以下的代码定义了一个简单的 add 函数: +例如,以下的代码定义了一个简单的函数。函数名为 add,有2个参数 x 和 y,都是 string类型,函数的返回值类型也是 string。 + +函数的内容是将入参 x 和 y 相加,赋值给变量z,然后通过 return关键字返回z。 ```ts -function add(x: string, y: string): string { - return x + y; +function add(x :string, y :string) :string { + let z : string = x + " " + y + return z; } ``` -#### 函数表达式 +#### 无返回值的函数定义(void) -虽然上面的函数声明在语法上是一个语句,但函数也可以由函数表达式创建。这样的函数可以是匿名的;它不必有一个名称。例如,函数 add 也可这样来定义: +如果这个函数不需要返回值,需要使用void关键字,同时函数内部末尾不需要return来返回内容。 + +```ts +function add(x :string, y :string) :void { + let z :string = x + " " + y + console.log(z) + // 不需要return +} +``` + +#### 函数表达式和匿名函数定义 + +虽然上面的函数声明在语法上是一个语句,但函数也可以由函数表达式创建。这样的函数可以是匿名的,它不必有一个名称。例如,函数 add 也可这样来定义: ```ts const add = function (x: string, y: string): string { - return x + y; + return x + " " + y; }; ``` -> 注意:函数表达式不支持使用函数名,比如`const add = function add(){}`是不允许的。 +注意: +- 通过表达式定义的函数必须使用return关键字返回内容。 +- 函数表达式不支持使用函数名,比如`const add = function add(){}`是不允许的。 ### 调用函数 -定义一个函数并不会自动的执行它。定义了函数仅仅是赋予函数以名称并明确函数被调用时该做些什么。调用函数才会以给定的参数真正执行这些动作。例如,一旦你定义了函数 add,你可以如下这样调用它: +定义一个函数并不会自动的执行它。定义了函数仅仅是赋予函数以名称并明确函数被调用时该做些什么。调用函数才会以给定的参数真正执行这些动作。 + +定义了函数 add 后,你可以如下这样调用它: ```ts -add("hello", "world"); +function add(x :string, y :string) :string { + let z :string = x + " " + y + return z; +} +add("hello", "world"); // 调用add函数 ``` -上述语句通过提供参数 "hello" 和 "world" 来调用函数。函数执行完它的语句会返回值 "hello world"。 +上述语句通过提供参数 "hello" 和 "world" 来调用函数。 + +虽然调用了add函数,但并没有获取到返回值。如需要获取返回值,需要再赋值: +```ts +function add(x :string, y :string) :string { + let z :string = x + " " + y + return z; +} +let s :string = add("hello", "world"); +console.log(s) // hello world +``` ### 函数作用域 在函数内定义的变量不能在函数之外的任何地方访问,因为变量仅仅在该函数的域的内部有定义。相对应的,一个函数可以访问定义在其范围内的任何变量和函数。 ```ts -const hello = "hello"; -const world = "world"; +const hello :string = "hello"; +const world :string = "world"; function add(): string { + let s1 :string = "123"; return hello + world; // 可以访问到 hello 和 world } ``` @@ -622,7 +707,7 @@ outside()(10); // 返回值为 20 而不是 10 ### 闭包 -闭包是 uts 中最强大的特性之一。uts 允许函数嵌套,并且内部函数可以访问定义在外部函数中的所有变量和函数,以及外部函数能访问的所有变量和函数。 +uts 允许函数嵌套,并且内部函数可以访问定义在外部函数中的所有变量和函数,以及外部函数能访问的所有变量和函数。 但是,外部函数却不能够访问定义在内部函数中的变量和函数。这给内部函数的变量提供了一定的安全性。 @@ -669,199 +754,192 @@ const a3 = arr.map((s): number => s.length); console.log(a3); // logs [ 8, 6, 7, 9 ] ``` -## 类 +## 类(class) + +uts 中使用关键字 class 声明类。 -uts 中使用关键字 class 声明类 +类声明由类名以及由花括号包围的类体构成。 ```ts +// 定义Person Class class Person { - /*……*/ + } ``` -类声明由类名以及由花括号包围的类体构成。 - -### 构造函数 +### 基本概念 -constructor 是一种用于创建和初始化 class 创建的对象的特殊方法。 +类是对象化的概念,有属性、方法、构造函数。 +- 属性:是一个简单的值,可以是字符串、数字、布尔或另一个class。可以用 `对象.属性名` 的访问,也可以通过 `对象.属性名=xxx` 的方式赋值。 +- 方法:是一段代码的集合,有入参、有返回值(均可选)。可以用 `对象.方法名(参数)` 的方式访问。 +- 构造函数:用于初始化实例。详[见下](#constructor) -- 语法: +下面的示例中,定义了一个 Person 的 class,它有一个属性 name,有一个构造函数 constructor(名称不可改),还有一个方法 getNameLength。 ```ts -constructor([arguments]) { ... } +// 定义Person Class +class Person { + name:string = ""; // 属性name + constructor(newname:string) { // 构造函数,参数newname + console.log("开始实例化"); + this.name = newname; + } + getNameLength():number{ // 方法getNameLength + return this.name.length + } +} ``` -- 描述: +定义了class后,需要实例化(通过new关键字)。定义一个实例后,即可使用该实例对象的属性和方法。 -在一个类中只能有一个名为 “constructor” 的特殊方法。 一个类中出现多次构造函数 (constructor)方法将会抛出一个 SyntaxError 错误。 +一个class可以被多次实例化为不同的实例,互不影响。 -在一个构造方法中可以使用 super 关键字来调用一个父类的构造方法。 +```ts +//实例化上面定义的class并调用其属性方法 +let p = new Person("tom"); // 使用 new 关键字实例化对象时,会自动触发构造函数 +console.log(p.name); // 访问p这个对象的属性name,返回值tom +console.log(p.getNameLength()); // 调用p这个对象的方法getNameLength,返回值3 -如果没有显式指定构造方法,则会添加默认的 constructor 方法。 +let p2 = new Person("jerry"); // 使用 new 关键字再实例化一个新对象 +console.log(p2.name); //jerry +console.log(p2.getNameLength()); //5 -如果不指定一个构造函数(constructor)方法, 则使用一个默认的构造函数(constructor)。 -- 示例: - -```ts -class Polygon { - constructor() { - this.name = "Polygon"; - } -} - -class Square extends Polygon { - constructor() { - super(); - } -} ``` -### 继承 +### 构造函数(constructor)@constructor -uts 允许使用继承来扩展现有的类。 +构造函数 constructor ,在创建新对象时(new的时候)会自动执行,用于初始化对象属性。 - 语法: ```ts -class ChildClass extends ParentClass { ... } +constructor([arguments]) { ... } ``` - 描述: -extends 关键字用来创建一个类的子类。 +你可以不写构造函数。如果没有显式指定构造函数,运行环境会自动添加默认的 constructor 方法。 + +在一个类中只能有一个名为 “constructor” 的特殊方法。一个类中出现多次构造函数 (constructor)方法将会抛出一个 SyntaxError 错误。 - 示例: ```ts -class Polygon {} +class Person { + name:string = ""; + constructor(newname:string) { + this.name = newname; + } +} -class Square extends Polygon {} +let person = new Person("tom"); // 使用 new 关键字创建对象时,会自动触发构造函数 +console.log(person.name); // tom ``` -#### 覆盖方法 - -uts 对于可覆盖的成员以及覆盖后的成员需要显式修饰符: - +在一个构造函数中可以使用 super 关键字来调用一个父类的构造函数。这涉及继承的概念。如不了解继承可[见下](#extends) ```ts class Polygon { - name(): string { - return "Polygon"; + constructor() { + this.name = "Polygon"; } } class Square extends Polygon { - override name(): string { - return "Square"; - } -} -``` - -Square.name 函数上必须加上 override 修饰符。如果没写,编译器会报错。 - -#### 覆盖属性 - -属性与方法的覆盖机制相同。在超类中声明然后在派生类中重新声明的属性必须以 override 开头,并且它们必须具有兼容的类型。 - -```ts - class Shape { - vertexCount: Int = 0 -} - -class Rectangle extends Shape { - override vertexCount = 4 -} -``` - -#### 调用超类实现 - -派生类中的代码可以使用 super 关键字调用其超类的函数实现: - -```ts -class Rectangle { - draw() {} -} -class FilledRectangle extends Rectangle { - override draw() { - super.draw(); + constructor() { + super(); } } - ``` ### 实例属性 -uts 中实例属性存在于类的每一个实例中。 +class 有实例属性和静态属性。uts 中实例属性存在于类的每一个实例中。 #### 声明实例属性 uts 可以在类中声明属性,默认可读,可写。 ```ts -class Address { - city: String = "beijing"; +class Person { + name:string = ""; // 声明实例属性name + city:string = "beijing" // 声明实例属性city + constructor(newname:string) { + this.name = newname; // 在构造函数中对name重新赋值 + } } -``` -使用一个实例属性,以类实例引用它即可: - -```ts -function copyAddress(address: Address): Address { - const result = new Address(); - result.city = address.city; // 访问 city 属性 - return result; -} +let person1 = new Person("tom"); // 使用 new 关键字创建对象时,会自动触发构造函数 +console.log(person1.name); //tom +console.log(person1.city); //beijing +let person2 = new Person("jerry"); // 使用 new 关键字创建对象时,会自动触发构造函数 +console.log(person2.name); //jerry +console.log(person2.city); //beijing ``` #### Getter 与 Setter -uts 支持通过 getters/setters 来截取对对象成员的访问。 它能帮助你有效的控制对对象成员的访问。 +uts 支持通过 getters/setters 来截取对对象属性的访问。它可以理解为属性的读取/写入的拦截器。 + +下面的例子中,针对 person对象提供了name的get和set的拦截,paascode不正确时无法修改name的值。 ```ts const passcode = "secret passcode"; -class Employee { - private _fullName: string = ""; - - get fullName(): string { - return this._fullName; - } - - set fullName(newName: string) { - if (passcode === "secret passcode") { - this._fullName = newName; - } else { - console.log("Error: Unauthorized update of employee!"); - } - } +class Person { + private _name: string = ""; // private是私有的,外部不能访问 + get name(): string { // 读取name会触发此拦截器 + console.log("start to get person.name"); + return this._name; + } + set name(newName: string) { // 给name赋值会触发此拦截器 + console.log("start to set person.name"); + if (passcode === "secret passcode") { // 校验是否有权修改name的值,这里的条件可以修改以方便测试 + this._name = newName; + } else { + console.log("Error: set person.name fail"); + } + } } +let p = new Person() +p.name = "tom" // 会打印"start to set person.name" +console.log(p.name); // 先打印"start to get person.name",然后打印"tom" ``` #### readonly -uts 可以使用 readonly 关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。 +uts 可以使用 readonly 关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。 ```ts -class Octopus { - readonly name: string; - readonly numberOfLegs: number = 8; - constructor (theName: string) { - this.name = theName; - } +class Person { + readonly name: string; + readonly age: number = 0; + constructor (theName: string) { + this.name = theName; + } } -let dad = new Octopus("Man with the 8 strong legs"); -dad.name = "Man with the 3-piece suit"; // 错误! name 是只读的. +let p = new Person("tom"); +console.log(p.name); +p.name = "jerry"; // 错误! name 是只读的 +p.age = 1 // 错误! age 是只读的 ``` -### 静态属性 +但 readonly 更多是一种开发环境的语法校验。在运行时,该值往往可以改变。 + +### 静态属性(static) 使用关键字 static 来将一个属性声明为静态属性。静态属性不会在实例中被调用,而只会被类本身调用。 ```ts -class ClassWithStaticField { - static staticField = "static field"; +class Person { + static age:number = 10; // age是静态属性。不能在实例p中访问,但可以通过类Person访问 + getAge():number{ + return Person.age + } } - -console.log(ClassWithStaticField.staticField); +console.log(Person.age); //10 +let p = new Person(); //新建一个实例 +console.log(p.age); //undefined +console.log(p.getAge()); //10 ``` ### 实例方法 @@ -872,6 +950,8 @@ uts 中实例方法存在于类的每一个实例中。 uts 可以在类中声明实例方法。 +下面定义一个通过高度乘以宽度计算面积的类。 + ```ts class Rectangle { private height:number; @@ -890,10 +970,10 @@ class Rectangle { ```ts const square = new Rectangle(10, 10); -square.calcArea(); +square.calcArea(); // 100 ``` -### 静态方法 +### 静态方法(static) 使用关键字 static 来将一个方法声明为静态方法。静态方法不会在实例中被调用,而只会被类本身调用。它们经常是工具函数,比如用来创建或者复制对象。 @@ -903,10 +983,104 @@ class ClassWithStaticMethod { return "static method has been called."; } } -ClassWithStaticMethod.staticMethod(); +ClassWithStaticMethod.staticMethod(); // 不实例化,直接调用class的方法 +``` + +### 继承(extends)@extends + +uts 允许使用继承来扩展现有的类。扩展的子类继承了父类的属性方法,但又可以添加自己独有的属性方法,以及复写父类定义的属性方法。 + +被继承的类称为父类(也称为超类、基类),新扩展的类称为子类(也称为派生类)。 + +比如定义了Person类存储人的基本信息,还可以定义一个Developer子类继承自Person类,在子类里追加Developer的独有信息。 + +- 语法: + +```ts +class ChildClass extends ParentClass { ... } +``` + +- 描述: + +extends 关键字用来创建一个类的子类。 + +- 示例: + +```ts +// 定义父类 +class Person { + name:string = ""; + constructor(newname:string) { + this.name = newname; + } +} +// 定义子类 +class Developer extends Person{ + likeLanguage:string = "ts" +} + +let d = new Developer("tom"); // 实例化。由于子类没有声明和复写自己的构造函数,所以默认继承了父类的构造函数 +console.log(d.name); // tom +console.log(d.likeLanguage); // ts +``` + +- 如果要控制父类中某些属性方法不被子类继承,可使用可见性修饰符(private、protected等),具体[见下](#modifier) +- 多重继承:子类还可以被孙类继承 + +#### 覆盖方法(override) + +覆盖,也称为复写、重写。在继承中,用于在子类中改写父类定义的方法或属性。 + +uts 对于可覆盖的成员以及覆盖后的成员需要显式修饰符override。 + +```ts +class Polygon { + name(): string { + return "Polygon"; + } +} + +class Square extends Polygon { + override name(): string { + return "Square"; + } +} +``` + +Square.name 函数上必须加上 override 修饰符。如果没写,编译器会报错。 + +#### 覆盖属性 + +属性与方法的覆盖机制相同。父类中已声明的同名属性,在子类中重新声明必须以 override 开头,并且它们必须具有兼容的类型(都是字符串、或数字、布尔值等)。 + +```ts +class Shape { + vertexCount: Int = 0 +} + +class Rectangle extends Shape { + override vertexCount = 4 +} +``` + +#### 调用父类实现 + +子类中的代码可以使用 super 关键字调用其父类的方法。不能跨级调用父类的父类(爷爷类)的方法。 + +```ts +class Rectangle { + draw() {} +} +class FilledRectangle extends Rectangle { + override draw() { + super.draw(); + } +} + ``` -### 可见性修饰符 + +### 可见性修饰符@modifier 类的方法与属性都可以有可见性修饰符。 @@ -921,16 +1095,16 @@ ClassWithStaticMethod.staticMethod(); 当成员被标记成 private 时,它就不能在声明它的类的外部访问。比如: ```ts -class Cat { +class Person { private name: string = "Cat"; } -new Cat().name; // 错误: 'name' 是私有的. +new Person().name; // 错误: 'name' 是私有的. ``` #### protected -protected 修饰符与 private 修饰符的行为很相似,但有一点不同,protected 成员在派生类中仍然可以访问。比如: +protected 修饰符与 private 修饰符的行为很相似,但有一点不同,protected 成员在继承的派生类中仍然可以访问。比如: ```ts class Person { @@ -1013,7 +1187,9 @@ const test = new Test() test.test() ``` -## 内置对象 +## 内置对象和API + +uts 有一批内置对象。不管将 uts 编译为 js/kotlin/swfit,这些内置对象都可以跨平台使用。 ### console @@ -1558,7 +1734,7 @@ setTimeout(() => { try { throw new Error('Whoops!') } catch (e) { - console.error(e.name + ': ' + e.message) + console.error(e.message) } ``` @@ -2059,7 +2235,7 @@ clearInterval(timer) - `default` * 与 `switch` 搭配,匹配不存在时做的事情,也可以用于 `export` 语句。 - `delete` - * 在 `Javascript` 平台,用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放。 + * 用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放。(目前仅支持 `Javascript` 平台) - `do` * 创建一个执行指定语句的循环,直到condition值为 false。在执行statement 后检测condition,所以指定的statement至少执行一次。 - `else` @@ -2097,7 +2273,7 @@ clearInterval(timer) - `try` ] * 捕获一个异常。 - `typeof` - * 在 `Javascript` 平台,返回一个字符串,表示未经计算的操作数的类型。 + * 返回一个字符串,表示未经计算的操作数的类型。(目前仅支持 `Javascript` 平台) - `var` * 声明一个变量,不建议使用。 - `void` @@ -2105,9 +2281,9 @@ clearInterval(timer) - `while` * 在某个条件表达式为真的前提下,循环执行指定的一段代码,直到那个表达式不为真时结束循环。 - `with` - * 在 `Javascript` 平台,扩展一个语句的作用域链。 + * 扩展一个语句的作用域链。(目前仅支持 `Javascript` 平台) - `yield` - * 在 `Javascript` 平台,用来暂停和恢复一个生成器函数。 + * 用来暂停和恢复一个生成器函数。(目前仅支持 `Javascript` 平台) - `enum` - `implements` - `interface` diff --git a/docs/tutorial/typescript-subject.md b/docs/tutorial/typescript-subject.md index 7ac77ee16aed7cafe1a911f03e0ab6ac3f0559a5..b4152d95de691680d451f362f3edbd2c417997d7 100644 --- a/docs/tutorial/typescript-subject.md +++ b/docs/tutorial/typescript-subject.md @@ -13,9 +13,13 @@ uni-app 支持使用 ts 开发,可参考 [Vue.js TypeScript 支持](https://cn ```html ``` +如果需使用vue组件,则需要`import Vue from 'vue'`,具体[见下](#component) + - cli创建的项目 需要在创建项目时就指定ts,具体请另行参考[文档](https://uniapp.dcloud.io/quickstart-cli.html#install-vue-cli) @@ -56,7 +60,7 @@ uni-app 支持使用 ts 开发,可参考 [Vue.js TypeScript 支持](https://cn - uni-app 的 vue2 模式:nvue 文件中不支持编写 ts。vue 文件中可以使用 ts,但 ts 版本根据项目类型有区别。HBuilderX 创建的项目使用 ts 3.7.5,cli 创建的项目使用 ts 4.x。 - uni-app 的 vue3 模式:vue 文件及 nvue 文件均支持最新版 ts。 -### 注意事项 +### ts组件@component 声明 `lang="ts"` 后,该 vue/nvue 文件 import 进来的所有 vue 组件,均需要使用 ts 编写。 diff --git a/docs/tutorial/vue3-basics.md b/docs/tutorial/vue3-basics.md index ae751717c28bcf8c4479040776cbe36e3ab46174..1fccd7fa85ec82962fa8f010f23b23950a87d4a4 100644 --- a/docs/tutorial/vue3-basics.md +++ b/docs/tutorial/vue3-basics.md @@ -280,7 +280,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要 相比Web平台, Vue.js 在 `uni-app` 中使用差异主要集中在两个方面: - 新增:`uni-app` 除了支持Vue实例的生命周期,还支持[应用生命周期](https://uniapp.dcloud.io/collocation/App#应用生命周期)以及[页面生命周期](https://uniapp.dcloud.io/tutorial/page#lifecycle)。 -- 受限:相比web平台,在小程序和App端部分功能受限。 +- 受限:相比web平台,在小程序和App端部分功能受限,[具体见](/vue3-api)。 [uni-app 项目支持 vue 3.0介绍,及升级指南](https://ask.dcloud.net.cn/article/37834) diff --git a/docs/uniCloud/cf-functions.md b/docs/uniCloud/cf-functions.md index 00698f2bd960f440d6732dcd84d5150e88c6fe3c..3577c9662ba945444a57d72855915afa0e225781 100644 --- a/docs/uniCloud/cf-functions.md +++ b/docs/uniCloud/cf-functions.md @@ -207,9 +207,11 @@ uniCloud服务器给客户端返回的数据格式一般是json,但json的格 为了与uni-app前端的API错误回调风格统一,uniCloud响应体规范定义的云端返回信息(尤其是报错时)应包含`errCode`和`errMsg`。 -除此之外响应体规范还包含`newToken`字段,用于token的自动续期(云对象接收含有newToken的响应后会自动更新storage内存储的`uni_id_token`及`uni_id_token_expired`,此行为新增于`HBuilderX 3.4.13`)。开发者一般无需关心此数据,uni-app客户端和云端uni-id之间会自动管理token及续期。 +#### HBuilderX 3.6.10及之后版本的错误规范 -`uniCloud响应体`示例如下: +错误规范继承自[uni错误规范](/tutorial/err-spec.md) + +#### HBuilderX 3.6.10之前版本的错误规范 ```json // 失败返回值 @@ -219,6 +221,26 @@ uniCloud服务器给客户端返回的数据格式一般是json,但json的格 } ``` +- errCode + +errCode在成功时应返回数字`0`,失败时应返回一个以插件id开头的“字符串”,每个单词以连字符(`-`)分割。做出这样的规定是为了防止不同插件之间出现重复错误码 + +以`'uni-id-account-banned'`错误码为例,`uni-id`为插件id,`account-banned`为错误缩写。 + +如果业务开发的代码并不发布插件市场,那么为了避免下载了一个市场的插件产生冲突,推荐使用不包含“-”的字符串来做errCode(插件市场的所有插件ID必须包含“-”)。 + +后续uniCloud会提供自动根据errCode对errMsg进行国际化处理的功能,开发者仅需保证云函数返回值满足`uniCloud响应体规范`即可。 + +- errMsg + +errMsg用于存放具体错误信息,包括展示给开发者、终端用户的错误信息 + +#### 请求成功的响应 + +除此之外响应体规范还包含`newToken`字段,用于token的自动续期(云对象接收含有newToken的响应后会自动更新storage内存储的`uni_id_token`及`uni_id_token_expired`,此行为新增于`HBuilderX 3.4.13`)。开发者一般无需关心此数据,uni-app客户端和云端uni-id之间会自动管理token及续期。 + +`uniCloud响应体`示例如下: + ```json // 成功返回值 { @@ -236,25 +258,12 @@ HBuilderX内使用代码块`returnu`可以快速输入以下代码(`HBuilderX ```js return { + errSubject: '', // HBuilderX 3.6.10新增 errCode: 0, errMsg: '' } ``` -- errCode - -errCode在成功时应返回数字`0`,失败时应返回一个以插件id开头的“字符串”,每个单词以连字符(`-`)分割。做出这样的规定是为了防止不同插件之间出现重复错误码 - -以`'uni-id-account-banned'`错误码为例,`uni-id`为插件id,`account-banned`为错误缩写。 - -如果业务开发的代码并不发布插件市场,那么为了避免下载了一个市场的插件产生冲突,推荐使用不包含“-”的字符串来做errCode(插件市场的所有插件ID必须包含“-”)。 - -后续uniCloud会提供自动根据errCode对errMsg进行国际化处理的功能,开发者仅需保证云函数返回值满足`uniCloud响应体规范`即可。 - -- errMsg - -errMsg用于存放具体错误信息,包括展示给开发者、终端用户的错误信息 - ## uniCloud API列表 云函数支持 js 和 nodejs 的标准API,如`console.log()`、`setTimeout()`,另见[nodejs官网](https://nodejs.org/en/docs/)。nodejs版本,详见[云函数运行环境](?id=runtime) diff --git a/docs/uniCloud/client-sdk.md b/docs/uniCloud/client-sdk.md index 7a42cbab21a28cb487d8f19c98c85b3893ebe716..3a09f50a3caf0cf277f9a11c3d11cb4dec406f39 100644 --- a/docs/uniCloud/client-sdk.md +++ b/docs/uniCloud/client-sdk.md @@ -27,6 +27,7 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也 |uniCloud.onRefreshToken() |监听token更新事件 [详情](#on-refresh-token) | |uniCloud.offRefreshToken() |移除监听token更新事件 [详情](#off-refresh-token) | |uniCloud.initSecureNetworkByWeixin() |在微信小程序安全网络请求发送之前与云函数握手 [详情](#init-secure-network-by-weixin) | +|uniCloud.getFileInfo() |阿里云迁移服务空间到商用版时,使用公测版云存储链接获取商用版云存储链接 [详情](storage.md#get-file-info) | ### 获取当前用户信息getCurrentUserInfo@client-getcurrentuserinfo diff --git a/docs/uniCloud/concepts/space.md b/docs/uniCloud/concepts/space.md index 8c415da146062ef4c78e784d358fb682560c9d00..e4d6a173ca079f962253c8528ea0ce2743c90ff8 100644 --- a/docs/uniCloud/concepts/space.md +++ b/docs/uniCloud/concepts/space.md @@ -142,7 +142,7 @@ function init(options):uniCloud |provider |String |是 |- |aliyun、tencent | |spaceId |String |是 |- |服务空间ID,**注意是服务空间ID,不是服务空间名称** | |clientSecret |String |是 |- |仅阿里云支持,可以在[uniCloud控制台](https://unicloud.dcloud.net.cn)服务空间列表中查看 | -|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云侧支持 | +|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云支持。商用版请将此参数设为`https://api.next.bspapp.com` | **示例代码** diff --git a/docs/uniCloud/jql-trigger.md b/docs/uniCloud/jql-trigger.md index d13aad570d45a87395974f67b7b452208c3ccff0..6f1de68e9352ce8416a6b51b2fcda5b1efe7dacd 100644 --- a/docs/uniCloud/jql-trigger.md +++ b/docs/uniCloud/jql-trigger.md @@ -8,7 +8,7 @@ ## 触发器配置@config -在项目的`uniCloud/database`目录下创建`${表名}.schema.js`,内容如下。 +在项目的`uniCloud/database`目录下创建`${表名}.schema.ext.js`,内容如下。 ```js module.exports = { @@ -100,7 +100,7 @@ field为所有被访问的字段的组成的数组,嵌套的字段会被摊平 为了不增加示例的复杂度,所有权限均设置为true,实际项目中切勿随意设置权限 ```js -// article.schema.js +// article.schema.ext.js { "bsonType": "object", "required": ["title", "content"], @@ -142,7 +142,7 @@ field为所有被访问的字段的组成的数组,嵌套的字段会被摊平 ### 读取后触发实现阅读量加1 ```js -// article.schema.js +// article.schema.ext.js module.exports { trigger: { afterRead: async function({ @@ -167,7 +167,7 @@ module.exports { ### 删除前备份 ```js -// article.schema.js +// article.schema.ext.js module.exports { trigger: { beforeDelete: async function({ @@ -192,7 +192,7 @@ module.exports { ### 修改文章更新时间 ```js -// article.schema.js +// article.schema.ext.js module.exports { trigger: { beforeUpdate: async function({ @@ -215,7 +215,7 @@ module.exports { ### 新增文章时自动添加摘要 ```js -// article.schema.js +// article.schema.ext.js module.exports { trigger: { beforeCreate: async function({ diff --git a/docs/uniCloud/jql.md b/docs/uniCloud/jql.md index 7d4e68ff80528ad3a61fa8ee94d1db591eddcb4a..0777cb2fca82ad547aa6c58f6399b83fff244e09 100644 --- a/docs/uniCloud/jql.md +++ b/docs/uniCloud/jql.md @@ -2641,6 +2641,7 @@ geoNear可用于查询位置在给定点一定距离内的数据库记录。此 **参数** |属性 |类型 |默认值 |必填 |说明 | +| ---- | ------ | ---- |---- |---- | |near |GeoPoint | |是 |GeoJSON Point,用于判断距离的点 | |spherical |true | |是 |必填,值为 true | |maxDistance |number | |否 |距离最大值 | diff --git a/docs/uniCloud/price.md b/docs/uniCloud/price.md index c2070d2bbe5edbf29f4599770b72841f45caa0c1..a8fd7d8d67b85e0254e4a558362f9e345a2de03b 100644 --- a/docs/uniCloud/price.md +++ b/docs/uniCloud/price.md @@ -1,14 +1,14 @@ ## 概述 -选择阿里云作为服务商时,服务空间资源完全免费,每个账号最多允许创建50个服务空间。**阿里云目前处于公测阶段,如有正式业务对稳定性有较高要求建议使用腾讯云。** +选择阿里云作为服务商时,有一个免费服务空间。更多服务空间需要付费。 选择腾讯云作为服务商时,需付费购买套餐,超出套餐后可开启按量计费,套餐详情参考[腾讯云基础套餐](uniCloud/price?id=tencent-package)。 -付费用户享受腾讯云提供的服务协议SLA,[详见](https://uniapp.dcloud.net.cn/uniCloud/agreement) +付费用户享受阿里云和腾讯云提供的服务协议SLA,[详见](https://uniapp.dcloud.net.cn/uniCloud/agreement) -uniCloud的腾讯云版的定价、套餐内容、服务SLA,是由腾讯公司直接公布的。DCloud公司不会加价,包括开发者通过DCloud充值也会直接充到开发者在腾讯云建立的子账户下。DCloud只从腾讯云等云厂商获取返佣,也不会在未来加价收割开发者。 +uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。DCloud公司不会加价。uniCloud已经上线近3年,DCloud一直以良心方式服务开发者。 -uniCloud提供包月、按量计费两种计费方式(仅阿里云),具体说明如下: +uniCloud提供包月、按量计费两种计费方式,具体说明如下: |计费方式 |付费方式 |计费单位 | |:-: |:-: |:-: | @@ -18,9 +18,7 @@ uniCloud提供包月、按量计费两种计费方式(仅阿里云),具体 ## 阿里云@aliyun -阿里云商业版计划将于**2022年11月中旬**上线,届时公测版服务空间将下线不再支持新建。对现存的公测版服务空间,阿里云会提供一个预期**两个月的过渡期**,在此期间已创建的服务空间仍可继续使用,**过渡期满后将停服释放**。 - -在商业版上线后,uniCloud控制台会于近期增加公测版迁移商业版的相关功能以便开发者迁移。 +阿里云公测版于2022年11月21日停止新建,对现存的公测版服务空间,阿里云会提供**两个月的过渡期**,在此期间已创建的服务空间仍可继续使用,开发者需在2022年1月21日前完成迁移。同时uniCloud控制台会于近期增加公测版迁移商业版的相关功能以便开发者平滑迁移。 ### 公测版@aliyun-public @@ -57,19 +55,20 @@ uniCloud提供包月、按量计费两种计费方式(仅阿里云),具体 申请日期 ``` -**阿里云商业版上线后,将不再支持公测版资源扩容,如有需求请使用商业版本。** +**阿里云正式版上线后,将不再支持公测版资源扩容,如有需求请使用商业版本。** -### 商业版@aliyun-business +### 阿里云正式版@aliyun-business -阿里云商业版支持`包年包月`及`按量计费`两种计费模式,创建`按量计费`服务空间需先充值保证金及阿里云余额。 +阿里云正式版支持`包年包月`及`按量计费`两种计费模式,创建`按量计费`服务空间需先充值保证金及阿里云余额。 #### 免费额度 阿里云针对每个账号提供了一个有免费额度的服务空间,以方便产品开发测试及体验。具体额度请阅读下方[包年包月套餐](uniCloud/price.md?id=aliyun-package)中的开发者版。 **免费额度注意事项:** - 单个账号只能创建一个阿里云免费服务空间 -- 阿里云免费服务空间有有效期,到期时需主动续费,否则将会被停服释放 +- 阿里云免费服务空间有效期默认一年,到期时需主动续费(续费时依旧免费),否则将会被停服释放 +- 免费版如需升配,只能针对剩余有效期进行操作,无法自定义升配时间 #### 包年包月套餐@aliyun-package |资源分类 |资源细项 |开发者版(免费版) |基础版 |标准版 |专业版 |企业版 |旗舰版 | @@ -322,12 +321,14 @@ parseCollection() 阿里云提供了公测版一键迁移到商业版的功能。执行一键迁移后云存储、云函数、数据库都会被迁移到新服务空间。迁移过程中云函数、数据库均可正常访问,云存储无法写入(删除或上传文件) - 公测版不可迁移到商业版的免费版 -- 客户端需要重新打包以使用新服务空间,需要HBuilderX 3.6.10及以上版本 +- 客户端需要重新打包以使用新服务空间,需要`HBuilderX 3.6.10-alpha`或`HBuilderX 3.6.5`及以上版本 - 注意迁移后服务空间id会变,如果云函数内有用到相关逻辑请务必注意调整。短信、一键登录功能使用了服务空间白名单的也务必将新空间加到白名单内 - 旧服务空间云函数url化默认域名会保留一段时间(请求会被转发到新服务空间),在后续清理时会彻底删除 - 云函数url化自定义域名需要重新绑定 - 迁移到商业版后旧服务空间的数据库备份不会被迁移过来 -- 旧云存储url需要通过[uniCloud.getFileInfo]()接口获取新服务空间的cdn链接,需要HBuilderX 3.6.10及以上版本 +- 旧云存储url需要通过`uniCloud.getFileInfo`(云函数接口:[uniCloud.getFileInfo](storage.md#get-file-info),客户端接口:[uniCloud.getFileInfo](storage.md#cloud-get-file-info))接口获取新服务空间的cdn链接,需要`HBuilderX 3.6.10-alpha`或`HBuilderX 3.6.5`及以上版本 - 商业版云存储和云函数位于同一区域,云函数上传文件到云存储会比之前快很多 - 前端网页托管自定义域名需要重新绑定 -- 前端网页托管不再提供文件变动自动刷新缓存功能,提供手动刷新功能 \ No newline at end of file +- 前端网页托管不再提供文件变动自动刷新缓存功能,提供手动刷新功能 + +上述问题,DCloud仍在推动阿里云进行优化,以尽量减少迁移所需的工作。 diff --git a/docs/uniCloud/publish.md b/docs/uniCloud/publish.md index 47d5b9218464fa977902160042cbbf457a261447..2a9b05c7027ba6fc2996e8ed44608ea3df86c77a 100644 --- a/docs/uniCloud/publish.md +++ b/docs/uniCloud/publish.md @@ -21,7 +21,7 @@ HBuilderX有多种发行方式 |服务提供商 |request合法域名 |uploadFile合法域名 |download合法域名| |:-: |:-: |:-: |:-:| -|阿里云 |api.bspapp.com |bsppub.oss-cn-shanghai.aliyuncs.com|需要从云存储下载文件的时候才需要配置,不同服务空间域名不同,可以在web控制台查看文件详情里面看到| +|阿里云 |api.bspapp.com(公测版)、api.next.bspapp.com(商用版) |bsppub.oss-cn-shanghai.aliyuncs.com|需要从云存储下载文件的时候才需要配置,不同服务空间域名不同,可以在web控制台查看文件详情里面看到| |腾讯云 |tcb-api.tencentcloudapi.com|cos.ap-shanghai.myqcloud.com |需要从云存储下载文件的时候才需要配置,不同服务空间域名不同,可以在web控制台查看文件详情里面看到| **如果需要用uni.request请求云存储内的文件,需要将云存储域名(即上表中的download合法域名)配置到request合法域名内** diff --git a/docs/uniCloud/release.md b/docs/uniCloud/release.md index 59b77bf7f7e020118dcb1a2d14e0c6d54e227c4e..8730e98b6554f23f164ff208f582fc174e108eaa 100644 --- a/docs/uniCloud/release.md +++ b/docs/uniCloud/release.md @@ -1,4 +1,7 @@ 注:本更新日志仅限uniCloud,包括uniCloud web控制台、uniCloud 云端运行环境。这些更新不跟随HBuilderX发版更新。 + +#### 2022-11-21 + + 【重要】阿里云商用版正式上线 [详情](https://ask.dcloud.net.cn/article/40144) #### 2022-11-14 + 【重要】新增 uni-im 云端一体的、全平台的、免费的、开源即时通讯系统 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-im.html) diff --git a/docs/uniCloud/rundebug.md b/docs/uniCloud/rundebug.md index e5819535f458f225cf41b193cfeb2691c905f42c..764e43c6332c7229db86bdd11757fdddb9d4c75a 100644 --- a/docs/uniCloud/rundebug.md +++ b/docs/uniCloud/rundebug.md @@ -353,13 +353,15 @@ uni-app前端也支持debug调试,注意不要混淆。 发布后的云函数,在 [uniCloud web控制台](https://unicloud.dcloud.net.cn/) -> 云函数 下也有日志。 -除了常规的运行日志、错误日志,也可以通过 API `uniCloud.logger` 打印日志。 +通过console api打印的日志会在云端记录。 -日志会保留7天。 +### 阿里云 + +阿里云云函数日志最长保留7天 + +### 腾讯云 + +腾讯云日志服务为套餐外单独计费项。如果你购买了包月套餐,在使用日志服务时会产生额外费用(日志服务为按量计费,从余额扣除)。为避免因日志服务欠费引发其他按量计费资源不可使用,目前新建腾讯云服务空间默认关闭了日志服务。 + +后续会提供开启及设置保存时长功能。如有需求可以发送邮件到 service@dcloud.io 申请开通 -|接口 |描述 | -|:-: |:-: | -|uniCloud.logger.log |以 log 日志等级输出日志 | -|uniCloud.logger.info |以 info 日志等级输出日志 | -|uniCloud.logger.warn |以 warn 日志等级输出日志 | -|uniCloud.logger.error|以 error 日志等级输出日志| \ No newline at end of file diff --git a/docs/uniCloud/schema.md b/docs/uniCloud/schema.md index 2a46298ed5b573585d8fe449a63f3e174af3bdaa..dda646dbec5a5935e7e4f9944ba8d3f6d56980cf 100644 --- a/docs/uniCloud/schema.md +++ b/docs/uniCloud/schema.md @@ -1610,7 +1610,7 @@ action是`clientDB`的一个配套功能。它的作用是在前端发起数据 有些复杂业务,要求必须同时执行一个action云函数,才能允许前端对特定数据的修改。 以user表为例,假使用户在修改自己的name时,必须要触发一个名为changenamelog的action云函数,在该云函数里会记录一条留痕日志,如果没有记录日志则不允许修改name。 -那么在`DB Schema`里要配置`action == 'changenamelog'` +那么在`DB Schema`里要配置`'changenamelog' in action` ```json // user表的schema @@ -1631,7 +1631,7 @@ action是`clientDB`的一个配套功能。它的作用是在前端发起数据 "title": "名称", "permission": { "read": true, - "write": "(doc._id == auth.uid) && (action == 'changenamelog')" // 允许登录的用户修改自己的name字段,但必须同时触发执行action云函数changenamelog + "write": "(doc._id == auth.uid) && ('changenamelog' in action)" // 允许登录的用户修改自己的name字段,但必须同时触发执行action云函数changenamelog } }, "pwd": { diff --git a/docs/uniCloud/storage.md b/docs/uniCloud/storage.md index 93a39b3b166c60e83fc793c7dd0e169c3b25fc0f..9f057bd3df6c4b0081139b1d36be5316d3e6dff6 100644 --- a/docs/uniCloud/storage.md +++ b/docs/uniCloud/storage.md @@ -207,6 +207,46 @@ uniCloud.getTempFileURL({ }); ``` +### getFileInfo(Object object)@get-file-info + +阿里云迁移服务空间后,旧云存储url需要通过此接口获取新服务空间的cdn链接 + +**平台兼容性** + +|阿里云 |腾讯云 | +|---- |---- | +|HBuilderX 3.6.10+(alpha版)、HBuilderX 3.6.5+(正式版) |不支持 | + +#### 请求参数 + +|字段 |类型 |必填 |默认值 |说明 |平台差异说明 | +|:-: |:-: |:-: |:-: |:-: |:-: | +|fileList |Array<String>|是 |- |要获取下载链接的文件 ID 组成的数组 |- | + +**请求参数中的fileList** + +|字段 |类型 |必填 |说明 | +|:-: |:-: |:-: |:-: | +|fileID |String |是 |旧云存储url | + +#### 响应参数 + +|字段 |类型 |说明 | +|:-: |:-: |:-: | +|fileList |Array<Object> |存储下载链接的数组 | + +**响应参数中的fileList** + +|字段 |类型 |说明 | +|:-: |:-: |:-: | +|fileId |string |文件 ID(从文件url中解析出的id) | +|gmtCreate |number |文件上传时间(精确到秒的时间戳) | +|gmtModified|number |文件更改时间(精确到秒的时间戳) | +|name |string |文件原始名称 | +|size |number |文件大小(Byte) | +|type |string |文件类型 | +|url |string |文件cdn链接 | + ### chooseAndUploadFile(Object object)@chooseanduploadfile > HBuilderX 3.1.0起支持 @@ -622,10 +662,53 @@ let result = await uniCloud.downloadFile({ }); ``` + +### getFileInfo(Object object)@get-file-info + +阿里云迁移服务空间后,旧云存储url需要通过此接口获取新服务空间的cdn链接 + +**平台兼容性** + +|阿里云 |腾讯云 | +|---- |---- | +|HBuilderX 3.6.10+(alpha版)、HBuilderX 3.6.5+(正式版) |不支持 | + +#### 请求参数 + +|字段 |类型 |必填 |默认值 |说明 |平台差异说明 | +|:-: |:-: |:-: |:-: |:-: |:-: | +|fileList |Array<String>|是 |- |要获取下载链接的文件 ID 组成的数组 |- | + +**请求参数中的fileList** + +|字段 |类型 |必填 |说明 | +|:-: |:-: |:-: |:-: | +|fileID |String |是 |旧云存储url | + +#### 响应参数 + +|字段 |类型 |说明 | +|:-: |:-: |:-: | +|fileList |Array<Object> |存储下载链接的数组 | + +**响应参数中的fileList** + +|字段 |类型 |说明 | +|:-: |:-: |:-: | +|fileId |string |文件 ID(从文件url中解析出的id) | +|gmtCreate |number |文件上传时间(精确到秒的时间戳) | +|gmtModified|number |文件更改时间(精确到秒的时间戳) | +|name |string |文件原始名称 | +|size |number |文件大小(Byte) | +|type |string |文件类型 | +|url |string |文件cdn链接 | + ## 数据处理 **阿里云** +> 阿里云商用版目前仍可使用此功能,但是未来可能会进行计费 + 使用阿里云作为服务商时,云存储支持直接使用**restful api**对资源进行处理,下表列出支持的操作类型。 如果你的数据库及云函数使用腾讯云,也是可以使用阿里云云存储的。详细用法参考:[连接多个服务空间](uniCloud/init.md) @@ -680,6 +763,8 @@ let result = await uniCloud.downloadFile({ ## 阿里云云存储CDN独立域名@aliyun-cdn-domain +> 仅适用于阿里云公测版,阿里云商用版每个服务空间都是单独的域名 + 阿里云公测版本所有服务空间使用了相同CDN域名,因此偶尔会出现部分服务空间云存储内存在违规内容导致此CDN域名被封禁的情况。为解决此问题,阿里云为每个服务空间提供了独立的云存储CDN域名。由于资源限制,需要手动在[uniCloud web 控制台](https://unicloud.dcloud.net.cn/)云存储管理页面申请才可以开启,有一定业务量的服务空间申请会自动通过。 开通云存储CDN独立域名有以下注意事项: diff --git a/docs/uniCloud/uni-id-pages.md b/docs/uniCloud/uni-id-pages.md index 6d0f4a3c72c4ef694d148ffa2627560d13c50161..5cefa741d8168b057f9e7ce9ac9097dea8e09d96 100644 --- a/docs/uniCloud/uni-id-pages.md +++ b/docs/uniCloud/uni-id-pages.md @@ -138,7 +138,7 @@ |agreements |Array |隐私政策[详情](#agreements) | |appid |Object |接入各类服务(如微信登录服务)的应用id[详情](#appid) | |passwordStrength |Object |密码配置 [详情](#strength) | - +|setPasswordAfterLogin|Boolean/Object|登录后设置密码 [详情](#set-pwd-after-login)| 完整示例: ```js @@ -171,7 +171,27 @@ export default { // 微信开放平台的appid,来源:登录微信开放平台(https://open.weixin.qq.com) -> 管理中心 -> 网站应用 -> 选择对应的应用名称,点击查看 -> AppID "web":"wx4dcf96ab6af4c5e8" } - } + }, + /** + * 密码强度 + * super(超强:密码必须包含大小写字母、数字和特殊符号,长度范围:8-16位之间) + * strong(强: 密密码必须包含字母、数字和特殊符号,长度范围:8-16位之间) + * medium (中:密码必须为字母、数字和特殊符号任意两种的组合,长度范围:8-16位之间) + * weak(弱:密码必须包含字母和数字,长度范围:6-16位之间) + * 为空或false则不验证密码强度 + */ + "passwordStrength":"medium", + /** + * 登录后允许用户设置密码(只针对未设置密码得用户) + * 开启此功能将 setPasswordAfterLogin 设置为 true 即可 + * "setPasswordAfterLogin": false + * + * 如果允许用户跳过设置密码 将 allowSkip 设置为 true + * "setPasswordAfterLogin": { + * "allowSkip": true + * } + * */ + "setPasswordAfterLogin": false } ``` @@ -261,6 +281,22 @@ export default { |medium |String |中:密码必须为字母、数字和特殊符号任意两种的组合,长度范围:8-16位之间| |weak |String |弱:密码必须包含字母和数字,长度范围:6-16位之间 | +#### 登录后设置密码@set-pwd-after-login + +用户如果没有设置密码,在登录后会跳转设置密码页面 + +此功能默认不开启, 开启请将 `setPasswordAfterLogin` 设置为 `true`,如下: +```javascript +{ + setPasswordAfterLogin: true, + // setPasswordAfterLogin: { + // allowSkip: false + // } +} +``` + +如果不需要强制设置密码可以将 `allowSkip` 设置为 `true` 用户可以选择跳过设置密码。 + ### 页面介绍 `uni-id-pages`包含:账号注册、免密登录、头像更换、修改昵称、绑定手机号码、找回密码、注销账号等页面。[插件地址](https://ext.dcloud.net.cn/plugin?name=uni-id-pages) @@ -1201,6 +1237,31 @@ await uniIdCo.unbindApple() ### 用户信息@user-info +#### 设置密码@set-pwd + +**接口形式** +```js +await uniIdCo.setPwd({ + code, + captcha, + password +}) +``` + +**参数说明** + +|参数名 |类型 |必填 |说明 | +|-- |-- |-- |-- | +|code|string |是 |手机验证码 | +|captcha|string |否 |图形验证码 | +|password|string |是 |密码 | + +**返回值** + +|参数名 |类型 |说明 | +|-- |-- |-- | +|errCode |string|number |错误码 | + #### 修改密码@update-pwd **接口形式** diff --git a/docs/uniCloud/uni-id-summary.md b/docs/uniCloud/uni-id-summary.md index e6fe62fd57637805e9afce44c2963d79ff3f3257..75d7e71b79388bfc294900ffc3c14cce2b70d314 100644 --- a/docs/uniCloud/uni-id-summary.md +++ b/docs/uniCloud/uni-id-summary.md @@ -766,6 +766,7 @@ function hasPermission(token, permission) { |bind-mobile-by-sms |短信验证码绑定手机号 | |login-by-email |邮箱验证码登录 | |reset-pwd-by-email |邮箱验证码重置密码 | +|set-pwd-by-sms |手机验证码设置登录密码 | ### 图形验证码使用场景@captcha-scene @@ -782,6 +783,7 @@ function hasPermission(token, permission) { |send-sms-code |发送短信验证码 | |send-email-code |发送邮箱验证码 | |bind-mobile-by-sms |短信验证码绑定手机号 | +|set-pwd-by-sms |手机验证码设置登录密码 | ## uniIdRouter自动路由@uni-id-router diff --git a/docs/uniCloud/uni-im.md b/docs/uniCloud/uni-im.md index 30d83d8b033f2f580c0ecb39bd29542fd7f8a079..d21d9d18bc96cee120353501a4bc681965132584 100644 --- a/docs/uniCloud/uni-im.md +++ b/docs/uniCloud/uni-im.md @@ -54,11 +54,7 @@ uni-im是云端一体的、全平台的、免费的、开源即时通讯系统 ## 部署到自己的项目 1. 打开`uni-im`插件下载地址:[https://ext.dcloud.net.cn/plugin?name=uni-im](https://ext.dcloud.net.cn/plugin?name=uni-im) 2. 点击`使用HBuilderX导入插件`,选择你的项目,点击确定(同时会自动导入依赖的uni_modules`uni-id-pages`)按提示操作自动配置`pages.json` -3. 打开项目根目录的App.vue文件,进行如下操作: -- 导入uniIm的Utils -- 初始化uniIm -- 在globalData中添加预置数据 -- 在onShow和onHide生命周期更改app是否显示在前台的值 +3. 打开项目根目录的App.vue文件,初始化uni-id-pages和uniIm模块 示例如下: ```html @@ -68,17 +64,11 @@ uni-im是云端一体的、全平台的、免费的、开源即时通讯系统 //2. 导入uniIm的Utils工具类 import uniImUtils from '@/uni_modules/uni-im/common/utils.js'; export default { - globalData: { - //3. 初始化uniIm全局变量 - uniIm: { - msgManagers: {} - } - }, onLaunch: async function() { console.log('App Launch'); - //4. 初始化uni身份信息管理模块 + //3. 初始化uni身份信息管理模块 uniIdPagesInit(); - //5. 初始化uniIm + //4. 初始化uniIm uniImUtils.init(); }, onShow: function() { @@ -284,7 +274,7 @@ uni-im v1.0.0 暂时比较简单,云端有1个云对象`uni-im-co`,2个opend "jwtSecret":"jwtSecretDemo", } ``` -这里的值`jwtSecretDemo`为示例,注意修改为自己的,使用一个较长的字符串即可。 +这里的值`jwtSecretDemo`为示例,注意修改为自己的,使用一个较长的字符串即可(越长安全性越高,建议大于32位)。 **接口形式** diff --git a/package.json b/package.json index 37311ce48fd37c4ababae0341be8c951fbd875d1..827a840dde8f3801608c50d66f29fab0bf4436ac 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,6 @@ }, "dependencies": { "@docsearch/js": "^3.1.0", - "vuepress-theme-uni-app-test": "^1.2.8" + "vuepress-theme-uni-app-test": "^1.2.10" } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 845399f21cce0bf14fc80cd1ff7eec7163b24041..a58acdb01d24b31d132608bf6c0e0c5e470d3050 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8503,10 +8503,10 @@ vuepress-theme-uni-app-test@^1.2.0: vuepress-plugin-juejin-style-copy "^1.0.4" vuepress-theme-uni-app-test "^1.1.9" -vuepress-theme-uni-app-test@^1.2.7: - version "1.2.7" - resolved "https://registry.npmmirror.com/vuepress-theme-uni-app-test/-/vuepress-theme-uni-app-test-1.2.7.tgz#99b0bc91c49ca3b342345f6d36415cfb9bc7fc5d" - integrity sha512-6aE36v4/Je2L72Oq2SI4iPX0LTUxrLy5wsePCZ8Wup81/omT1CZxBXxXa7K186yfOcojgaI4HFbXZU4dtVii4w== +vuepress-theme-uni-app-test@^1.2.10: + version "1.2.10" + resolved "https://registry.npmmirror.com/vuepress-theme-uni-app-test/-/vuepress-theme-uni-app-test-1.2.10.tgz#f7a36c850ac81779557abecbadcfafe86f4c3ede" + integrity sha512-/PgJbMwDWhZZSW/P6pH5MdsyJamLwDEuRxirVIEANXf8nqivbj3214clJXMDUliRovnsq02uvhVQp6HQRT8SKw== dependencies: "@vuepress/plugin-back-to-top" "^1.9.5" "@vuepress/theme-default" "^1.8.2" @@ -8514,12 +8514,12 @@ vuepress-theme-uni-app-test@^1.2.7: clipboard "^2.0.11" vuepress "^1.8.2" vuepress-plugin-juejin-style-copy "^1.0.4" - vuepress-theme-uni-app-test "^1.2.0" + vuepress-theme-uni-app-test "^1.2.7" -vuepress-theme-uni-app-test@^1.2.8: - version "1.2.8" - resolved "https://registry.npmmirror.com/vuepress-theme-uni-app-test/-/vuepress-theme-uni-app-test-1.2.8.tgz#f5a34dec92bbb688deb05e0b7b382c3074466f61" - integrity sha512-c8bV7CDbqOP5LjGXgxiyFhtkVBVMRqMBIg+BVVD7tZ1LlkqWrit61gK2ebt0lz9HISQxUA9tVoW5hVeMQNz89A== +vuepress-theme-uni-app-test@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/vuepress-theme-uni-app-test/-/vuepress-theme-uni-app-test-1.2.7.tgz#99b0bc91c49ca3b342345f6d36415cfb9bc7fc5d" + integrity sha512-6aE36v4/Je2L72Oq2SI4iPX0LTUxrLy5wsePCZ8Wup81/omT1CZxBXxXa7K186yfOcojgaI4HFbXZU4dtVii4w== dependencies: "@vuepress/plugin-back-to-top" "^1.9.5" "@vuepress/theme-default" "^1.8.2" @@ -8527,7 +8527,7 @@ vuepress-theme-uni-app-test@^1.2.8: clipboard "^2.0.11" vuepress "^1.8.2" vuepress-plugin-juejin-style-copy "^1.0.4" - vuepress-theme-uni-app-test "^1.2.7" + vuepress-theme-uni-app-test "^1.2.0" vuepress@^1.8.2: version "1.9.7"