提交 501d2f8e 编写于 作者: D DCloud_LXH

Merge branch 'master' of https://github.com/dcloudio/unidocs-zh

......@@ -47,7 +47,7 @@
<a v-else
target="_blank"
style="text-decoration: underline"
href="https://qm.qq.com/cgi-bin/qm/qr?k=Gb87Oy7TJlDj29YVLZmc3FPGXWv4GMdZ&jump_from=webapi"
href="https://qm.qq.com/cgi-bin/qm/qr?k=nsW1gqNT9LqZLfcyntjd1paIKUzWewHN&jump_from=webapi"
>
点此加入
</a>
......
......@@ -84,6 +84,11 @@ export default {
"state": 1,
"prefix": "群11"
},
{
"number": "884860657",
"state": 1,
"prefix": "群12"
},
{
"number": "699478442",
"state": 1,
......@@ -174,11 +179,6 @@ export default {
"state": 1,
"prefix": "群30"
},
{
"number": "567471669",
"state": 1,
"prefix": "群31"
},
{
"number": "166188631",
"state": 1,
......@@ -200,9 +200,9 @@ export default {
"prefix": "群35"
},
{
"number": "884860657",
"number": "567471669",
"state": 0,
"prefix": "12"
"prefix": "31"
}
]
}
......@@ -72,7 +72,7 @@
- 小程序仅支持加载网络网页,不支持本地html
- 补充说明:app-vue下web-view组件不支持自定义样式,而v-show的本质是改变组件的样式。即组件支持v-if而不是支持v-show。
- 小程序端 web-view 组件一定有原生导航栏,下面一定是全屏的 web-view 组件,navigationStyle: custom 对 web-view 组件无效。
- App 端使用 uni.web-view.js 的最低版为 [uni.webview.1.5.3.js](https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.3.js)
- App 端使用 uni.web-view.js 的最低版为 [uni.webview.1.5.4.js](https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.4.js)
- App 平台同时支持网络网页和本地网页,但本地网页及相关资源(js、css等文件)必须放在 `uni-app 项目根目录->hybrid->html` 文件夹下或者 `static` 目录下,如下为一个加载本地网页的`uni-app`项目文件目录示例:
- nvue `web-view` 必须指定样式宽高
- App 网页向应用 `postMessage` 为实时消息
......@@ -137,7 +137,7 @@
|属性|类型|说明|
|:-|:-|:-|
|plus|Boolean|App|
|nvue|Boolean|App-nvue, uni.webview.1.5.3.js+ 支持|
|nvue|Boolean|App-nvue, uni.webview.1.5.4.js+ 支持|
|miniprogram|Boolean|微信小程序|
|smartprogram|Boolean|百度小程序|
|miniprogram|Boolean|支付宝小程序|
......@@ -229,8 +229,8 @@
}
</script>
<!-- uni 的 SDK -->
<!-- 需要把 uni.webview.1.5.3.js 下载到自己的服务器 -->
<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.2/index.js"></script>
<!-- 需要把 uni.webview.1.5.4.js 下载到自己的服务器 -->
<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.3/index.js"></script>
<script type="text/javascript">
// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
document.addEventListener('UniAppJSBridgeReady', function() {
......@@ -377,7 +377,7 @@ web-view组件在App和小程序中层级较高,如需要在vue页面中写代
- `<web-view>` 组件默认铺满全屏并且层级高于前端组件。App端想调节大小或在其上覆盖内容需使用plus规范,H5端可以改为直接使用 iframe。
- `<web-view>` 组件所在窗口的标题,跟随页面的 `<title>` 值的变化而变化(不含H5端)。
- App-vue的`web-view`加载的html页面可以运行plus的api,但注意如果该页面调用了plus.key的API监听了back按键(或使用mui的封装),会造成back监听冲突。需要该html页面移除对back的监听。或按照上面的示例代码禁止网页使用plus对象。app-nvue页面的`web-view`组件不能运行plus API。
- `uni.webview.js` 最新版地址:[https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.3.js](https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.3.js)
- `uni.webview.js` 最新版地址:[https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.4.js](https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.4.js)
- 小程序平台,个人类型与海外类型的小程序使用 `web-view` 组件,提交审核时注意微信等平台是否允许使用
- 小程序平台, `src` 指向的链接需登录小程序管理后台配置域名白名单。`App``H5` 无此限制。
......@@ -408,8 +408,8 @@ uni.webView.navigateTo 示例,注意uni sdk放到body下面
<!-- built files will be auto injected -->
</body>
<!-- uni 的 SDK -->
<!-- 需要把 uni.webview.1.5.3.js 下载到自己的服务器 -->
<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.2/index.js"></script>
<!-- 需要把 uni.webview.1.5.4.js 下载到自己的服务器 -->
<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.3/index.js"></script>
<script>
document.addEventListener('UniAppJSBridgeReady', function() {
uni.webView.getEnv(function(res) {
......
#### 3.4.14.20220607
* 【uni-app】
+ 【重要】uniAD 支持微信小程序平台,更低的流量主门槛 [详情](https://uniapp.dcloud.net.cn/component/ad-weixin.html)
+ 【重要】App平台 优化 vue2 项目 view 组件实现方式,提高渲染性能。建议相关开发者升级
+ 新增 uni.getSystemInfo 添加 device、os、rom、host、browser、uni、app 等概念 [详情](https://uniapp.dcloud.io/api/system/info.html)
+ 优化 vue3 项目 兼容 pnpm@7.0.0
+ 修复 vue3 项目 部分情况下错误信息不准确的Bug
+ 修复 vue3 项目 vite.config.js 配置 build.minify 为 terser 不生效的Bug [详情](https://ask.dcloud.net.cn/question/144992)
+ App、H5平台 优化 image 组件减少网络请求
+ App、H5平台 新增 uni.getDeviceInfo [详情](https://uniapp.dcloud.io/api/system/getDeviceInfo.html)
+ App、H5平台 新增 uni.getAppBaseInfo [详情](https://uniapp.dcloud.io/api/system/getAppBaseInfo.html)
+ App、H5平台 新增 uni.getWindowInfo [详情](https://uniapp.dcloud.io/api/system/getWindowInfo.html)
+ App、H5平台 修复 uni.canIUse 获取某些 api 的返回值不正确的Bug [详情](https://uniapp.dcloud.io/api/caniuse.html)
+ App、H5平台 修复 canvas transform 渲染时没有使用高清处理的Bug [详情](https://ask.dcloud.net.cn/question/144676)
+ App、H5平台 修复 canvas 组件画图裁剪异常的Bug [详情](https://ask.dcloud.net.cn/question/142494)
+ App平台、微信小程序平台 新增 ad-rewarded-video 激励视频广告组件,更易用、安全、高收益 [详情](https://uniapp.dcloud.net.cn/component/ad-rewarded-video.html)
+ App平台、微信小程序平台 新增 ad-interstitial 插屏广告组件 [详情](https://uniapp.dcloud.net.cn/component/ad-interstitial.html)
+ App平台 新增 ad-fullscreen-video 全屏视频广告组件 [详情](https://uniapp.dcloud.net.cn/component/ad-fullscreen-video.html)
+ App平台 修复 nvue 页面 switch 组件切换状态无限闪动的Bug [详情](https://ask.dcloud.net.cn/question/145272)
+ App平台 修复 纯 nvue 编译模式 uni_modules 内静态资源未拷贝的Bug
+ App平台 修复 vue3 项目使用录音时报错的Bug [详情](https://ask.dcloud.net.cn/question/144821)
+ App平台 修复 vue3 项目 纯 nvue 项目编译报错的Bug
+ App平台 修复 nvue 页面列表删除渲染卡顿的Bug [详情](https://ask.dcloud.net.cn/question/144110)
+ App平台 修复 nvue 页面 transition 包含多个属性时编译报错的Bug [详情](https://ask.dcloud.net.cn/question/89110)
+ App平台 修复 navigator 组件 animation-type、animation-duration 属性无效的Bug [详情](https://ask.dcloud.net.cn/question/143377)
+ App平台 修复 vue3 nvue movable 组件使用异常的Bug [详情](https://ask.dcloud.net.cn/question/143742)
+ App-Android平台 优化 补齐 tabBar 和 navigationBar 支持高斯模糊效果 [详情](https://uniapp.dcloud.io/tutorial/app-blureffect)
+ App-Android平台 修复 使用谷歌地图时,mapContext 对象调用 moveAlong 移动 marker 动画过程中拖拽地图会产生偏移的Bug
+ App-Android平台 修复 nvue view 组件 hover-class 属性动态改变组件大小时无效的Bug [详情](https://ask.dcloud.net.cn/question/145677)
+ App-Android平台 修复 bindingx 执行 getComputedStyle 方法返回异常的Bug [详情](https://ask.dcloud.net.cn/question/143697)
+ App-iOS平台 修复 vue3 项目 nvue 页面 swiper 组件面板指示点无法隐藏的Bug [详情](https://ask.dcloud.net.cn/question/145097)
+ App-iOS平台 修复 nvue 页面滚动视图中设置 position 属性为 sticky 样式显示不正确的Bug [详情](https://ask.dcloud.net.cn/question/144303)
+ App-iOS平台 修复 nvue textarea 组件默认换行不生效的Bug [详情](https://ask.dcloud.net.cn/question/143784)
+ App-iOS平台 修复 nvue map 组件开启标记点聚合时,调用 removeMarkers 移除所有 marker 引起应用崩溃的Bug [详情](https://ask.dcloud.net.cn/question/143991)
+ App-iOS平台 修复 nvue swiper 组件与页面返回手势冲突的Bug [详情](https://ask.dcloud.net.cn/question/137505)
+ H5平台 修复 vue3 项目 App.vue 使用 setup 不生效的Bug [详情](https://ask.dcloud.net.cn/question/144672)
+ H5平台 修复 rich-text 组件部分标签没有加上 scopeId 导致样式应用不上的Bug [详情](https://ask.dcloud.net.cn/question/144042)
+ H5平台 修复 vue3 项目使用 picker 组件报错的Bug [详情](https://ask.dcloud.net.cn/question/144073)
+ H5平台 修复 vue3 项目 当页面同时存在 vue、nvue 时,样式不正确的Bug [详情](https://ask.dcloud.net.cn/question/144687)
+ H5平台 修复 vue3 项目 使用 Vue.js devtools 查看页面状态不显示的Bug [详情](https://github.com/dcloudio/uni-app/issues/3492)
+ 小程序平台 修复 uni.getLocale 获取值不统一的Bug [详情](https://uniapp.dcloud.io/api/ui/locale.html)
+ 小程序平台 修复 vue3 项目 在模板中使用 wxs、sjs 插值表达式不生效的Bug [详情](https://github.com/dcloudio/uni-app/issues/3527)
+ 小程序平台 修复 vue3 项目 部分情况下代码分割错误的Bug [详情](https://github.com/dcloudio/uni-app/issues/3491)
+ 小程序平台 修复 v-if 内连用多个逻辑表达式编译出错的Bug [详情](https://ask.dcloud.net.cn/question/129122)
+ 微信小程序平台 调整 ad 广告组件 [详情](https://uniapp.dcloud.net.cn/component/ad.html#weixin)
+ 微信小程序平台 修复 vue3 项目 ad-custom 组件无法使用的Bug [详情](https://ask.dcloud.net.cn/question/145883)
+ 微信小程序平台 修复 uni.getSystemInfoSync() 获取的 safeAreaInsets.bottom 为负数的Bug [详情](https://ask.dcloud.net.cn/question/133479)
+ 支付宝小程序平台 修复 vue3 项目 全局组件不生效的Bug [详情](https://github.com/dcloudio/uni-app/issues/3525)
+ 支付宝小程序平台 修复 vue3 项目 sjs 不生效的Bug [详情](https://github.com/dcloudio/uni-app/issues/3527)
+ uni-ui 新增 uni-data-select 组件 [详情](https://ext.dcloud.net.cn/plugin?id=7993)
+ uni-ui 新增 uni-breadcrumb 组件 [详情](https://ext.dcloud.net.cn/plugin?id=7992)
+ uni-ui 新增 uni-tooltip 组件 [详情](https://ext.dcloud.net.cn/plugin?id=8020)
* 【uniCloud】
+ 【重要】调整 vue2版本客户端App平台对应的`context.PLATFORM`值由 `app-plus` 改为 `app`。此调整对 uni-id 有影响,详情请参考文档:[uni-id preferedAppPlatform](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#prefered-app-platform)
+ 新增 HBuilder 云对象本地运行和调试 [详情](https://uniapp.dcloud.net.cn/uniCloud/cloud-obj.html#run-local)
+ 新增 HBuilder Redis本地云函数运行(仍连接云端Redis数据库) [详情](https://uniapp.dcloud.net.cn/uniCloud/redis.html#lcoal-function)
+ 新增 HBuilder 新建 `DB Schema` 模板列表 且支持搜索
+ 新增 unicloud-db 组件增加属性 ssr-key,支持ssr服务端渲染。限web平台vue3版本 [详情](https://uniapp.dcloud.net.cn/uniCloud/unicloud-db.html#ssrkey)
+ 新增 uniCloud.onResponse/offResponse 接口用于监听云函数、云对象及clientDB的响应结果 [详情](https://uniapp.dcloud.net.cn/uniCloud/client-sdk.html#on-response)
+ 新增 uniCloud响应体规范 添加 newToken 字段,用于token续期。云对象会自动将token持久化存储 [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-functions.html#resformat)
+ 新增 uni-cloud-jql 扩展库 databaseForJQL 方法支持传递 clientInfo,以便于在云对象中使用 [详情](https://uniapp.dcloud.net.cn/uniCloud/jql-cloud.html#use-in-object)
+ 修复 云对象 _before 内抛出错误后 _after 不执行的Bug [详情](https://ask.dcloud.net.cn/question/145046)
+ 修复 云对象 自动展示交互界面时未能显示 loading 标题的Bug [详情](https://ask.dcloud.net.cn/question/144526)
+ 修复 云对象 自动展示错误提示界面时 toast 图标错误的Bug [详情](https://ask.dcloud.net.cn/question/142246)
+ 调整 客户端将上报所有`getSystemInfoSync`返回的内容供云端使用,参考文档:[云函数内获取客户端信息](https://uniapp.dcloud.net.cn/uniCloud/cf-functions.html#client-info)[云对象内获取客户端信息](https://uniapp.dcloud.net.cn/uniCloud/cloud-obj.html#get-client-info)
+ uniCloud控制台 新增 腾讯云云存储支持上传文件夹
+ uni-id 新增 getWeixinUserInfo 用于获取app平台微信登录用户的用户信息 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#get-weixin-user-info)
+ uni-id 新增 addUser 用于手动添加用户 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#add-user)
+ uni-id 新增 resetPwdBySms 用于使用短信验证码重置密码 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#reset-pwd-by-sms)
+ uni-id 调整 用户注册时记录用户注册环境到 register_env 字段 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#user-table)
+ uni-id 调整 用户注册时将注册 ip 移至 register_env 内
+ uni-id 调整 绑定、解绑邮箱手机号接口,只要传递 code 参数就进行验证码校验即使传递的值为undefined
+ uni-id 修复 config 文件语法错误时报`this.t is not a function`的Bug
+ uni-captcha 优化 将公共模块升级为云端一体组件:创建、刷新、显示验证码 [详情](https://ext.dcloud.net.cn/plugin?id=4048)
+ uni-starter 新增 短信验证码登陆、绑定手机号码,防刷逻辑;当短信验证码输入错误超过2次,弹出图形验证码进行人机校验。[详情](https://ext.dcloud.net.cn/plugin?id=5057)
+ uni-admin 新增 uni统计数据报表功能 [详情](https://ext.dcloud.net.cn/plugin?id=3268)
+ uni-admin 修复 系统设置中权限只能加载 20 条的 bug
+ uni-admin 优化 登录速度
+ uni-admin 修复 从「首页」跳转「概况」时,url 的 query 丢失的 bug
+ uni-admin 修复 路由改变后面包屑未响应的 bug
* 【App插件(含5+App和uni-app的App端)】
+ 修复 音频播放 audio 暂停后设置播放倍速大于 0 会自动触发播放的Bug [详情](https://ask.dcloud.net.cn/question/143757)
+ Android平台 新增 原生隐私政策提示框支持 hrefLoader 属性,配置提示框中点击 href 链接的打开方式 [详情](https://uniapp.dcloud.io/tutorial/app-privacy-android)
+ 更新 uni-AD 腾讯优量汇SDK Android为 4.462.1332 版,iOS为 4.13.65 版;今日头条穿山甲SDK Android为 4.5.1.1 版,iOS为 4.4.0.5 版;快手广告SDK Android为 3.3.24 版,iOS为 3.3.24 版;快手内容联盟SDK iOS为 3.3.28 版;百度百青藤广告SDK Android为 9.212 版,iOS为 4.87 版;Sigmob广告联盟SDK Android为 3.5.9 版,iOS为 4.1.0 版
+ Android平台 修复 uni-AD 离线打包开通开屏广告可能引起应用崩溃的Bug
+ Android平台 修复 uni-AD 开屏广告开通腾讯优量汇可能引起应用启动白屏的Bug
+ Android平台 修复 uni-AD 腾讯优量汇广告联盟部分下载类广告下载成功之后无法安装的Bug
+ iOS平台 更新 一键登录 使用的个验SDK为 2.2.0.0 版,个推核心组件SDK为 1.2.7.0 版
+ iOS平台 修复 3.4.4版本 引出的 未使用Push模块上传 AppStore 报`ITMS-90078: Missing Push Notification Entitlement`警告的Bug
+ iOS平台 修复 登录鉴权、分享的 authorize 方法传入认证参数 options 不生效的Bug
+ iOS平台 修复 音频播放 audio 设置 startTime 可能不生效的Bug [详情](https://ask.dcloud.net.cn/question/146028)
+ iOS平台 修复 视频播放 video 播放 rtmp 协议直播流视频时声音只能通过扬声器播放的Bug [详情](https://ask.dcloud.net.cn/question/129703)
+ iOS平台 修复 视频播放 video 播放 rtmp/rtsp 协议视频时 timeupdate 事件返回当前播放时间 currentTime 始终为 0 的Bug
* 【Uni小程序SDK】
+ Android平台 修复 3.4.7版本引出的 宿主事件回调格式异常的Bug
+ Android平台 修复 多进程模式下微信分享过程中手动返回页面显示异常的Bug
+ Android平台 修复 小程序应用资源更新可能引起页面卡顿的Bug
+ iOS平台 修复 调用 closeWithCompletion 方法关闭小程序后紧接着在打开小程序可能引起崩溃的Bug
+ iOS平台 修复 存在自定义 UIWindow 时 toast 可能无法显示的Bug
#### 3.4.7.20220422
* 【uni-app】
+ 新增 vue3 项目内置支持 pinia [详情](https://uniapp.dcloud.net.cn/tutorial/vue3-pinia.html)
......
......@@ -67,9 +67,16 @@
* [Google支付](/tutorial/app-payment-google.md)
* Push(消息推送)
* [UniPush](/tutorial/app-push-unipush.md)
* [Sare(分享)](/tutorial/app-share.md)
* [微信分享](/tutorial/app-share-weixin.md)
* [QQ分享](/tutorial/app-share-qq.md)
* [新浪微博分享](/tutorial/app-share-weibo.md)
* [Speech(语言输入)](/tutorial/app-speech.md)
* [Statistic(统计)](/tutorial/app-statistic.md)
* [友盟统计](/tutorial/app-statistic-umeng.md)
* [Google统计](/tutorial/app-statistic-google.md)
* [Android X5 Webview(腾讯TBS)](/tutorial/app-android-x5.md)
* [iOS UIWebview](/tutorial/app-ios-uiwebview.md)
* 其它配置
* [自定义404错误页面](/tutorial/app-webview-error.md)
* [Android设置UrlSchemes](/tutorial/app-android-schemes.md)
......
> 腾讯TBS x5内核仅支持Android平台;iOS只能使用自带的WKWebview/UIWebview
以下说明中的“腾讯TBS x5内核“精简为“x5内核”。
集成x5内核说明:
1. 首先需要升级到HBuilderX2.5.3 版本或更高
2. 按以下说明配置项目的manifest.json,然后提交云打包或使用[自定义基座](http://ask.dcloud.net.cn/article/35115)生效
集成x5内核后哪些页面会由x5内核渲染?
1. 所有plus.webview.create创建的webview
2. uni-app中所有vue页面
3. uni-app中的web-view组件
### 配置使用X5内核
打开项目的manifest.json文件,在“App模块配置”中勾选“Android X5 Webview(腾讯TBS)”:
![](https://native-res.dcloud.net.cn/images/uniapp/android/x5-manifest.png)
**提示**
> 使用X5内核模块提交云端打包后才能生效,真机运行调试时请使用[自定义基座](http://ask.dcloud.net.cn/article/35115)
> [CPU类型配置](https://uniapp.dcloud.io/tutorial/app-android-abifilters)不支持“x86”,建议仅配置“armeabi-v7a” 否则可能无法正常使用X5内核
> HBuilderX3.0.7+版本[CPU类型配置](https://uniapp.dcloud.io/tutorial/app-android-abifilters)开始支持“arm64-v8a”
> 本地离线打包请参考:[X5 Webview 配置](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/x5)
> uni小程序SDK请参考:[unimp小程序集成x5教程](https://nativesupport.dcloud.net.cn/UniMPDocs/UseModule/android/x5)
<a id="mattersNeedingAttention"></a>
### X5内核能解决什么问题:
1. x5适配了rom的自定义主题字体,与原生字体保持一致。不会出现一个界面部分字体为原生字体、部分字体为webview字体的问题。之前系统webview在部分手机上不能适配rom自定义主题的字体
2. 系统的webview有浏览器兼容问题,低端Android的webview有很多新语法都不支持。使用x5可以拉齐webview内核。对于5+App和wap2app,可以全部拉齐。对于uni-app,由于uni-app自带js引擎,在js和组件层面本身就不存在浏览器兼容问题,只有vue页面的css涉及浏览器兼容问题。如果你想使用比如sticky等新css语法,此时可通过x5拉齐。如果开发者比较注意,不使用太新的语法的话,其实此时x5在这方面没有用处
3. x5内核自带的video实现强于html的video,支持视频格式更多。(这个只能用于5+app和wap2app的html里的自带video,以及uni-app的web-view组件里的video。uni-app默认的video组件本身就是原生的,和x5无关)
4. 远程web页面防劫持是x5内核的一大亮点
### X5内核的注意事项
1. 由于x5使用动态热更新加载x5内核。在Google Play审核是不允许的,所以无法提交Google Play
2. x5不支持在PC模拟器上运行,一切真机为主
3. x5内核对webview嵌套支持的不友好。使用x5渲染的页面尽量不要使用webview嵌套(父子页面等)容易出现动画卡顿等现象
4. 因x5加载内核机制问题,云打包APK第一次安装运行可能x5还没有下载,此时不是x5内核渲染页面,而是系统webview渲染页面。但x5下载完毕后,杀掉进程重新运行,就会使用x5内核渲染页面
5. 并非所有手机都有x5内核,当手机端没有时x5内核时,App启动后会先下载内核,在x5加载成功前,调用webview仍然是系统webview
6. html5 嵌入iframe视频fixed定位会导致应用闪退
7. 部分系统(华为)修改字体后不会重启系统。导致x5页面不能够立即更换字体库重新进行渲染。需要杀掉进程重新启动应用(back退出应用无效)才可以重置字体库进行页面渲染
8. APK本身已经集成了X5才能通过wgt升级。如果apk本身没集成X5则不可以通过WGT升级支持X5。需要改为APK升级!
9. 可通过plus.navigator.getUserAgent判断UA中是否包含MQQBrowser关键字判断当前webview是否为X5渲染。 HX2.6.16+支持
10. x5内核渲染页面的滚动条。会随着页面内容的长短显示滚动滑块。可按住滚动滑块拖动实现快速滚动。与普通webview滚动条有差异
### x5内核自更新
x5内核存在自更新机制。所以可能存在历史版本升级了x5内核导致的兼容性问题。集成的同学需要注意!
### 适配问题
目前已知 TBS45738版本更新后会导致 uniapp vue页面的input组件adjust-position=false失效!使用x5内核的同学请知晓尽快适配,可以改为nvue或不适用x5内核。版本信息可通过plus.navigator.getUserAgent()获取。
x5内核的UserAgent如下:
```
Mozilla/5.0 (Linux; Android 11; PEXM00 Build/RKQ1.201217.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045738
```
\ No newline at end of file
......@@ -151,6 +151,8 @@ height: var(--window-bottom);
- 滚动视图添加 adjustBottom="true":只有添加了 adjustBottom="true" 框架才会自动调整滚动视图的 contentInset bottom 值,**这里有一点需要注意**,如果你的页面整体是滚动的,那么需要你的页面**根节点为滚动视图**然后添加 adjustBottom="true",如果页面部分是可以滚动的,那就在页面最下面的滚动视图添加 adjustBottom="true" 属性;(技巧就是会被 tabBar 遮挡住的滚动视图添加属性)
- 绝对定位注意事项:跟vue页面一样,绝对定位的视图需要考虑 tabBar 的遮挡问题,例如想要一个 view 固定在页面最底部,需要设置 bottom 值为 tabBar 的高度即可;
**注意** android暂时不支持 adjustBottom
示例
``` vue
......
HBuilderX2.3.0开始云端打包支持配置XCode中的Capabilities,在XCode中可给工程添加设置Capabilities,如图所示:
![](https://native-res.dcloud.net.cn/images/uniapp/ios/xcode-capabilities.png)
配置后,会更新XCode工程的.entitlements和Info.plist文件,可将以上文件内容转换为json格式数据配置到manifest.json文件中,使得HBuilderX云端打包工程设置相应的Capabilities。
打开项目的manifest.json文件,在源码视图中进行配置
- 5 APP项目
在"plus" -> "distribute" -> "apple"添加"capabilities"节点
- uni-app项目
在"app-plus" -> "distribute" -> "ios"添加"capabilities"节点
```js
"capabilities": {
"entitlements": { // 合并到工程entitlements文件的数据(json格式)
},
"plists": { // 合并到工程Info.plist文件的数据(json格式)
}
},
```
其中entitlements数据(json)将转换成XCode工程中entitlements文件的数据(字典格式)
plists节点数据将转换成XCode工程中Info.plist文件的数据(字典格式)
<a id="unilink"/>
### 通用链接(Universal Link)
**为了简化配置使用通用链接,推荐使用UniCloud快速生成通用链接,详情参考:[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links)**
Universal Link是苹果在WWDC 2015上提出的iOS 9的新特性之一。此特性类似于深层链接,并能够方便地通过打开一个Https链接来直接启动您的客户端应用(手机有安装App)。对比起以往所使用的URL Sheme, 这种新特性在实现web-app的无缝链接时能够提供极佳的用户体验。
使用前请阅读[苹果官方文档](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW1)
**使用通用链接(Universal Link)必须要有域名,下面的配置中将要用到**
#### 第一步:开启Associated Domains服务
登录苹果开发者网站,在“Certificates, Identifiers & Profiles”页面选择“Identifiers”中选择对应的App ID,确保开启Associated Domains服务
![](https://native-res.dcloud.net.cn/images/uniapp/ios/apple-capabilities.png)
**开启Associated Domains服务后需要重新生成profile文件,提交云端打包时使用**
<a id="associatedDomains"/>
#### 第二步:配置Associated Domains(域名)
**使用HBuilderX可视化界面配置**
打开项目的manifest.json文件,切换到“App常用其它设置”项,在“iOS设置”下的“关联域(Associated Domains)”中进行配置:
![](https://native-res.dcloud.net.cn/images/uniapp/ios/hx-ass-domains.png)
**使用HBuilderX源码视图配置**
打开项目的manifest.json文件,切换到“源码视图”项,在uni-app项目在"app-plus" -> "distribute" -> "ios" -> "capabilities" -> "entitlements"节点下添加"com.apple.developer.associated-domains"字段,字段值为字符串数组,每个字符串为要关联的域名:
```json
"capabilities": {
"entitlements": {
"com.apple.developer.associated-domains": [
"applinks:demo.dcloud.net.cn"
]
}
}
```
**其中demo.dcloud.net.cn是应用通用链接的域名(这里不要包含path),请修改为自己应用要使用的域名**
> 5+ App项目源码视图配置节点为:"plus" -> "distribute" -> "apple" -> "capabilities" -> "entitlements"
保存后提交云端打包生效。
**本地离线打包配置**
在原生XCode工程中配置通用链接域名(使用HBuilderX云端打包跳过)
![](https://native-res.dcloud.net.cn/images/uniapp/ios/xcode-ass-domains1.png)
![](https://native-res.dcloud.net.cn/images/uniapp/ios/xcode-ass-domains2.png)
**HBuilderX中自带的默认真机运行基座HBuilderX注册的通用链接为:https://demo.dcloud.net.cn/ulink/**
#### 第三步:服务器配置apple-app-site-association文件
需要在上面域名对应的服务器上放apple-app-site-association文件。
apple-app-site-association文件配置如下:
```javascript
{
"applinks": {
"apps": [],
"details": [
{
"appID": "G56NU654TV.io.dcloud.HBuilder",
"paths": [ "/ulink/*"]
}
]
}
}
```
- apps
必须对应一个空的数组
- appID
由前缀和ID两部分组成,可以登录苹果开发者网站,在“Certificates, Identifiers & Profiles”页面选择“Identifiers”中选择对应的App ID查看
- paths
对应域名中的path,用于过滤可以跳转到App的链接,支持通配符*,?以及NOT进行匹配,匹配的优先级是从左至右依次降低
**注意:不要直接拷贝使用上面的示例,必须根据自己应用的配置修改**
把配置好的apple-app-site-association文件上传到你自己的服务器,确保通过https://demo.dcloud.net.cn/.well-known/apple-app-site-association可访问。
**其中demo.dcloud.net.cn为上面配置的域名**
应用安装后会通过访问上面的url向系统注册应用的通用链接。
> 推荐方案:将apple-app-site-association文件部署到,免费的阿里云版unicloud的 [前端网页托管](https://uniapp.dcloud.io/uniCloud/hosting?id=%e7%ae%80%e4%bb%8b)
### 客户端处理通用链接
可通过5+ API的[plus.runtime.launcher](https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.launcher)判断应用启动来源,如果其值为"uniLink"则表示通过通用链接启动应。
这时可通过5+ API的[plus.runtime.arguments](https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.arguments)获取启动参数,通用链接启动的情况将返回完整的通用链接地址。
### 注意事项
- apple-app-site-association文件不需要.json后缀
- 对apple-app-site-association文件的请求仅在App第一次启动时进行,如果此时网络连接出了问题apple会缓存请求,等有网的时候再去请求,如果没有请求此文件通用连接会失效
- iOS 9.2开始,在相同的domain内Universal Links不生效,必须要跨域才生效
iOS有UIWebview和WKWebview两种webview。从iOS13开始苹果将UIWebview列为过期API。
**2020年4月起App Store将不再接受使用UIWebView的新App上架、2020年12月起将不再接受使用UIWebView的App更新。**
从HBuilderX 2.2.5起,iOS上默认均已经是WKWebview,除非开发者手动在代码中指定要用UIWebview,否则实际渲染的页面都是在WKWebview里渲染的。
不过,虽然实际页面是WKWebview渲染的,但App底层引擎源码里仍然有UIWebview的可选引用。Appstore的机审会发现二进制代码中包括对UIWebview的引用,从而引发告警。
从HBuilderX 2.6.6起,uiWebview从基础引擎中移除,变成可选模块(manifest里选择)。机审也没有提示了。
老HBuilder和HBuilderX 2.2.5之前的版本,App端策略如下:
- 5+ APP(含wap2app)
默认为UIWebview。
- uni-app
vue页面中web-view组件默认使用UIWebview,nvue页面中web-view组件使用WKWebview。
**HBuilderX 2.2.5+版本已将iOS上所有webview的默认内核由UIWebview调整为WKWebview。**
<a id="uiwebview"/>
**HBuilderX 2.6.6+版本已将iOS中所有UIWebview代码从基础引擎中摘除,独立为UIWebview模块,如继续使用UIWebview则需在manifest中勾选使用UIWebview模块**
### 配置使用UIWebview模块
打开项目的manifest.json文件,在“App模块配置”中勾选“iOS UIWebview”:
![](https://native-res.dcloud.net.cn/images/uniapp/ios/uiwebview-manifest.png)
**提示**
> 使用UIWebview模块提交云端打包后才能生效,真机运行调试时请使用[自定义基座](http://ask.dcloud.net.cn/article/35115)
> 使用UIWebview模块后应用无法通过App Store审核
> 本地离线打包请参考:[配置UIWebview模块](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/uiwebview)
### 使用UIWebview
#### 5+App(含wap2app)如何切换iOS默认使用UIWebview或WKWebview内核?
HBuilderX 2.2.5以前的版本,iOS上webview的默认为UIWebview,HBuilderX2.2.5及以后的版本默认改为WKWebview。
如果要修改默认值,可在manifest.json中配置。
在manifest.json文件源码视图中设置plus -> kernel -> ios 的值为 "WKWebview"或"UIWebview":
```json
"plus": {
"kernel": {
"ios": "UIWebview" //或者 "WKWebview"
},
// ...
}
```
#### uni-app 如何配置web-view组件默认使用UIWebview或WKWebview内核?
HBuilderX 2.2.5以前的版本,iOS上vue页面中web-view组件或调用5+ API创建的Webview窗口默认为UIWebview,HBuilderX2.2.5及以后的版本默认改为WKWebview。
如果要修改默认值,可在manifest.json中配置。
在manifest.json文件源码视图中设置 app-plus -> kernel -> ios 的值为 "WKWebview"或"UIWebview":
```json
"app-plus": {
"kernel": {
"ios": "UIWebview" //或者 "WKWebview"
},
// ...
}
```
**nvue页面中的web-view组件强制使用WKWebview,不可配置**
#### 如何使用5+ API(plus.webview.create)创建Webview窗口时指定使用UIWebview或WKWebview内核?
创建Webvie窗口时可通过kernel属性指定内核,如下:
```javascript
// 通过kernel属性指定Webview的内核
var w = plus.webview.create('https://xxx.xxx.xxx', 'id', {
'kernel': 'UIWebview' //或者'WKWebview'
});
```
更多规范参考5+ API的 [WebviewStyles](https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewStyles)
### 使用WKWebview的影响
**使用WKWebview替换UIWebview将会影响以下功能:**
- 更严格的跨域访问限制
WKWebview认为本地html通过js访问网络及本地文件都算跨域访问(这种情况UIWebview不是跨域),跨域时访问网络资源使用5+ API(plus.net)来替换xmlhttp等传统ajax写法;ajax也不能访问本地文件,需使用5+ API(plus.io)读取本地文件,后者有个单独文章可参考:[https://ask.dcloud.net.cn/article/36858](https://ask.dcloud.net.cn/article/36858)
使用exif.js等三方库可能涉及跨目录的本地图片下载请求,图像方向获取和旋转Plus有专门的API,无需使用js库做。
- 由于WKWebview不支持跨域访问,标准的xhr或jq的ajax,都无法跨域。mui框架中网络请求判断为跨域访问会自动调用5+ API(plus.net),如果在mui.plusReady触发前调用,因为5+ API没有准备好会报“Script error.filename:lineno:0”错误,这时必须保证mui的网络请求在mui.plusReady后调用,或者直接改用plus.net写法。
- WKWebview下canvas也有跨域问题,比如canvas.toDataURL。
如果canvas使用网络图像遇到跨域问题,需要服务端设置图像的响应头:Access-Control-Allow-Origin
如果canvas使用本地图像遇到跨域问题,可以使用plus接口将图像转换为base64再使用,相关插件:https://ext.dcloud.net.cn/plugin?id=123
- iOS手机内存不足时,如果是UIWebview的应用,系统会整体回收这个App,现象是在重新打开已打开过的App时App整体重启。而WKWebview则是单个页面回收,这带来的坏处就是内存不足时,会单个页面白屏。详见[https://ask.dcloud.net.cn/article/35913](https://ask.dcloud.net.cn/article/35913)。uni-app不涉及此问题,如果是5+App,方式1是在manifest切回UIWebview,暂时UIWebview还可以上架,只是会收到警告。方式2时监听白屏事件,自行恢复页面:[https://ask.dcloud.net.cn/article/36540](https://ask.dcloud.net.cn/article/36540)
- iOS8、9上的WKWebview不支持websql,iOS10恢复支持
- 不支持plus.navigator.setCookie
- 不支持webview的overrideresource方法
- wk第一次渲染速度略慢于uiwebview;
- 由于资源拦截的API overrideresource 无法再使用,5+ APP(含wap2app)项目中,云打包时的js原生混淆功能会失效。如果要使用js原生混淆必须使用UIWebview。uni-app有单独的原生js加密方案,因为uni-app的js不运行在webview里,而是在独立的jscore里,所以不受影响。
但WKWebview的好处是:节省内存;滚动时懒加载的图片也可以实时渲染,而uiwebview在滚动停止后懒加载的图片才能显示。
如果同时在一个app里使用ui和wk两种webview,注意2种webview之间的cookie、localstorage、session不共享,但plus.storage是共享的。
### uni-app中Webview的使用注意
uni-app的js运行在独立的jscore中,而不是Webview中,不存在跨域问题。
uni-app的渲染层,在iOS下是强制wkwebview。如果你编写了renderjs代码,在渲染层执行js,则同样会遇到跨域问题。此时尽量把与跨域相关的操作放到普通的js逻辑层操作。
除了渲染层,还有一个web-view组件的问题要注意:
- uni-app的vue页面的web-view组件,从HBuilderX 2.2.5+起是WKWebview,之前版本默认是UIWebview
- uni-app的非自定义组件模式的js逻辑层,在HBuilderX 2.2.5之前是UIWebview。升级到HBuilderX2.3+后可能导致网络跨域问题,`fail{"statusCode":0,"errMsg":"request:fail abort"}`。不过非自定义组件已于2019年11月1日起停止支持。
如果需要调整uni-app下web-view组件的渲染内核设置,将manifest.json源码视图的app-plus -> kernel -> ios 的值设为 UIWebview。
#### uni-app的nvue页面问题
nvue页面不使用webview渲染,但其中的web-view组件说明如下。
- nvue的weex 组件模式
weex模式下的web-view组件是weex自己实现的,它目前仍然使用UIWebview。官方会追踪weex的升级。
- nvue的uni-app组件模式
web-view组件使用WKWebview。不可修改为uiWebview。
### 三方SDK中UIWebview的使用
目前如下SDK中仍然使用了UIWebview,不管是5+App还是uni-app。
- DCloud开屏广告
HBuilderX 2.2.5版之前,点击广告打开的内置网页仍然使用UIWebview加载
HBuilderX 2.2.5+版本已调整改为WKWebview。
- 支付宝
HBuilderX 2.6.10版本之前,支付宝SDK为15.5.7版本,包含了UIWebview
HBuilderX 2.6.10+版本已更新支付宝SDK为15.7.4,没有使用UIWebview
- 微信登录、分享、支付
HBuilderX 2.6.6+版本已更新微信SDK为1.8.6.2版本,没有使用UIWebview。
注意微信登录支付的SDK升级后,会强制要求通用链接。另见文档:[https://ask.dcloud.net.cn/article/36445](https://ask.dcloud.net.cn/article/36445)
- 微博登录、分享
HBuilderX 2.6.10版本之前,微博SDK为3.2.5版本,包含了UIWebview
HBuilderX 2.6.10+版本已更新微博SDK为3.2.7版本,没有使用UIWebview
- QQ登录、分享
HBuilderX 2.3.4+版本已更新QQSDK为3.3.6,没有使用UIWebview。
- 小米登录
小米官方SDK中使用了UIWebview,如果提交appstore建议不要使用小米登录
**5+App开发者建议直接升级为uni-app,一劳永逸,不会有跨域、白屏和无法加密等各种问题。**
### 注意事项
如果没有配置使用“iOS UIWebview”模块,提交App Store,仍然被提示含有UIWebview,那么请检查你的app是否使用了其他原生插件。
一般或者是配置错误,或者是三方原生插件造成。、
根据工业和信息化部关于开展APP侵害用户权益专项整治要求,应用的隐私政策中需详细描述使用权限的用途。
为了不避免应用使用过多权限,HBuilderX2.6.3+版本对应用默认要求的权限进行简化,对第三方SDK需要的权限提供方法根据实际需求进行配置。
### 默认使用的权限
提交云端打包后会自动添加以下权限:
```js
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
```
权限说明:
- android.permission.INTERNET
使用网络权限,应用基础权限
- android.permission.READ_EXTERNAL_STORAGE 和 android.permission.WRITE_EXTERNAL_STORAGE
读写SD卡权限,系统授权提示未“访问设备上的照片、媒体内容和文件”,可以参考这里配置应用启动时[申请读写手机存储策略](https://ask.dcloud.net.cn/article/36549#externalstorage)
- android.permission.READ_PHONE_STATE、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE
读取设备标识使用,用于[uni统计服务](https://tongji.dcloud.net.cn/),可以参考这里配置应用启动时[申请访问设备信息权限策略](https://ask.dcloud.net.cn/article/36549#phonestate)
- android.permission.INSTALL_PACKAGES、android.permission.REQUEST_INSTALL_PACKAGES
安装apk需要的权限,应用中使用[plus.runtime.install](https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.install)升级应用则需要此权限
**注意:HBuilder2.6.3+开始Goog Play渠道默认不再添加此权限,因为GooglePlay审核规则禁止应用下载apk更新,必须通过上传GooglePlay审核更新**
特定权限说明:
- com.asus.msa.SupplementaryDID.ACCESS
获取设备标识信息oaid在华硕设备上需要用到的权限
- com.huawei.android.launcher.permission.CHANGE_BADGE
设置应用角标功能在华为设备上需要用到的权限
- com.android.launcher.permission.INSTALL_SHORTCUT
创建桌面快捷方式权限,应用中使用[plus.navigator.createShortcut](https://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.createShortcut)创建桌面快捷方式则需要此权限
- com.android.launcher.permission.UNINSTALL_SHORTCUT
删除桌面快捷方式权限,应用中使用[native.js](https://www.html5plus.org/doc/zh_cn/android.html)删除桌面快捷方式则需要此权限
<a id='sdkpermission' />
### Android自动添加三方SDK(或模块)需要的权限
提交云端打包时,勾选使用三方SDK相关的功能模块时,默认会自动添加三方SDK需要的所有权限。
为了保证三方SDK(或模块)的功能完整,默认会添加可能需要的所有权限,如果应用只用到三方SDK提供的部分功能,不希望自动添加三方SDK需要的所有权限,可以去掉勾选“Android自动添加第三方SDK需要的权限”。
**为了向下兼容,云端打包默认会添加“Geolocation(定位)” -> “系统定位”模块,因此会默认添加定位权限,如果不需要定位权限,请在App权限配置界面去掉勾选“Android自定添加第三方SDK需要的权限”**
**注意:去掉自动添加第三方SDK需要的权限后,请务必根据需要在“Android权限配置”中勾选三方SDK必需的权限,三方SDK需要的权限详情参考后面《三方SDK(或模块)需要的权限列表》章节**
保存后提交云端打包生效。
#### 可视化界面配置
打开项目的manifest.json文件,在“App权限配置”项中去掉“Android自动添加第三方SDK需要的权限”
![](https://native-res.dcloud.net.cn/images/uniapp/permission/android-sdk.png)
#### 代码视图配置
打开项目的manifest.json文件,切换到“代码视图”。
- uni-app项目
在 "app-plus" -> "distribute" -> "android" 下添加 autoSdkPermissions 如下:
```json
"app-plus": {
"distribute": {
"android": {
"autoSdkPermissions": false, // 不自动添加第三方SDK需要的Android权限
//...
},
//...
},
//...
```
- 5+ APP(WAP2APP)项目
在 "plus" -> "distribute" -> "google" 下添加 autoSdkPermissions 如下:
```json
"plus": {
"distribute": {
"google": {
"autoSdkPermissions": false, // 不自动添加第三方SDK需要的Android权限
//...
},
//...
},
//...
```
### Android权限配置
打开项目的manifest.json文件,在“(App)模块权限配置”页的“Android权限配置”项下根据需求勾选需要的权限:
![](https://native-res.dcloud.net.cn/images/uniapp/permission/android.png)
**如果没有列出需要的权限,可按以下方法手动添加**
在manifest.json页面,切换到“代码视图”
- uni-app项目
在 "app-plus" -> "distribute" -> "android" -> "permissions" 下添加需要的权限如下:
```json
"app-plus": {
"distribute": {
"android": {
"permissions": [ //这里添加需要的Android权限
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>"
]
//...
},
//...
},
//...
```
- 5+ APP(WAP2APP)项目
在 "plus" -> "distribute" -> "google" -> "permissions" 下添加需要的权限如下:
```json
"app-plus": {
"distribute": {
"google": {
"permissions": [ //这里添加需要的Android权限
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>"
]
//...
},
//...
},
//...
```
### 三方SDK(或模块)需要的权限列表
#### Bluetooth(低功耗蓝牙)
```
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH\" />"
```
#### Contact(通讯录)
```
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>"
```
#### Fingerprint(指纹识别)
```
"<uses-permission android:name=\"android.permission.USE_FINGERPRINT\"/>"
```
#### iBeacon
```
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH\" />"
```
#### Maps(定位和地图)
- 高德地图
```
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.INTERNET\" />",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />"
```
- 百度地图
```
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\" />",
"<uses-permission android:name=\"android.permission.READ_LOGS\" />",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
```
#### Messaging(短彩邮件消息)
```
"<uses-permission android:name=\"android.permission.RECEIVE_SMS\"/>",
"<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
"<uses-permission android:name=\"android.permission.READ_SMS\"/>"
```
#### OAuth(登录鉴权)
- 微信登录
```
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"
```
- QQ登录
```
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"
```
- 新浪微博登录
- 小米登录
#### Payment(支付)
- 支付宝支付
```
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
```
- 微信支付
```
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"
```
#### Push(消息推送)
- uniPush
```
<!--个推通道必需权限 权限说明: https://docs.getui.com/getui/question/sdk/ -->
"<uses-permission android:name=\"android.permission.INTERNET\" />",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
"<uses-permission android:name=\"android.permission.VIBRATE\" />",
"<uses-permission android:name=\"android.permission.GET_TASKS\" />",
<!--个推通道 可选权限 用于电子围栏 -->
"<uses-permission android:name=\"android.permission.BLUETOOTH\" />(可选)",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />(可选)",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />(可选)",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />(可选)",
<!--厂商通道必需权限 小米-->
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_ADDED\" />",
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_CHANGED\" />",
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_INSTALL\" />",
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_REPLACED\" />",
"<uses-permission android:name=\"android.permission.RESTART_PACKAGES\" />",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\" />",
<!--厂商通道必需权限 魅族-->
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\" />",
<!--厂商通道必需权限 华为-->
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\" />"
```
**个推推送与uniPush一致**
#### Share(分享)
- 微信分享
```
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"
```
- QQ分享
```
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"
```
- 新浪微博分享
```
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.INTERNET\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />"
```
#### Speech(语音识别)
- 百度语音识别
```
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
"<uses-permission android:name=\"android.permission.INTERNET\" />",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />"
```
- 讯飞语音识别
```
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
"<uses-permission android:name=\"android.permission.INTERNET\" />",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\" />",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />"
```
#### Static(统计)
- 友盟统计
```
"<uses-permission android:name=\"android.permission.READ_LOGS\" />",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />",
"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\" />"
```
#### uni-AD
- 今日头条穿山甲广告联盟
```
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
"<uses-permission android:name=\"android.permission.GET_TASKS\"/>"
```
- 腾讯优量汇广告联盟
```
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />"
```
- 快手广告联盟
```
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />"
```
### 相关参考
- Android官方权限说明,参考:[https://developer.android.google.cn/guide/topics/permissions/overview](https://developer.android.google.cn/guide/topics/permissions/overview?hl=zh_cn)
- Android官方权限常量文档,参考:[https://developer.android.google.cn/reference/android/Manifest.permission](https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh_cn)
### 开通
- 登录[腾讯开放平台](https://connect.qq.com/index.html),打开 “应用管理” -> “移动应用” 页面
- 在页面中选择 “创建应用” -> “创建移动应用”,根据提示填写信息创建应用
- 创建成功后,在应用详情中页面可以获取 APP ID
- 在应用详情页面的 “基本信息” -> “平台信息” 中,点击“修改”可以设置iOS平台的通用链接(UniversalLink)
更多信息详见QQ官方文档 [移动应用接入概述](https://wiki.connect.qq.com/%e7%a7%bb%e5%8a%a8%e5%ba%94%e7%94%a8%e6%8e%a5%e5%85%a5%e6%a6%82%e8%bf%b0)
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“Share(分享)”下,勾选“QQ分享”:
![](https://native-res.dcloud.net.cn/images/uniapp/share/qq-manifest.png)
- appid
QQ开放平台申请应用的AppID值
- UniversalLinks
iOS平台通用链接,必须与QQ开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
- HBuilderX中标准真机运行基座使用的是DCloud申请HBuilder应用的AppID等信息,仅用于体验QQ分享功能
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用QQ分享
- uni-app项目
调用 [uni.share(OBJECT)](api/plugins/share#share) 发起分享操作,OBJECT参数中provider属性值固定为`qq`
- 5+ App项目
调用 [plus.share.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.getServices) 获取分享服务对象 [ShareService](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService), 再调用其 [send](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService.send) 方法发送分享消息
#### 示例代码
- uni-app项目
``` js
uni.share({
provider: 'qq',
summary: "我正在使用HBuilderX开发uni-app,赶紧跟我一起来体验!",
success: function (res) {
console.log("success:" + JSON.stringify(res));
},
fail: function (err) {
console.log("fail:" + JSON.stringify(err));
}
});
```
- 5+ App项目
``` js
var qqShare = null;
plus.share.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取QQ分享对象
if (service.id == 'qq') {
qqShare = service;
break;
}
}
qqShare.send( {
content: '我正在使用HBuilderX开发App,赶紧跟我一起来体验!'
}, function(){
// 分享成功
}, function(err) {
// 分享操作失败
// err.code是错误码
})
}, function(err) {
// 获取 services 失败
})
```
### 开通
- 登录[新浪微博开放平台](http://open.weibo.com/),打开 “移动应用 MOBILE” 页面
- 在页面中选择 “立即接入”,根据提示填写信息创建应用
- 创建成功后,在 “我的应用” 中点击应用,可以在应用详情页面
- 在应用详情页面的 “应用信息” -> “基本信息” 中可获取 App Key,点击编辑可设置iOS平台的通用链接(UniversalLink)
更多信息详见新浪微博官方文档 [移动应用接入](https://open.weibo.com/wiki/Connect/login)
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“Share(分享)”下,勾选“新浪微博分享”:
![](https://native-res.dcloud.net.cn/images/uniapp/share/sina-manifest.png)
- appkey
新浪微博开放平台申请应用的AppKey值
- redirect_url
新浪微博开放平台申请应用中设置的回调页
- UniversalLinks
iOS平台通用链接,必须与新浪微博开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
- HBuilderX中标准真机运行基座使用的是DCloud申请HBuilder应用的AppID等信息,仅用于体验新浪微博分享功能
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用新浪微博分享
- uni-app项目
调用 [uni.share(OBJECT)](api/plugins/share#share) 发起分享操作,OBJECT参数中provider属性值固定为`sinaweibo`
- 5+ App项目
调用 [plus.share.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.getServices) 获取分享服务对象 [ShareService](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService), 再调用其 [send](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService.send) 方法发送分享消息
#### 示例代码
- uni-app项目
``` js
uni.share({
provider: 'sinaweibo',
summary: "我正在使用HBuilderX开发uni-app,赶紧跟我一起来体验!",
success: function (res) {
console.log("success:" + JSON.stringify(res));
},
fail: function (err) {
console.log("fail:" + JSON.stringify(err));
}
});
```
- 5+ App项目
``` js
var weiboShare = null;
plus.share.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取微博分享对象
if (service.id == 'sinaweibo') {
weiboShare = service;
break;
}
}
weiboShare.send( {
content: '我正在使用HBuilderX开发App,赶紧跟我一起来体验!'
}, function(){
// 分享成功
}, function(err) {
// 分享操作失败
// err.code是错误码
})
}, function(err) {
// 获取 services 失败
})
```
### 开通
- 登录[微信开放平台](https://open.weixin.qq.com/),添加移动应用并提交审核,审核通过后可获取应用ID(AppID)
- 在应用详情中确认已获取`分享到朋友圈``分享给朋友`等接口
- 在HBuilderX中配置appid、iOS通用链接后即可打包使用微信分享功能
更多信息详见微信官方文档 [分享与收藏功能](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Share_and_Favorites/Share_and_Favorites.html)
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“Share(分享)”下,勾选“微信分享”:
![](https://native-res.dcloud.net.cn/images/uniapp/share/weixin-manifest.png)
- appid
微信开放平台申请应用的AppID值
- UniversalLinks
iOS平台通用链接,必须与微信开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
- HBuilderX中标准真机运行基座使用的是DCloud申请HBuilder应用的AppID等信息,仅用于体验微信分享功能
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用微信分享
- uni-app项目
调用 [uni.share(OBJECT)](api/plugins/share#share) 发起分享操作,OBJECT参数中provider属性值固定为`weixin`
- 5+ App项目
调用 [plus.share.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.getServices) 获取分享服务对象 [ShareService](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService), 再调用其 [send](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService.send) 方法发送分享消息
#### 示例代码
- uni-app项目
``` js
uni.share({
provider: "weixin",
scene: "WXSceneSession",
type: 1,
summary: "我正在使用HBuilderX开发uni-app,赶紧跟我一起来体验!",
success: function (res) {
console.log("success:" + JSON.stringify(res));
},
fail: function (err) {
console.log("fail:" + JSON.stringify(err));
}
});
```
- 5+ App项目
``` js
var weixinShare = null;
plus.share.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取微信分享对象
if (service.id == 'weixin') {
weixinShare = service;
break;
}
}
weixinShare.send( {
content: '我正在使用HBuilderX开发App,赶紧跟我一起来体验!'
}, function(){
// 分享成功
}, function(err) {
// 分享操作失败
// err.code是错误码
})
}, function(err) {
// 获取 services 失败
})
```
App端Share(分享)模块封装了市场上主流的三方分享SDK,提供JS API统一调用分享功能。
|项目类型|API|
|:-|:-|
|uni-app|[uni.share(OBJECT)](api/plugins/share#share)[uni.shareWithSystem(OBJECT)](api/plugins/share#sharewithsystem)|
|5+App/Wap2App|[plus.share.*](https://www.html5plus.org/doc/zh_cn/share.html)
uni-app项目中,官方提供了封装好的[uni-share](https://ext.dcloud.net.cn/plugin?id=4860)插件方便开发者使用。
使用分享功能需在项目manifest.json的“App模块配置”中勾选“Share(分享)”,并根据项目实际情况勾选使用的三方分享平台:
![](https://native-res.dcloud.net.cn/images/uniapp/share/modules.png)
> 提示:三方分享模块参数配置需提交云端打包后才能生效,真机运行调试时请使用[自定义基座](http://ask.dcloud.net.cn/article/35115)
使用分享功能基本流程:
- 向三方分享平台申请开通,有些平台(如微信分享)申请成功后会获取appid
- 在HBuilderX中配置申请的参数(如appid等),提交云端打包生成[自定义基座](http://ask.dcloud.net.cn/article/35115)
- 在App项目中调用API进行分享操作
支持的三方分享平台:
- [微信分享](tutorial/app-share-weixin)
- [QQ分享](tutorial/app-share-qq)
- [新浪微博分享](tutorial/app-share-sina)
App端Speech(语音输入)模块封装了市场上主流的三方语音识别SDK,提供JS API统一调用语音识别功能。
**注意**
uni-app没有封装语音相关API,需要调用5+ API的[plus.speech.*](https://www.html5plus.org/doc/zh_cn/speech.html)
使用语音识别功能需在项目manifest.json的“App模块配置”中勾选“Speech(语音输入)”,并根据项目实际情况勾选使用的三方语音识别平台:
![](https://native-res.dcloud.net.cn/images/uniapp/speech/modules.png)
> 提示:三方语音识别模块参数配置需提交云端打包后才能生效,真机运行调试时请使用[自定义基座](http://ask.dcloud.net.cn/article/35115)
使用语音功能基本流程:
- 向三方语音识别平台申请开通,申请成功后会获取AppId、API Key、Secret Key等参数
- 在HBuilderX中配置申请的参数(如AppId等),提交云端打包生成[自定义基座](http://ask.dcloud.net.cn/article/35115)
- 在App项目中调用API进行语音识别操作
支持的三方登录平台:
- 百度语音识别
需要向[百度语音开放平台](https://console.bce.baidu.com/ai/?fromai=1#/ai/speech/overview/index)申请AppID、API Key、Secret Key。
**支持自定义语音识别界面,参考下面示例中的“自定义语音识别”源码**
- 讯飞语音识别(不建议使用)
无需配置SDK参数,由于讯飞语音识别SDK绑定appid,云端打包只能固定使用DCloud申请的appid,虽然无需开发者向讯飞语音开放平台申请应用,但也导致无法在讯飞语音开放平台自定义应用个性化的高级语音识别参数配置。
**注意:讯飞语音识别有识别次数限制,推荐优先使用百度语音识别**
### 配置百度语音识别
打开项目的manifest.json文件,在“App模块配置”项的“Speech(语音输入)”下,勾选“百度语音识别”:
![](https://native-res.dcloud.net.cn/images/uniapp/speech/baidu-manifest.png)
以下配置参数需要到[百度语音开放平台](https://console.bce.baidu.com/ai/)申请
- appid:
百度语音开放平台申请的AppID
- apikey:
百度语音开放平台申请的API Key
- secretkey:
百度语音开放平台申请的Secret Key
### 使用百度语音识别
- 使用默认语音识别界面
```js
var options = {
engine: 'baidu'
};
text.value = '';
console.log('开始语音识别:');
plus.speech.startRecognize(options, function(s){
console.log(s);
text.value += s;
}, function(e){
console.log('语音识别失败:'+JSON.stringify(e));
} );
```
- 自定义语音识别界面
``` html
<template>
<view class="content">
<textarea class="result" placeholder="语音识别内容" :value="result"></textarea>
<view class="recogniz">
<view style="color: #0000CC;">
<text>{{title}}</text>
</view>
<view class="partial">
<text>{{partialResult}}</text>
</view>
<view class="volume" :style="{width:valueWidth}"></view>
</view>
<button type="default" @touchstart="startRecognize" @touchend="endRecognize">按下开始&amp;松开结束</button>
</view>
</template>
<script>
export default {
data() {
return {
title: '未开始',
text: '',
partialResult: '...',
result: '',
valueWidth: '0px'
}
},
onLoad() {
// #ifdef APP-PLUS
// 监听语音识别事件
plus.speech.addEventListener('start', this.ontStart, false);
plus.speech.addEventListener('volumeChange', this.onVolumeChange, false);
plus.speech.addEventListener('recognizing', this.onRecognizing, false);
plus.speech.addEventListener('recognition', this.onRecognition, false);
plus.speech.addEventListener('end', this.onEnd, false);
// #endif
},
methods: {
ontStart() {
this.title = '...倾听中...';
this.text = '';
console.log('Event: start');
},
onVolumeChange(e) {
this.valueWidth = 100*e.volume+'px';
console.log('Event: volumeChange '+this.valueWidth);
},
onRecognizing(e) {
this.partialResult = e.partialResult;
console.log('Event: recognizing');
},
onRecognition(e) {
this.text += e.result;
this.text?(this.text+='\n'):this.text='';
this.result = this.text;
this.partialResult = e.result;
console.log('Event: recognition');
},
onEnd() {
if(!this.text||this.text==''){
plus.nativeUI.toast('没有识别到内容');
}
this.result = this.text;
this.title = '未开始';
this.valueWidth = '0px';
this.partialResult = '...';
},
startRecognize() {
console.log('startRecognize');
// #ifdef APP-PLUS
plus.speech.startRecognize({
engine: 'baidu',
lang: 'zh-cn',
'userInterface': false,
'continue': true
});
// #endif
},
endRecognize() {
console.log('endRecognize');
// #ifdef APP-PLUS
plus.speech.stopRecognize();
// #endif
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.recogniz {
width: 200px;
height: 100px;
padding: 12px;
margin: 50px auto;
background-color: rgba(0,0,0,0.5);
border-radius: 16px;
text-align: center;
}
.partial {
width: 100%;
height: 40px;
margin-top: 16px;
font-size: 12px;
color: #FFFFFF;
}
.volume {
width: 10px;
height: 6px;
border-style:solid;
display:inline-block;
box-sizing:border-box;
border-width:1px;
border-color:#CCCCCC;
border-radius: 50%;
background-color: #00CC00;
}
.result {
color: #CCCCCC;
border: #00CCCC 1px solid;
margin: 25px auto;
padding: 6px;
width: 80%;
height: 100px;
}
</style>
```
......@@ -517,4 +517,4 @@
+ 阿里云 新增 云数据库支持 add 批量添加数据 [详情](https://uniapp.dcloud.io/uniCloud/cf-database?id=add)
#### 2020-02-24
+ 阿里云 新增 云函数互调功能 [详情](https://uniapp.dcloud.io/uniCloud/cf-functions?id=callbyfunction)
+ 阿里云 新增 云函数互调功能 [详情](https://uniapp.dcloud.io/uniCloud/cf-functions?id=callbyfunction)
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册