提交 6821006a 编写于 作者: D DCloud_LXH

fix: 错误链接

上级 8c150eb3
......@@ -669,7 +669,7 @@ uni.addInterceptor({
| API | 说明 |
| :-------------------------------------------------------------------------- | :---------------- |
| [uni.requireNativePlugin](/api/extend/native-plugin?id=requirenativeplugin) | 引入 App 原生插件 |
| [uni.requireNativePlugin](/plugin/native-plugin.md#requirenativeplugin) | 引入 App 原生插件 |
### 其他
......
* [概述](api/README.md)
* [概述](README.md)
* 基础
* [日志打印](api/log.md)
* [定时器](api/timer.md)
* [uni.base64ToArrayBuffer](api/base64ToArrayBuffer.md)
* [uni.arrayBufferToBase64](api/arrayBufferToBase64.md)
* [日志打印](log.md)
* [定时器](timer.md)
* [uni.base64ToArrayBuffer](base64ToArrayBuffer.md)
* [uni.arrayBufferToBase64](arrayBufferToBase64.md)
* 启动
* [uni.getLaunchOptionsSync](api/getLaunchOptionsSync.md)
* [uni.getEnterOptionsSync](api/getEnterOptionsSync.md)
* [应用级事件](api/application.md)
* [拦截器](api/interceptor.md)
* [全局API](api/global.md)
* [uni.canIUse](api/caniuse.md)
* [uni.getLaunchOptionsSync](getLaunchOptionsSync.md)
* [uni.getEnterOptionsSync](getEnterOptionsSync.md)
* [应用级事件](application.md)
* [拦截器](interceptor.md)
* [全局API](global.md)
* [uni.canIUse](caniuse.md)
* 网络
* [发起请求](api/request/request.md)
* [上传、下载](api/request/network-file.md)
* [WebSocket](api/request/websocket.md)
* [SocketTask](api/request/socket-task.md)
* [mDNS](api/request/mDNS.md)
* [UDP 通信](api/request/UDP.md)
* [页面和路由](/api/router)
* [uni.navigateTo](/api/router?id=navigateto)
* [uni.redirectTo](/api/router?id=redirectto)
* [uni.reLaunch](/api/router?id=relaunch)
* [uni.switchTab](/api/router?id=switchtab)
* [uni.navigateBack](/api/router?id=navigateback)
* [EventChannel](/api/router#event-channel)
* [uni.preloadPage](/api/preload-page)
* [窗口动画](/api/router?id=animation)
* [页面](api/window/window.md)
* [页面通讯](api/window/communication.md)
* [subNVue原生子窗体](api/window/subNVues.md)
* [数据缓存](/api/storage/storage)
* [uni.setStorage](/api/storage/storage?id=setstorage)
* [uni.setStorageSync](/api/storage/storage?id=setstoragesync)
* [uni.getStorage](/api/storage/storage?id=getstorage)
* [uni.getStorageSync](/api/storage/storage?id=getstoragesync)
* [uni.getStorageInfo](/api/storage/storage?id=getstorageinfo)
* [uni.getStorageInfoSync](/api/storage/storage?id=getstorageinfosync)
* [uni.removeStorage](/api/storage/storage?id=removestorage)
* [uni.removeStorageSync](/api/storage/storage?id=removestoragesync)
* [uni.clearStorage](/api/storage/storage?id=clearstorage)
* [uni.clearStorageSync](/api/storage/storage?id=clearstoragesync)
* [发起请求](request/request.md)
* [上传、下载](request/network-file.md)
* [WebSocket](request/websocket.md)
* [SocketTask](request/socket-task.md)
* [mDNS](request/mDNS.md)
* [UDP 通信](request/UDP.md)
* [页面和路由](router.md)
* [uni.navigateTo](router.md#navigateto)
* [uni.redirectTo](router.md#redirectto)
* [uni.reLaunch](router.md#relaunch)
* [uni.switchTab](router.md#switchtab)
* [uni.navigateBack](router.md#navigateback)
* [EventChannel](router.md#event-channel)
* [uni.preloadPage](preload-page)
* [窗口动画](router.md#animation)
* [页面](window/window.md)
* [页面通讯](window/communication.md)
* [subNVue原生子窗体](window/subNVues.md)
* [数据缓存](storage/storage.md)
* [uni.setStorage](storage/storage.md#setstorage)
* [uni.setStorageSync](storage/storage.md#setstoragesync)
* [uni.getStorage](storage/storage.md#getstorage)
* [uni.getStorageSync](storage/storage.md#getstoragesync)
* [uni.getStorageInfo](storage/storage.md#getstorageinfo)
* [uni.getStorageInfoSync](storage/storage.md#getstorageinfosync)
* [uni.removeStorage](storage/storage.md#removestorage)
* [uni.removeStorageSync](storage/storage.md#removestoragesync)
* [uni.clearStorage](storage/storage.md#clearstorage)
* [uni.clearStorageSync](storage/storage.md#clearstoragesync)
* 位置
* [获取位置](api/location/location.md)
* [查看位置](api/location/open-location.md)
* [位置更新](api/location/location-change.md)
* [地图组件控制](api/location/map.md)
* [获取位置](location/location.md)
* [查看位置](location/open-location.md)
* [位置更新](location/location-change.md)
* [地图组件控制](location/map.md)
* 媒体
* [图片](api/media/image.md)
* [文件](api/media/file.md)
* [录音管理](api/media/record-manager.md)
* [背景音频播放管理](api/media/background-audio-manager.md)
* [音频组件控制](api/media/audio-context.md)
* [视频](api/media/video.md)
* [视频组件控制](api/media/video-context.md)
* [相机组件控制](api/media/camera-context.md)
* [直播组件控制](api/media/live-player-context.md)
* [富文本](api/media/editor-context.md)
* [音视频合成](api/media/media-container.md)
* [图片](media/image.md)
* [文件](media/file.md)
* [录音管理](media/record-manager.md)
* [背景音频播放管理](media/background-audio-manager.md)
* [音频组件控制](media/audio-context.md)
* [视频](media/video.md)
* [视频组件控制](media/video-context.md)
* [相机组件控制](media/camera-context.md)
* [直播组件控制](media/live-player-context.md)
* [富文本](media/editor-context.md)
* [音视频合成](media/media-container.md)
* 设备
* 系统
* [uni.getSystemInfo](api/system/info.md)
* [uni.getDeviceInfo](api/system/getDeviceInfo.md)
* [uni.getWindowInfo](api/system/getWindowInfo.md)
* [uni.getAppBaseInfo](api/system/getAppBaseInfo.md)
* [uni.getAppAuthorizeSetting](api/system/getappauthorizesetting.md)
* [uni.getSystemSetting](api/system/getsystemsetting.md)
* [uni.openAppAuthorizeSetting](api/system/openappauthorizesetting.md)
* [内存](api/system/memory.md)
* [网络状态](api/system/network.md)
* [系统主题](api/system/theme.md)
* [加速度计](api/system/accelerometer.md)
* [罗盘](api/system/compass.md)
* [陀螺仪](api/system/gyroscope.md)
* [拨打电话](api/system/phone.md)
* [扫码](api/system/barcode.md)
* [剪贴板](api/system/clipboard.md)
* [屏幕亮度](api/system/brightness.md)
* [用户截屏事件](api/system/capture-screen.md)
* [振动](api/system/vibrate.md)
* [手机联系人](api/system/contact.md)
* [蓝牙](api/system/bluetooth.md)
* [低功耗蓝牙](api/system/ble.md)
* [iBeacon](api/system/ibeacon.md)
* [Wi-Fi](api/system/wifi.md)
* [电量](api/system/batteryInfo.md)
* [NFC](api/system/nfc.md)
* [设备方向](api/system/deviceMotion.md)
* [生物认证](api/system/authentication.md)
* [Worker](api/worker.md)
* [键盘](/api/key)
* [uni.hideKeyboard](/api/key?id=hidekeyboard)
* [uni.onKeyboardHeightChange](/api/key?id=onkeyboardheightchange)
* [uni.offKeyboardHeightChange](/api/key?id=offkeyboardheightchange)
* [uni.getSelectedTextRange](/api/key?id=getselectedtextrange)
* [uni.getSystemInfo](system/info.md)
* [uni.getDeviceInfo](system/getDeviceInfo.md)
* [uni.getWindowInfo](system/getWindowInfo.md)
* [uni.getAppBaseInfo](system/getAppBaseInfo.md)
* [uni.getAppAuthorizeSetting](system/getappauthorizesetting.md)
* [uni.getSystemSetting](system/getsystemsetting.md)
* [uni.openAppAuthorizeSetting](system/openappauthorizesetting.md)
* [内存](system/memory.md)
* [网络状态](system/network.md)
* [系统主题](system/theme.md)
* [加速度计](system/accelerometer.md)
* [罗盘](system/compass.md)
* [陀螺仪](system/gyroscope.md)
* [拨打电话](system/phone.md)
* [扫码](system/barcode.md)
* [剪贴板](system/clipboard.md)
* [屏幕亮度](system/brightness.md)
* [用户截屏事件](system/capture-screen.md)
* [振动](system/vibrate.md)
* [手机联系人](system/contact.md)
* [蓝牙](system/bluetooth.md)
* [低功耗蓝牙](system/ble.md)
* [iBeacon](system/ibeacon.md)
* [Wi-Fi](system/wifi.md)
* [电量](system/batteryInfo.md)
* [NFC](system/nfc.md)
* [设备方向](system/deviceMotion.md)
* [生物认证](system/authentication.md)
* [Worker](worker.md)
* [键盘](key.md)
* [uni.hideKeyboard](key.md#hidekeyboard)
* [uni.onKeyboardHeightChange](key.md#onkeyboardheightchange)
* [uni.offKeyboardHeightChange](key.md#offkeyboardheightchange)
* [uni.getSelectedTextRange](key.md#getselectedtextrange)
* 界面
* [交互反馈](api/ui/prompt.md)
* [设置导航条](api/ui/navigationbar.md)
* [设置TabBar](api/ui/tabbar.md)
* [背景](api/ui/bgcolor.md)
* [动画](api/ui/animation)
* [滚动](api/ui/scroll)
* [窗口](api/ui/window.md)
* [宽屏适配](api/ui/adapt.md)
* [字体](api/ui/font.md)
* [下拉刷新](api/ui/pulldown.md)
* [节点信息](api/ui/nodes-info.md)
* [节点布局相交状态](api/ui/intersection-observer.md)
* [媒体查询](api/ui/media-query-observer.md)
* [自定义组件](api/ui/nextTick.md)
* [菜单](api/ui/menuButton.md)
* [语言](api/ui/locale.md)
* [文件](/api/file/file)
* [uni.saveFile](/api/file/file?id=savefile)
* [uni.getSavedFileList](/api/file/file?id=getsavedfilelist)
* [uni.getSavedFileInfo](/api/file/file?id=getsavedfileinfo)
* [uni.removeSavedFile](/api/file/file?id=removesavedfile)
* [uni.getFileInfo](/api/file/file?id=getfileinfo)
* [uni.openDocument](/api/file/file?id=opendocument)
* [uni.getFileSystemManager](/api/file/getFileSystemManager)
* [交互反馈](ui/prompt.md)
* [设置导航条](ui/navigationbar.md)
* [设置TabBar](ui/tabbar.md)
* [背景](ui/bgcolor.md)
* [动画](ui/animation)
* [滚动](ui/scroll)
* [窗口](ui/window.md)
* [宽屏适配](ui/adapt.md)
* [字体](ui/font.md)
* [下拉刷新](ui/pulldown.md)
* [节点信息](ui/nodes-info.md)
* [节点布局相交状态](ui/intersection-observer.md)
* [媒体查询](ui/media-query-observer.md)
* [自定义组件](ui/nextTick.md)
* [菜单](ui/menuButton.md)
* [语言](ui/locale.md)
* [文件](file/file.md)
* [uni.saveFile](file/file.md#savefile)
* [uni.getSavedFileList](file/file.md#getsavedfilelist)
* [uni.getSavedFileInfo](file/file.md#getsavedfileinfo)
* [uni.removeSavedFile](file/file.md#removesavedfile)
* [uni.getFileInfo](file/file.md#getfileinfo)
* [uni.openDocument](file/file.md#opendocument)
* [uni.getFileSystemManager](file/getFileSystemManager.md)
* 绘画
* [uni.createOffscreenCanvas](api/canvas/createOffscreenCanvas.md)
* [uni.createCanvasContext](api/canvas/createCanvasContext.md)
* [uni.canvasToTempFilePath](api/canvas/canvasToTempFilePath.md)
* [uni.canvasPutImageData](api/canvas/canvasPutImageData.md)
* [uni.canvasGetImageData](api/canvas/canvasGetImageData.md)
* [CanvasContext](api/canvas/CanvasContext.md)
* [CanvasGradient](api/canvas/CanvasGradient.md)
* [uni.createOffscreenCanvas](canvas/createOffscreenCanvas.md)
* [uni.createCanvasContext](canvas/createCanvasContext.md)
* [uni.canvasToTempFilePath](canvas/canvasToTempFilePath.md)
* [uni.canvasPutImageData](canvas/canvasPutImageData.md)
* [uni.canvasGetImageData](canvas/canvasGetImageData.md)
* [CanvasContext](canvas/CanvasContext.md)
* [CanvasGradient](canvas/CanvasGradient.md)
* 广告
* [激励视频广告](api/a-d/rewarded-video.md)
* [全屏视频广告](api/a-d/full-screen-video.md)
* [内容联盟广告](api/a-d/content-page.md)
* [插屏广告](api/a-d/interstitial.md)
* [激励视频广告](a-d/rewarded-video.md)
* [全屏视频广告](a-d/full-screen-video.md)
* [内容联盟广告](a-d/content-page.md)
* [插屏广告](a-d/interstitial.md)
* 第三方服务
* [获取服务供应商](api/plugins/provider.md)
* [登录](api/plugins/login.md)
* [分享](api/plugins/share.md)
* [支付](api/plugins/payment.md)
* [推送](api/plugins/push.md)
* [语音](api/plugins/voice.md)
* [实人认证](api/plugins/facialRecognitionVerify.md)
* [一键生成iOS通用链接](api/plugins/universal-links.md)
* [uniCloud](api/uniCloud.md)
* [获取服务供应商](plugins/provider.md)
* [登录](plugins/login.md)
* [分享](plugins/share.md)
* [支付](plugins/payment.md)
* [推送](plugins/push.md)
* [语音](plugins/voice.md)
* [实人认证](plugins/facialRecognitionVerify.md)
* [一键生成iOS通用链接](plugins/universal-links.md)
* [uniCloud](uniCloud.md)
* 其他
* [授权](api/other/authorize.md)
* [设置](api/other/setting.md)
* [收货地址](api/other/choose-address.md)
* [获取发票抬头](api/other/invoice-title.md)
* [小程序跳转](api/other/open-miniprogram.md)
* [账号信息](api/other/getAccountInfoSync.md)
* [环境信息](api/other/getEnvInfoSync.md)
* [运动(计步器)](api/other/sport.md)
* [统计](api/other/report.md)
* [卡券](api/other/card.md)
* [模板消息](api/other/template.md)
* [订阅消息](api/other/requestSubscribeMessage.md)
* [小程序更新](api/other/update.md)
* [调试](api/other/set-enable-debug.md)
* [获取第三方平台数据](api/other/get-extconfig.md)
* [授权](other/authorize.md)
* [设置](other/setting.md)
* [收货地址](other/choose-address.md)
* [获取发票抬头](other/invoice-title.md)
* [小程序跳转](other/open-miniprogram.md)
* [账号信息](other/getAccountInfoSync.md)
* [环境信息](other/getEnvInfoSync.md)
* [运动(计步器)](other/sport.md)
* [统计](other/report.md)
* [卡券](other/card.md)
* [模板消息](other/template.md)
* [订阅消息](other/requestSubscribeMessage.md)
* [小程序更新](other/update.md)
* [调试](other/set-enable-debug.md)
* [获取第三方平台数据](other/get-extconfig.md)
* [uni ext api](extapi.md)
### 应用生命周期
``uni-app`` 支持 onLaunch、onShow、onHide 等应用生命周期函数,详情请参考[应用生命周期](/collocation/frame/lifecycle?id=app)
``uni-app`` 支持 onLaunch、onShow、onHide 等应用生命周期函数,详情请参考[应用生命周期](/collocation/App.md#applifecycle)
### 页面生命周期
``uni-app`` 支持 onLoad、onShow、onReady 等生命周期函数,详情请参考[页面生命周期](/collocation/frame/lifecycle?id=page)
\ No newline at end of file
``uni-app`` 支持 onLoad、onShow、onReady 等生命周期函数,详情请参考[页面生命周期](/tutorial/page.md#lifecycle)
\ No newline at end of file
......@@ -20,7 +20,7 @@ mapContext
|方法|参数|说明|平台差异说明|
|:-|:-|:-|:-|
|getCenterLocation|OBJECT|获取当前地图中心的经纬度,返回的是 gcj02 坐标系,可以用于 [uni.openLocation](api/location/location?id=getlocation)||
|getCenterLocation|OBJECT|获取当前地图中心的经纬度,返回的是 gcj02 坐标系,可以用于 [uni.openLocation](/api/location/location.md#getlocation)||
|moveToLocation|OBJECT|将地图中心移动到当前定位点,需要配合map组件的show-location使用||
|translateMarker|OBJECT|平移marker,带动画|app-nvue 2.1.5+、微信小程序带动画、抖音、支付宝、京东、百度、QQ小程序|
|includePoints|OBJECT|缩放视野展示所有经纬度|app-nvue 2.1.5+、微信、抖音、支付宝、京东、百度、快手、QQ小程序|
......
......@@ -34,7 +34,7 @@
- sourceType 值在 H5 平台根据浏览器的不同而表现不同,一般不可限制仅使用相册,部分浏览器也无法限制是否使用相机。
- extension暂只支持文件后缀名,例如`['.zip','.exe','.js']`,不支持`application/msword`等类似值
**注:文件的临时路径,在应用本次启动期间可以正常使用,如需持久保存,需在主动调用 [uni.saveFile](api/file/file?id=savefile),在应用下次启动时才能访问得到。**
**注:文件的临时路径,在应用本次启动期间可以正常使用,如需持久保存,需在主动调用 [uni.saveFile](/api/file/file.md#savefile),在应用下次启动时才能访问得到。**
**OBJECT.type 的合法值**
......
......@@ -37,7 +37,7 @@
**注意:**
* sourceType 值在 H5 平台根据浏览器的不同而表现不同,一般不可限制仅使用相册,部分浏览器也无法限制是否使用相机。
* app安卓端选择的视频最大只支持180MB,如需突破该限制请使用原生插件https://ext.dcloud.net.cn/search?q=%E6%96%87%E4%BB%B6%E9%80%89%E6%8B%A9
* 文件的临时路径,在应用本次启动期间可以正常使用,如需持久保存,需在主动调用 [uni.saveFile](api/file/file?id=savefile),在应用下次启动时才能访问得到。
* 文件的临时路径,在应用本次启动期间可以正常使用,如需持久保存,需在主动调用 [uni.saveFile](/api/file/file.md#savefile),在应用下次启动时才能访问得到。
* camera 部分 Android 手机下由于系统 ROM 不支持无法生效,打开拍摄界面后可操作切换
* 可以通过用户授权API来判断用户是否给应用授予相册或摄像头的访问权限[https://uniapp.dcloud.io/api/other/authorize](https://uniapp.dcloud.io/api/other/authorize)
* App下如需进一步压缩视频大小,可以在插件市场搜索[视频压缩](http://ext.dcloud.net.cn/search?q=%E8%A7%86%E9%A2%91%E5%8E%8B%E7%BC%A9)插件
......
......@@ -18,7 +18,7 @@ uni.login是一个客户端API,统一封装了各个平台的各种常见的
- [苹果登录(Sign in with Apple)](/tutorial/app-oauth-apple.md)
- [微信登录](/tutorial/app-oauth-weixin.md)
- [QQ登录](/tutorial/app-oauth-qq.md)
- [新浪微博登录](/tutorial/app-oauth-sina.md)
- [新浪微博登录](/tutorial/app-oauth-weibo.md)
- [Google登录](/tutorial/app-oauth-google.md)
- [Facebook登录](/tutorial/app-oauth-facebook.md)
......
......@@ -7,7 +7,7 @@
|参数|类型|必填|默认值|说明|平台差异说明|
|:-|:-|:-|:-|:-|:-|
|url|String|是||需要跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 'path?key=value&key2=value2',path为下一个页面的路径,下一个页面的onLoad函数可得到传递的参数| |
|animationType|String|否|pop-in|窗口显示的动画效果,详见:[窗口动画](api/router?id=animation)|App|
|animationType|String|否|pop-in|窗口显示的动画效果,详见:[窗口动画](#animation)|App|
|animationDuration|Number|否|300|窗口动画持续时间,单位为 ms|App|
|events|Object|否||页面间通信接口,用于监听被打开页面发送到当前页面的数据。2.8.9+ 开始支持。||
|success|Function|否||接口调用成功的回调函数||
......@@ -22,7 +22,7 @@
|属性|类型|说明|
|:-|:-|:-|
|eventChannel|[EventChannel](api/router?id=event-channel)|和被打开页面进行通信|
|eventChannel|[EventChannel](#event-channel)|和被打开页面进行通信|
**示例**
......@@ -200,7 +200,7 @@ uni.switchTab({
|参数|类型|必填|默认值|说明|平台差异说明|
|:-|:-|:-|:-|:-|:-|
|delta|Number|否|1|返回的页面数,如果 delta 大于现有页面数,则返回到首页。||
|animationType|String|否|pop-out|窗口关闭的动画效果,详见:[窗口动画](api/router?id=animation)|App|
|animationType|String|否|pop-out|窗口关闭的动画效果,详见:[窗口动画](#animation)|App|
|animationDuration|Number|否|300|窗口关闭动画的持续时间,单位为 ms|App|
|success|Function|否||接口调用成功的回调函数||
|fail|Function|否||接口调用失败的回调函数||
......
......@@ -43,7 +43,7 @@ var animation = uni.createAnimation({
```
**animation**
#### animation
动画实例可以调用以下方法来描述动画,调用结束后会返回自身,支持链式调用的写法。
......
......@@ -59,9 +59,9 @@ uni.hideToast();
```
### uni.showLoading(OBJECT)
### uni.showLoading(OBJECT)@showloading
显示 loading 提示框, 需主动调用 [uni.hideLoading](api/ui/prompt?id=hideloading) 才能关闭提示框。
显示 loading 提示框, 需主动调用 [uni.hideLoading](#hideloading) 才能关闭提示框。
**OBJECT参数说明**
......@@ -81,7 +81,7 @@ uni.showLoading({
});
```
### uni.hideLoading()
### uni.hideLoading()@hideloading
隐藏 loading 提示框。
......@@ -97,7 +97,7 @@ setTimeout(function () {
}, 2000);
```
### uni.showModal(OBJECT)
### uni.showModal(OBJECT)@showmodal
显示模态弹窗,可以只有一个确定按钮,也可以同时有确定和取消按钮。类似于一个API整合了 html 中:alert、confirm。
......
......@@ -33,10 +33,10 @@ selector类似于 CSS 的选择器,但仅支持下列语法。
## uni-app x 注意事项
1. app-uvue支持的选择器较少,不支持ID选择器,[详见](uni-app-x/css/README.md#选择器)
2. app-uvue的页面滚动,是由页面最外层的scroll-view模拟的,如果页面最外层不是scroll-view,无法使用本api。[详见](uni-app-x/css/README.md#pagescroll)
3. app-uvue的scroll-view滚动时,如需动画,则需要在scroll-view的属性中配置 `scroll-with-animation="true"`[详见](component/scroll-view.md)
4. scroll-view的滚动,设置其scrollTop即可。[详见](component/scroll-view.md)
1. app-uvue支持的选择器较少,不支持ID选择器,[详见](https://doc.dcloud.net.cn/uni-app-x/css/#%E9%80%89%E6%8B%A9%E5%99%A8)
2. app-uvue的页面滚动,是由页面最外层的scroll-view模拟的,如果页面最外层不是scroll-view,无法使用本api。[详见](https://doc.dcloud.net.cn/uni-app-x/css/#pagescroll)
3. app-uvue的scroll-view滚动时,如需动画,则需要在scroll-view的属性中配置 `scroll-with-animation="true"`[详见](/component/scroll-view.md)
4. scroll-view的滚动,设置其scrollTop即可。[详见](/component/scroll-view.md)
**示例**
......
......@@ -116,9 +116,9 @@ subNVue.setStyle({
```
### subNVue.postMessage(OBJECT)
### subNVue.postMessage(OBJECT)
发送消息,此通讯方式已过时,请使用`uni.$emit`进行通讯,[参考](/collocation/frame/communication?id=emit)
发送消息,此通讯方式已过时,请使用`uni.$emit`进行通讯,[参考](/tutorial/page.md#emit)
**代码示例**
......@@ -131,9 +131,9 @@ subNvue.postMessage({
})
```
### subNVue.onMessage(CallBack)
### subNVue.onMessage(CallBack)
监听消息,此通讯方式已过时,请使用`uni.$on`进行通讯,[参考](/collocation/frame/communication?id=on)
监听消息,此通讯方式已过时,请使用`uni.$on`进行通讯,[参考](/tutorial/page.md#on)
**代码示例**
......
* [pages.json 页面路由](collocation/pages.md)
* [manifest.json 应用配置](collocation/manifest.md)
* [App 完整manifest.json](collocation/manifest-app.md)
* [pages.json 页面路由](pages.md)
* [manifest.json 应用配置](manifest.md)
* [App 完整manifest.json](manifest-app.md)
* [AndroidManifest.xml(安卓原生配置)](/tutorial/app-nativeresource-android.md)
* [Info.plist(iOS原生配置)](/tutorial/app-nativeresource-ios.md)
* [App.vue/uvue](collocation/App.md)
* [main.js/uts](collocation/main.md)
* [uni.scss](collocation/uni-scss.md)
* [package.json](collocation/package.md)
* [vue.config.js](collocation/vue-config.md)
* [vite.config.js](collocation/vite-config.md)
* [App.vue/uvue](App.md)
* [main.js/uts](main.md)
* [uni.scss](uni-scss.md)
* [package.json](package.md)
* [vue.config.js](vue-config.md)
* [vite.config.js](vite-config.md)
......@@ -92,7 +92,7 @@ splash(启动封面)是App必然存在的、不可取消的。
|autoclose|Boolean|true|是否自动关闭启动界面,仅当alwaysShowBeforeRender设置为false时生效,如果需要[手动关闭](https://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.closeSplashscreen)启动界面,需将 alwaysShowBeforeRender 及 autoclose 均设置为 false。||
|waiting|Boolean|true|是否在程序启动界面显示等待圈或雪花||
alwaysShowBeforeRender和autoclose属性组合设置,可配置以下三种关闭启动界面(splash)策略,[详见](tutorial/app-splashscreen)
alwaysShowBeforeRender和autoclose属性组合设置,可配置以下三种关闭启动界面(splash)策略,[详见](../tutorial/app-splashscreen.md)
**注意**
......@@ -100,7 +100,7 @@ alwaysShowBeforeRender和autoclose属性组合设置,可配置以下三种关
- splash只能是标准png,不要用jpg改名为png。也不支持gif等动画
- 相关改动,云打包生效,真机运行不生效。本地打包需自行在原生工程中配置
- App启动图中iOS的MAX等大屏设备的splash图若不配,会导致iOS认为此App没有为MAX优化,App将无法全屏,四周会有黑边
- Android的splash支持.9.png,[详见](tutorial/app-splashscreen?id=9png)
- Android的splash支持.9.png,[详见](../tutorial/app-splashscreen.md#9png)
#### App Modules@modules
......
......@@ -486,7 +486,7 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽
- `titleNView``type` 值为 `transparent` 时,导航栏为滚动透明渐变导航栏,默认只有button,滚动后标题栏底色和title文字会渐变出现,不支持自定义按钮设置color属性; `type``float` 时,导航栏为悬浮标题栏,此时页面内容上顶到了屏幕顶部,包括状态栏,但导航栏悬浮盖在页面上方,一般这种场景会同时设置导航栏的背景色为rgba半透明颜色。
- `titleNView``type` 值为 `transparent` 时,App-nvue 2.4.4+ 支持
-`titleNView` 配置 `buttons` 后,监听按钮的点击事件,vue 页面及 nvue 的weex编译模式参考:[uni.onNavigationBarButtonTap](/tutorial/nvue-outline?id=onnavigationbarbuttontap)
-`titleNView` 配置 `searchInput` 后,相关的事件监听参考:[onNavigationBarSearchInputChanged 等](/collocation/frame/lifecycle?id=页面生命周期)
-`titleNView` 配置 `searchInput` 后,相关的事件监听参考:[onNavigationBarSearchInputChanged 等](/tutorial/page.md#lifecycle)
- 可通过 `[<navigation-bar>(/component/navigation-bar)]` 配置
- App下原生导航栏的按钮如果使用字体图标,注意检查字体库的名字(font-family)是否使用了默认的 iconfont,这个名字是保留字,不能作为外部引入的字体库的名字,需要调整为自定义的名称,否则无法显示。
- 想了解各种导航栏的开发方法,请详读[导航栏开发指南](https://ask.dcloud.net.cn/article/34921)
......@@ -932,7 +932,7 @@ h5 平台下拉刷新动画,只有 circle 类型。
┌─components
│ └─comp-a
│ └─comp-a.vue 符合easycom规范的组件
└─uni_modules [uni_module](/uni_modules)中符合easycom规范的组件
└─uni_modules [uni_module](/plugin/uni_modules.md)中符合easycom规范的组件
└─uni_modules
└─uni-list
└─components
......
......@@ -63,7 +63,7 @@
|属性名|类型|描述|注解|
|:-|:-|:-|:-|
|id|String|组件的唯一标示|一般用于获取组件上下文对象(如:[VideoContext](/api/media/video-context)),需要保持整个页面唯一|
|ref|String|vue中组件的唯一标示|用来给子组件注册引用信息,详见 [Vue 文档](/vue-components?id=ref)|
|ref|String|vue中组件的唯一标示|用来给子组件注册引用信息,详见 [Vue 文档](/tutorial/vue-components?id=ref)|
|class|String|组件的样式类|在对应的 css 中定义的样式类|
|style|String|组件的内联样式|可以动态设置的内联样式|
|hidden|Boolean|组件是否隐藏|所有组件默认是显示的|
......
* [组件概述](component/)
* [组件概述](README.md)
* 内置组件
* [uni-app 组件](component/view.md)
* [视图容器](component/view.md)
* [view](component/view.md)
* [scroll-view](component/scroll-view.md)
* [swiper](component/swiper.md)
* [match-media](component/match-media.md)
* [movable-area](component/movable-area.md)
* [movable-view](component/movable-view.md)
* [cover-view](/component/cover-view.md)
* [cover-image](/component/cover-image.md)
* [基础内容](component/icon.md)
* [icon](component/icon.md)
* [text](component/text.md)
* [rich-text](component/rich-text.md)
* [progress](component/progress.md)
* [表单组件](component/button.md)
* [button](component/button.md)
* [checkbox](component/checkbox.md)
* [editor](component/editor.md)
* [form](component/form.md)
* [input](component/input.md)
* [label](component/label.md)
* [picker](component/picker.md)
* [picker-view](component/picker-view.md)
* [radio](component/radio.md)
* [slider](component/slider.md)
* [switch](component/switch.md)
* [textarea](component/textarea.md)
* [路由与页面跳转](component/navigator.md)
* [navigator](component/navigator.md)
* [媒体组件](component/audio.md)
* [animation-view](component/animation-view.md)
* [audio](component/audio.md)
* [camera](component/camera.md)
* [image](component/image.md)
* [video](component/video.md)
* [live-player](component/live-player.md)
* [live-pusher](component/live-pusher.md)
* [地图](component/map.md)
* [map](component/map.md)
* [画布](component/canvas.md)
* [canvas](component/canvas.md)
* [webview](component/web-view.md)
* [web-view](component/web-view.md)
* [广告](component/ad.md)
* [信息流(Banner)](component/ad.md)
* [激励视频广告](component/ad-rewarded-video.md)
* [uniMP激励视频广告](component/uni-ad-unimp.md)
* [全屏视频广告](component/ad-fullscreen-video.md)
* [插屏广告](component/ad-interstitial.md)
* [Draw视频信息流广告](component/ad-draw.md)
* [短视频内容联盟广告](component/ad-content-page.md)
* [互动广告](component/ad-interactive.md)
* [微信小程序](component/ad-weixin.md)
* [微信小程序格子广告](component/ad-grid.md)
* [广告错误码](component/ad-error-code.md)
* [uni-app 组件](view.md)
* [视图容器](view.md)
* [view](view.md)
* [scroll-view](scroll-view.md)
* [swiper](swiper.md)
* [match-media](match-media.md)
* [movable-area](movable-area.md)
* [movable-view](movable-view.md)
* [cover-view](cover-view.md)
* [cover-image](cover-image.md)
* [基础内容](icon.md)
* [icon](icon.md)
* [text](text.md)
* [rich-text](rich-text.md)
* [progress](progress.md)
* [表单组件](button.md)
* [button](button.md)
* [checkbox](checkbox.md)
* [editor](editor.md)
* [form](form.md)
* [input](input.md)
* [label](label.md)
* [picker](picker.md)
* [picker-view](picker-view.md)
* [radio](radio.md)
* [slider](slider.md)
* [switch](switch.md)
* [textarea](textarea.md)
* [路由与页面跳转](navigator.md)
* [navigator](navigator.md)
* [媒体组件](audio.md)
* [animation-view](animation-view.md)
* [audio](audio.md)
* [camera](camera.md)
* [image](image.md)
* [video](video.md)
* [live-player](live-player.md)
* [live-pusher](live-pusher.md)
* [地图](map.md)
* [map](map.md)
* [画布](canvas.md)
* [canvas](canvas.md)
* [webview](web-view.md)
* [web-view](web-view.md)
* [广告](ad.md)
* [信息流(Banner)](ad.md)
* [激励视频广告](ad-rewarded-video.md)
* [uniMP激励视频广告](uni-ad-unimp.md)
* [全屏视频广告](ad-fullscreen-video.md)
* [插屏广告](ad-interstitial.md)
* [Draw视频信息流广告](ad-draw.md)
* [短视频内容联盟广告](ad-content-page.md)
* [互动广告](ad-interactive.md)
* [微信小程序](ad-weixin.md)
* [微信小程序格子广告](ad-grid.md)
* [广告错误码](ad-error-code.md)
* [uniCloud-db云数据库](https://doc.dcloud.net.cn/uniCloud/unicloud-db.html)
* [页面属性配置节点](component/page-meta.md)
* [page-meta](component/page-meta.md)
* [navigation-bar](component/navigation-bar.md)
* [custom-tab-bar](component/custom-tab-bar.md)
* [基础组件中原生组件说明](component/native-component.md)
* [Vue 组件](component/vue-component.md)
* [NVUE 组件](component/barcode.md)
* [barcode](component/barcode.md)
* [list](component/list.md)
* [cell](component/cell.md)
* [recycle-list](component/recycle-list.md)
* [waterfall](component/waterfall.md)
* [refresh](component/refresh.md)
* [小程序组件](component/official-account.md)
* [official-account](component/official-account.md)
* [open-data](component/open-data.md)
* [页面属性配置节点](page-meta.md)
* [page-meta](page-meta.md)
* [navigation-bar](navigation-bar.md)
* [custom-tab-bar](custom-tab-bar.md)
* [基础组件中原生组件说明](native-component.md)
* [Vue 组件](vue-component.md)
* [NVUE 组件](barcode.md)
* [barcode](barcode.md)
* [list](list.md)
* [cell](cell.md)
* [recycle-list](recycle-list.md)
* [waterfall](waterfall.md)
* [refresh](refresh.md)
* [小程序组件](official-account.md)
* [official-account](official-account.md)
* [open-data](open-data.md)
* 扩展组件(uni-ui)
* [介绍](component/uniui/uni-ui.md)
* [开始使用](component/uniui/quickstart.md)
* [色彩说明](component/uniui/color.md)
* [uni-sass 辅助样式](component/uniui/uni-sass.md)
* [uni-badge 数字角标](component/uniui/uni-badge.md)
* [uni-breadcrumb 面包屑](component/uniui/uni-breadcrumb.md)
* [uni-calendar 日历](component/uniui/uni-calendar.md)
* [uni-card 卡片](component/uniui/uni-card.md)
* [uni-collapse 折叠面板](component/uniui/uni-collapse.md)
* [uni-combox 组合框](component/uniui/uni-combox.md)
* [uni-countdown 倒计时](component/uniui/uni-countdown.md)
* [uni-data-checkbox 数据选择器](component/uniui/uni-data-checkbox.md)
* [uni-data-picker 级联选择器](component/uniui/uni-data-picker.md)
* [uni-data-select 下拉框](component/uniui/uni-data-select.md)
* [uni-dateformat 日期格式化](component/uniui/uni-dateformat.md)
* [uni-datetime-picker 日期选择器](component/uniui/uni-datetime-picker.md)
* [uni-drawer 抽屉](component/uniui/uni-drawer.md)
* [uni-easyinput 增强输入框](component/uniui/uni-easyinput.md)
* [uni-fab 悬浮按钮](component/uniui/uni-fab.md)
* [uni-fav 收藏按钮](component/uniui/uni-fav.md)
* [uni-file-picker 文件选择上传](component/uniui/uni-file-picker.md)
* [uni-forms 表单](component/uniui/uni-forms.md)
* [uni-goods-nav 商品导航](component/uniui/uni-goods-nav.md)
* [uni-grid 宫格](component/uniui/uni-grid.md)
* [uni-group 分组](component/uniui/uni-group.md)
* [uni-icons 图标](component/uniui/uni-icons.md)
* [uni-indexed-list 索引列表](component/uniui/uni-indexed-list.md)
* [uni-link 超链接](component/uniui/uni-link.md)
* [uni-list 列表](component/uniui/uni-list.md)
* [uni-load-more 加载更多](component/uniui/uni-load-more.md)
* [uni-nav-bar 自定义导航栏](component/uniui/uni-nav-bar.md)
* [uni-notice-bar 通告栏](component/uniui/uni-notice-bar.md)
* [uni-number-box 数字输入框](component/uniui/uni-number-box.md)
* [uni-pagination 分页器](component/uniui/uni-pagination.md)
* [uni-popup 弹出层](component/uniui/uni-popup.md)
* [uni-rate 评分](component/uniui/uni-rate.md)
* [uni-row 布局-行](component/uniui/uni-row.md)
* [uni-search-bar 搜索栏](component/uniui/uni-search-bar.md)
* [uni-section 标题栏](component/uniui/uni-section.md)
* [uni-segmented-control 分段器](component/uniui/uni-segmented-control.md)
* [uni-steps 步骤条](component/uniui/uni-steps.md)
* [uni-swipe-action 滑动操作](component/uniui/uni-swipe-action.md)
* [uni-swiper-dot 轮播图指示点](component/uniui/uni-swiper-dot.md)
* [uni-table 表格](component/uniui/uni-table.md)
* [uni-tag 标签](component/uniui/uni-tag.md)
* [uni-title 章节标题](component/uniui/uni-title.md)
* [uni-tooltip 文字提示](component/uniui/uni-tooltip.md)
* [uni-transition 过渡动画](component/uniui/uni-transition.md)
* [介绍](uniui/uni-ui.md)
* [开始使用](uniui/quickstart.md)
* [色彩说明](uniui/color.md)
* [uni-sass 辅助样式](uniui/uni-sass.md)
* [uni-badge 数字角标](uniui/uni-badge.md)
* [uni-breadcrumb 面包屑](uniui/uni-breadcrumb.md)
* [uni-calendar 日历](uniui/uni-calendar.md)
* [uni-card 卡片](uniui/uni-card.md)
* [uni-collapse 折叠面板](uniui/uni-collapse.md)
* [uni-combox 组合框](uniui/uni-combox.md)
* [uni-countdown 倒计时](uniui/uni-countdown.md)
* [uni-data-checkbox 数据选择器](uniui/uni-data-checkbox.md)
* [uni-data-picker 级联选择器](uniui/uni-data-picker.md)
* [uni-data-select 下拉框](uniui/uni-data-select.md)
* [uni-dateformat 日期格式化](uniui/uni-dateformat.md)
* [uni-datetime-picker 日期选择器](uniui/uni-datetime-picker.md)
* [uni-drawer 抽屉](uniui/uni-drawer.md)
* [uni-easyinput 增强输入框](uniui/uni-easyinput.md)
* [uni-fab 悬浮按钮](uniui/uni-fab.md)
* [uni-fav 收藏按钮](uniui/uni-fav.md)
* [uni-file-picker 文件选择上传](uniui/uni-file-picker.md)
* [uni-forms 表单](uniui/uni-forms.md)
* [uni-goods-nav 商品导航](uniui/uni-goods-nav.md)
* [uni-grid 宫格](uniui/uni-grid.md)
* [uni-group 分组](uniui/uni-group.md)
* [uni-icons 图标](uniui/uni-icons.md)
* [uni-indexed-list 索引列表](uniui/uni-indexed-list.md)
* [uni-link 超链接](uniui/uni-link.md)
* [uni-list 列表](uniui/uni-list.md)
* [uni-load-more 加载更多](uniui/uni-load-more.md)
* [uni-nav-bar 自定义导航栏](uniui/uni-nav-bar.md)
* [uni-notice-bar 通告栏](uniui/uni-notice-bar.md)
* [uni-number-box 数字输入框](uniui/uni-number-box.md)
* [uni-pagination 分页器](uniui/uni-pagination.md)
* [uni-popup 弹出层](uniui/uni-popup.md)
* [uni-rate 评分](uniui/uni-rate.md)
* [uni-row 布局-行](uniui/uni-row.md)
* [uni-search-bar 搜索栏](uniui/uni-search-bar.md)
* [uni-section 标题栏](uniui/uni-section.md)
* [uni-segmented-control 分段器](uniui/uni-segmented-control.md)
* [uni-steps 步骤条](uniui/uni-steps.md)
* [uni-swipe-action 滑动操作](uniui/uni-swipe-action.md)
* [uni-swiper-dot 轮播图指示点](uniui/uni-swiper-dot.md)
* [uni-table 表格](uniui/uni-table.md)
* [uni-tag 标签](uniui/uni-tag.md)
* [uni-title 章节标题](uniui/uni-title.md)
* [uni-tooltip 文字提示](uniui/uni-tooltip.md)
* [uni-transition 过渡动画](uniui/uni-transition.md)
* [更新日志](https://ext.dcloud.net.cn/plugin?id=55&update_log)
* [更多插件市场的组件](https://ext.dcloud.net.cn/?cat1=2)
* [ui 设计资源](component/uniui/resource.md)
* [datacom 组件规范](component/datacom.md)
* [小程序自定义组件](/tutorial/miniprogram-subject.md)
* [组件库选型指南](component/component-selection.md)
* [ui 设计资源](uniui/resource.md)
* [datacom 组件规范](datacom.md)
* [小程序自定义组件](tutorial/miniprogram-subject.md)
* [组件库选型指南](component-selection.md)
......@@ -296,7 +296,7 @@ export default {
|arrowIconPath|更换箭头图标 |已支持 |Android不支持 iOS支持 |
**map 组件相关操作的 JS API**[uni.createMapContext](api/location/map?id=createmapcontext)
**map 组件相关操作的 JS API**[uni.createMapContext](../api/location/map.md#createmapcontext)
nvue map 更换箭头图标格式参考: [https://ask.dcloud.net.cn/article/37901](https://ask.dcloud.net.cn/article/37901)
......
......@@ -34,7 +34,7 @@
|@refresherabort |EventHandle| |自定义下拉刷新被中止|H5、app-vue 2.5.12+,微信小程序基础库2.10.1+|
使用竖向滚动时,需要给 ``<scroll-view>`` 一个固定高度,通过 css 设置 height;使用横向滚动时,需要给``<scroll-view>``添加``white-space: nowrap;``样式。
## 示例
[查看演示](https://hellouniapp.dcloud.net.cn/pages/component/scroll-view/scroll-view)
......@@ -63,7 +63,7 @@
<view @tap="goTop" class="uni-link uni-center uni-common-mt">
点击这里返回顶部
</view>
<view class="uni-title uni-common-mt">
Horizontal Scroll
<text>\n横向滚动</text>
......@@ -203,7 +203,7 @@
```
:::
## webview中使用scroll-view的注意@webviewtips
- 原生组件嵌套问题
......@@ -214,10 +214,10 @@
* 如果您一定要在webview中实现区域长列表,建议使用三方如better-scroll组件,或者插件市场搜索 [虚拟列表](https://ext.dcloud.net.cn/search?q=%E8%99%9A%E6%8B%9F%E5%88%97%E8%A1%A8),这些专业组件实现了dom复用,即便列表很长也不会创建很多dom。
- 下拉刷新问题
* webview渲染时,建议使用页面级的原生下拉刷新,性能更好。如一定要在webview中自定义下拉刷新,建议插件市场搜索[虚拟列表](https://ext.dcloud.net.cn/search?q=%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0),这些专业组件使用wxs、renderjs等技术避免通信阻塞。
- scroll-view是区域滚动,不会触发页面滚动,无法触发pages.json配置的下拉刷新、页面触底onReachBottomDistance、titleNView的transparent透明渐变。但在app-uvue下,scroll-view如果是页面顶级节点,则等同于页面滚动。[详见](uni-app-x/css/README.md#pagescroll)
- scroll-view是区域滚动,不会触发页面滚动,无法触发pages.json配置的下拉刷新、页面触底onReachBottomDistance、titleNView的transparent透明渐变。但在app-uvue下,scroll-view如果是页面顶级节点,则等同于页面滚动。[详见](https://doc.dcloud.net.cn/uni-app-x/css/#pagescroll)
- webview渲染时,scroll-view的滚动条设置,可通过css的-webkit-scrollbar自定义,包括隐藏滚动条。
在app-uvue中,其实没有页面级滚动,scroll-view也不存在原生组件层级、下拉刷新性能问题。但app-uvue里使用长列表,请务必使用list-view组件,这个组件内置了recycle-view机制,不管列表多长,都可以通过回收不显示的列表来保证高性能。[详见](list-view.md)
在app-uvue中,其实没有页面级滚动,scroll-view也不存在原生组件层级、下拉刷新性能问题。但app-uvue里使用长列表,请务必使用list-view组件,这个组件内置了recycle-view机制,不管列表多长,都可以通过回收不显示的列表来保证高性能。[详见](list.md)
## 其他注意事项
- scroll-into-view 的优先级高于 scroll-top。
......
......@@ -4,7 +4,7 @@
在app-uvue和app-nvue中,文本只能写在text中,而不能写在view的text区域。
虽然app-uvue中写在view的text区域的文字,也会被编译器自动包裹一层text组件,看起来也可以使用。但这样会造成无法修改该text文字的样式,详见uvue的[样式不继承](uni-app-x/css/README.md#stylenoextends)章节
虽然app-uvue中写在view的text区域的文字,也会被编译器自动包裹一层text组件,看起来也可以使用。但这样会造成无法修改该text文字的样式,详见uvue的[样式不继承](https://doc.dcloud.net.cn/uni-app-x/css/#stylenoextends)章节
## 属性说明
......
......@@ -28,10 +28,10 @@ uni-app内置了`weex`,`weex`的原生插件或ui库均可使用。注意`weex
(但为了全端使用,仍然建议减少对dom库的依赖,在`uni-app`的插件市场可寻找全端兼容的库来替代)
- App端支持各种调用原生能力的方式
1. 支持 原生[混合开发](hybrid)
1. 支持 原生[混合开发](/hybrid.md)
2. 支持 比小程序能力更多的[plus JSAPI](http://www.html5plus.org/doc/h5p.html)
3. 支持 [Native.js](https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/88) 直接调用原生api
4. 支持 [uts插件](uts-plugin.md)
4. 支持 [uts插件](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-plugin.html)
5. 支持 [原生语言插件](native-plugin.md)
......
* [插件全景描述](/plugin/README.md)
* [插件市场介绍](/plugin/plugin-ext-introduction.md)
* [uni_modules](/plugin/uni_modules.md)
* [插件全景描述](README.md)
* [插件市场介绍](plugin-ext-introduction.md)
* [uni_modules](uni_modules.md)
* uts插件
* [uts插件开发入门](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-plugin.html)
* [uts页面组件开发入门](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-component.html)
......@@ -8,9 +8,9 @@
* [Android平台uts开发指南](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-for-android.html)
* [iOS平台uts开发指南](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-for-ios.html)
* [使用CocoaPods依赖](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-ios-cocoapods.html)
* [原生语言插件](/plugin/native-plugin.md)
* [原生语言插件](native-plugin.md)
* 插件作者专区
* [发布插件](/plugin/publish.md)
* [销售变现](/plugin/sell.md)
* [支持多语言](/plugin/language.md)
* [oath开放平台](/plugin/oath.md)
* [发布插件](publish.md)
* [销售变现](sell.md)
* [支持多语言](language.md)
* [oath开放平台](oath.md)
uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写。
从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。文档另见[uts插件](uts-plugin.md)
从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。文档另见[uts插件](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-plugin.html)
为了和uts插件区别,之前的`App原生插件`,改名为`App原生语言插件`
......@@ -14,7 +14,7 @@ uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语
自 HBuilderX 1.4 版本起,uni-app 支持引入原生插件,使用方式如下:
```js
```js
const PluginName = uni.requireNativePlugin(PluginName); // PluginName 为原生插件名称
```
......@@ -37,7 +37,7 @@ uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语
``` html
<template>
<view>
<text class="my-iconfont">&#xe85c;</text>
<text class="my-iconfont">&#xe85c;</text>
</view>
</template>
<script>
......@@ -63,7 +63,7 @@ uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语
非内置原生插件,分为 [本地插件](/api/extend/native-plugin?id=本地插件非内置原生插件)[云端插件](/api/extend/native-plugin?id=云端插件非内置原生插件) 。集成原生插件后,需要提交云端打包或制作自定义基座运行才会生效。
非内置原生插件,分为 [本地插件](/plugin/native-plugin.md#本地插件-非内置原生插件)[云端插件](/plugin/native-plugin.md#云端插件-非内置原生插件) 。集成原生插件后,需要提交云端打包或制作自定义基座运行才会生效。
### 本地插件(非内置原生插件)
......@@ -97,7 +97,7 @@ uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语
在vue页面或nvue页面引入这个原生插件。
使用uni.requireNativePlugin的api,参数为插件的id。
```js
```js
const dcRichAlert = uni.requireNativePlugin('DCloud-RichAlert')
```
......@@ -167,7 +167,7 @@ const dcRichAlert = uni.requireNativePlugin('DCloud-RichAlert')
##### 第四步:打包发布
使用自定义基座开发调试uni-app原生插件后,不可直接将自定义基座apk作为正式版发布。
应该重新提交云端打包(不能勾选“自定义基座”)生成正式版本。
#### 注意事项
......
......@@ -44,24 +44,24 @@ uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还
<div align=center>
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/run-phone.png"/>
</div>
如手机无法识别,请点击菜单运行-运行到手机或模拟器-真机运行常见故障排查指南。
注意目前开发App也需要安装微信开发者工具。
3. 在微信开发者工具里运行:进入hello-uniapp项目,点击工具栏的运行 -> 运行到小程序模拟器 -> 微信开发者工具,即可在微信开发者工具里面体验uni-app。
<br/>
<div align=center>
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni20190222-1.png"/>
</div>
**注意:**如果是第一次使用,需要先配置小程序ide的相关路径,才能运行成功。如下图,需在输入框输入微信开发者工具的安装路径。 若HBuilderX不能正常启动微信开发者工具,需要开发者手动启动,然后将uni-app生成小程序工程的路径拷贝到微信开发者工具里面,在HBuilderX里面开发,在微信开发者工具里面就可看到实时的效果。
uni-app默认把项目编译到根目录的unpackage目录。
<br/>
<div align=center>
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/weixin-setting.png"/>
</div>
4. 在支付宝小程序开发者工具里运行:进入hello-uniapp项目,点击工具栏的运行 -> 运行到小程序模拟器 -> 支付宝小程序开发者工具,即可在支付宝小程序开发者工具里面体验uni-app。
<br/>
<div align=center>
......@@ -73,7 +73,7 @@ uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还
<div align=center>
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni20190222-2.png"/>
</div>
6. 在抖音开发者工具里运行:进入hello-uniapp项目,点击工具栏的运行 -> 运行到小程序模拟器 -> 抖音开发者工具,即可在抖音开发者工具里面体验uni-app。
<br/>
<div align=center>
......@@ -112,7 +112,7 @@ HBuilderX 还提供了快捷运行菜单,可以按数字快速选择要运行
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/runtool.png"/>
</div>
如需调试,可参考:[uni-app调试](/snippet?id=使用-chrome-调试)
如需调试,可参考:[uni-app调试](/tutorial/run-and-debug.md)
## 发布uni-app
......@@ -324,7 +324,7 @@ HBuilderX 2.7.10+ 版支持
* dev 和 build 模式的区别:
1. dev 模式有 SourceMap 可以方便的进行断点调试;
2. build 模式会将代码进行压缩,体积更小更适合发布为正式版应用;
3. 进行 [环境判断](/frame?id=运行环境判断) 时,dev 模式 process.env.NODE_ENV 的值为 development,build 模式 process.env.NODE_ENV 的值为 production。
3. 进行 [环境判断](/worktile/running-env.md#判断平台) 时,dev 模式 process.env.NODE_ENV 的值为 development,build 模式 process.env.NODE_ENV 的值为 production。
## 使用cli创建项目和使用HBuilderX可视化界面创建项目有什么区别
......@@ -334,7 +334,7 @@ HBuilderX 2.7.10+ 版支持
* HBuilderX可视化界面创建的项目,编译器在HBuilderX的安装目录下的plugin目录,随着HBuilderX的升级会自动升级编译器。
* 已经使用``cli``创建的项目,如果想继续在HBuilderX里使用,可以把工程拖到HBuilderX中。注意如果是把整个项目拖入HBuilderX,则编译时走的是项目下的编译器。如果是把src目录拖入到HBuilderX中,则走的是HBuilderX安装目录下plugin目录下的编译器。
* ``cli``版如果想安装less、scss、ts等编译器,需自己手动npm安装。在HBuilderX的插件管理界面安装无效,那个只作用于HBuilderX创建的项目。
#### 开发工具的区别
* ``cli``创建的项目,内置了d.ts,同其他常规npm库一样,可在[vscode](https://ask.dcloud.net.cn/article/36286)[webstorm](https://ask.dcloud.net.cn/article/36307)等支持d.ts的开发工具里正常开发并有语法提示。
* 使用HBuilderX创建的项目不带d.ts,HBuilderX内置了uni-app语法提示库。如需把HBuilderX创建的项目在其他编辑器打开并且补充d.ts,可以在项目下先执行 ``npm init``,然后``npm i @types/uni-app -D``,来补充d.ts。
......
......@@ -2487,7 +2487,7 @@
+ iOS平台 更新 高德地图SDK:基础SDK(v1.5.7)、3D地图SDK(v6.9.0)、搜索功能(v6.9.0),修复多次打开关闭地图页面引起应用崩溃的Bug [ + 详情](https://ask.dcloud.net.cn/question/66225) +
+ iOS平台 修复 视频播放(VideoPlayer)控件的timeupd + ate事件不触发的Bug [详情](https://ask.dcloud.net.cn/question/76470) +
+ iOS平台 修复 视频播放(VideoPlayer)控件全屏时音量 + 调节手势功能无效的Bug +
+ iOS平台 修复 Webview窗口配置系统软键盘模式(softinputMode)为adjustResize,收起软键盘后窗口高度无法恢复的Bug [详情](+%20https://ask.dcloud.net.cn/question/76374)
+ iOS平台 修复 Webview窗口配置系统软键盘模式(softinputMode)为adjustResize,收起软键盘后窗口高度无法恢复的Bug [详情](https://ask.dcloud.net.cn/question/76374)
+ iOS平台 修复 uni-app项目打包模块配置中勾选“Maps(地图)”但不配置高德或百度地图SDK参数引起提交云端打包失败的Bug
#### 2.2.0.20190812
......
......@@ -3,7 +3,7 @@
## 基本语言和开发规范
uni-app代码编写,基本语言包括js、vue、css。以及ts、scss等css预编译器。
在app端,还支持原生渲染的[nvue](nvue-outline.md),以及可以编译为kotlin和swift的[uts](/uts/)
在app端,还支持原生渲染的[nvue](nvue-outline.md),以及可以编译为kotlin和swift的[uts](https://doc.dcloud.net.cn/uni-app-x/uts/)
DCloud还提供了使用js编写服务器代码的uniCloud云引擎。所以只需掌握js,你可以开发web、Android、iOS、各家小程序以及服务器等全栈应用。
......
* [概念简介](/tutorial/)
* [工程](/tutorial/project.md)
* [页面](/tutorial/page.md)
* [概念简介](README.md)
* [工程](project.md)
* [页面](page.md)
* 互相引用
* [引用组件](/tutorial/page-component.md)
* [引用 js](/tutorial/page-script.md)
* [引用 css](/tutorial/page-style.md)
* [引用静态资源](/tutorial/page-static-assets.md)
* [引用组件](page-component.md)
* [引用 js](page-script.md)
* [引用 css](page-style.md)
* [引用静态资源](page-static-assets.md)
* [引用原生插件](/plugin/native-plugin.md)
* [js 语法](/tutorial/syntax-js.md)
* [css 语法](/tutorial/syntax-css.md)
* [js 语法](syntax-js.md)
* [css 语法](syntax-css.md)
* vue 语法
* [vue2](/tutorial/vue-basics.md)
* [基础](/tutorial/vue-basics.md)
* [组件](/tutorial/vue-components.md)
* [API](/tutorial/vue-api.md)
* [vuex](/tutorial/vue-vuex.md)
* [组合式 API](/tutorial/vue-composition-api.md)
* [vue3](/tutorial/vue3-basics.md)
* [基础](/tutorial/vue3-basics.md)
* [组件](/tutorial/vue3-components.md)
* [API](/tutorial/vue3-api.md)
* [组合式 API](/tutorial/vue3-composition-api.md)
* [vuex](/tutorial/vue3-vuex.md)
* [pinia](/tutorial/vue3-pinia.md)
* [vue2 升 3 指南](/tutorial/migration-to-vue3.md)
* [ts/typescript 专题](/tutorial/typescript-subject.md)
* [jsx/tsx 语法](/tutorial/syntax-jsx.md)
* [vue2](vue-basics.md)
* [基础](vue-basics.md)
* [组件](vue-components.md)
* [API](vue-api.md)
* [vuex](vue-vuex.md)
* [组合式 API](vue-composition-api.md)
* [vue3](vue3-basics.md)
* [基础](vue3-basics.md)
* [组件](vue3-components.md)
* [API](vue3-api.md)
* [组合式 API](vue3-composition-api.md)
* [vuex](vue3-vuex.md)
* [pinia](vue3-pinia.md)
* [vue2 升 3 指南](migration-to-vue3.md)
* [ts/typescript 专题](typescript-subject.md)
* [jsx/tsx 语法](syntax-jsx.md)
* [uts语法](https://doc.dcloud.net.cn/uni-app-x/uts/)
* 编译器(条件编译)
* [什么是编译器](/tutorial/compiler.md)
* [条件编译处理多端差异](/tutorial/platform.md)
* [环境变量](/tutorial/env.md)
* [编译器配置](/tutorial/compiler-config.md)
* [什么是编译器](compiler.md)
* [条件编译处理多端差异](platform.md)
* [环境变量](env.md)
* [编译器配置](compiler-config.md)
* web 专题
* [跨域](/tutorial/CORS.md)
* [宽屏适配](/tutorial/adapt.md)
* [SSR 服务端渲染](/tutorial/ssr.md)
* [跨域](CORS.md)
* [宽屏适配](adapt.md)
* [SSR 服务端渲染](ssr.md)
* [前端网页托管](https://doc.dcloud.net.cn/uniCloud/hosting.html)
* App 专题
* [nvue 原生渲染](/tutorial/nvue-outline.md)
* [综述](/tutorial/nvue-outline.md)
* [样式](/tutorial/nvue-css.md)
* [API](/tutorial/nvue-api.md)
* [事件](/tutorial/nvue-event.md)
* [HTML5Plus](/tutorial/use-html5plus.md)
* [Native.js](/tutorial/native-js.md)
* [renderjs](/tutorial/renderjs.md)
* [nvue 原生渲染](nvue-outline.md)
* [综述](nvue-outline.md)
* [样式](nvue-css.md)
* [API](nvue-api.md)
* [事件](nvue-event.md)
* [HTML5Plus](use-html5plus.md)
* [Native.js](native-js.md)
* [renderjs](renderjs.md)
* [原生插件](https://nativesupport.dcloud.net.cn/NativePlugin/README)
* [App的User Agent](/tutorial/app-useragent.md)
* [App使用高斯模糊](/tutorial/app-blureffect.md)
* [App的User Agent](app-useragent.md)
* [App使用高斯模糊](app-blureffect.md)
* App 打包配置
* [基础配置](/tutorial/app-base.md)
* [图标配置](/tutorial/app-icons.md)
* [启动界面](/tutorial/app-splashscreen.md)
* [功能模块](/tutorial/app-modules.md)
* [Geolocation(定位)](/tutorial/app-geolocation.md)
* [Maps(地图)](/tutorial/app-maps.md)
* [OAuth(登录鉴权)](/tutorial/app-oauth.md)
* [苹果登录](/tutorial/app-oauth-apple.md)
* [微信登录](/tutorial/app-oauth-weixin.md)
* [QQ登录](/tutorial/app-oauth-qq.md)
* [新浪微博登录](/tutorial/app-oauth-weibo.md)
* [Google登录](/tutorial/app-oauth-google.md)
* [Facebook登录](/tutorial/app-oauth-facebook.md)
* [Payment(支付)](/tutorial/app-payment.md)
* [Apple应用内支付](/tutorial/app-payment-aip.md)
* [支付宝支付](/tutorial/app-payment-alipay.md)
* [微信支付](/tutorial/app-payment-weixin.md)
* [Paypal支付](/tutorial/app-payment-paypal.md)
* [Stripe支付](/tutorial/app-payment-stripe.md)
* [Google支付](/tutorial/app-payment-google.md)
* [基础配置](app-base.md)
* [图标配置](app-icons.md)
* [启动界面](app-splashscreen.md)
* [功能模块](app-modules.md)
* [Geolocation(定位)](app-geolocation.md)
* [Maps(地图)](app-maps.md)
* [OAuth(登录鉴权)](app-oauth.md)
* [苹果登录](app-oauth-apple.md)
* [微信登录](app-oauth-weixin.md)
* [QQ登录](app-oauth-qq.md)
* [新浪微博登录](app-oauth-weibo.md)
* [Google登录](app-oauth-google.md)
* [Facebook登录](app-oauth-facebook.md)
* [Payment(支付)](app-payment.md)
* [Apple应用内支付](app-payment-aip.md)
* [支付宝支付](app-payment-alipay.md)
* [微信支付](app-payment-weixin.md)
* [Paypal支付](app-payment-paypal.md)
* [Stripe支付](app-payment-stripe.md)
* [Google支付](app-payment-google.md)
* Push(消息推送)
* [UniPush](/tutorial/app-push-unipush.md)
* [Share(分享)](/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)
* [UniPush](app-push-unipush.md)
* [Share(分享)](app-share.md)
* [微信分享](app-share-weixin.md)
* [QQ分享](app-share-qq.md)
* [新浪微博分享](app-share-weibo.md)
* [Speech(语言输入)](app-speech.md)
* [Statistic(统计)](app-statistic.md)
* [友盟统计](app-statistic-umeng.md)
* [Google统计](app-statistic-google.md)
* [Android X5 Webview(腾讯TBS)](app-android-x5.md)
* [iOS UIWebview](app-ios-uiwebview.md)
* 权限配置
* [Android权限配置](/tutorial/app-permission-android.md)
* [Android权限配置](app-permission-android.md)
* 其它配置
* [自定义404错误页面](/tutorial/app-webview-error.md)
* [Android设置UrlSchemes](/tutorial/app-android-schemes.md)
* [Android设置minSdkVersion](/tutorial/app-android-minsdkversion.md)
* [Android设置targetSdkVersion](/tutorial/app-android-targetsdkversion.md)
* [Android设置CPU类型](/tutorial/app-android-abifilters.md)
* [iOS设置UrlSchemes](/tutorial/app-ios-schemes.md)
* [iOS应用访问白名单](/tutorial/app-ios-schemewhitelist.md)
* [iOS后台运行能力](/tutorial/app-ios-uibackgroundmodes.md)
* [iOS使用广告标识IDFA](/tutorial/app-ios-idfa.md)
* [iOS符号表文件](/tutorial/app-ios-dsym.md)
* [自定义404错误页面](app-webview-error.md)
* [Android设置UrlSchemes](app-android-schemes.md)
* [Android设置minSdkVersion](app-android-minsdkversion.md)
* [Android设置targetSdkVersion](app-android-targetsdkversion.md)
* [Android设置CPU类型](app-android-abifilters.md)
* [iOS设置UrlSchemes](app-ios-schemes.md)
* [iOS应用访问白名单](app-ios-schemewhitelist.md)
* [iOS后台运行能力](app-ios-uibackgroundmodes.md)
* [iOS使用广告标识IDFA](app-ios-idfa.md)
* [iOS符号表文件](app-ios-dsym.md)
* [manifest.json源码视图](/collocation/manifest-app.md)
* [安心打包指南](tutorial/build/SafePack.md)
* [iOS 安心打包证书安装](tutorial/build/iosSafePack.md)
* [Android 自定义渠道包](tutorial/build/AndroidChannel.md)
* [Android原生应用清单文件和资源](/tutorial/app-nativeresource-android.md)
* [iOS原生应用配置文件和资源](/tutorial/app-nativeresource-ios.md)
* [安心打包指南](build/SafePack.md)
* [iOS 安心打包证书安装](build/iosSafePack.md)
* [Android 自定义渠道包](build/AndroidChannel.md)
* [Android原生应用清单文件和资源](app-nativeresource-android.md)
* [iOS原生应用配置文件和资源](app-nativeresource-ios.md)
* App 本地打包
* [Android本地离线打包](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android)
* [iOS本地离线打包](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/ios)
* [App 上架注意](/tutorial/store.md)
* [国内应用市场上架](/tutorial/android-store.md)
* [Android平台隐私与政策提示框](/tutorial/app-privacy-android.md)
* [未同意隐私政策模式运行](/tutorial/app-disagreemode.md)
* [Google Play上架](/tutorial/android-gp.md)
* [App Store上架](/tutorial/ios-app-store.md)
* [App 上架注意](store.md)
* [国内应用市场上架](android-store.md)
* [Android平台隐私与政策提示框](app-privacy-android.md)
* [未同意隐私政策模式运行](app-disagreemode.md)
* [Google Play上架](android-gp.md)
* [App Store上架](ios-app-store.md)
* [App升级](https://doc.dcloud.net.cn/uniCloud/upgrade-center.html)
* 小程序专题
* [组件与WXS](/tutorial/miniprogram-subject.md)
* [使用小程序插件](/tutorial/mp-weixin-plugin.md)
* [开发小程序插件](/tutorial/mp-weixin-plugin-dev.md)
* [一键上传微信平台](/tutorial/build/publish-mp-weixin-cli.md)
* [小程序隐私协议](/tutorial/mp-weixin-user-privacy.md)
* [组件与WXS](miniprogram-subject.md)
* [使用小程序插件](mp-weixin-plugin.md)
* [开发小程序插件](mp-weixin-plugin-dev.md)
* [一键上传微信平台](build/publish-mp-weixin-cli.md)
* [小程序隐私协议](mp-weixin-user-privacy.md)
* 运行和调试
* [概述](run-and-debug.md)
* [web平台:内置浏览器运行调试](tutorial/debug/debug-web-via-hx.md)
* [web平台:debug](tutorial/debug/debug-web-via-chrome.md)
* [web平台:内置浏览器运行调试](debug/debug-web-via-hx.md)
* [web平台:debug](debug/debug-web-via-chrome.md)
* [App平台:真机运行](run/run-app.md)
* [App平台:设备连接失败常见原因](run/run-app-faq.md)
* [App平台:模拟器安装指南](tutorial/run/installSimulator.md)
* [App平台:uni-app debug](tutorial/debug/debug-app.md)
* [App平台:Android uts调试](tutorial/debug/uni-uts-debug.md)
* [App平台:iOS uts调试](tutorial/debug/uni-uts-debug-ios.md)
* [小程序平台:运行调试](tutorial/debug/debug-mp.md)
* [uni-vue-devtools 调试](tutorial/debug/uni-vue-devtools.md)
* [高效开发技巧](/tutorial/snippet.md)
* [uni错误规范](/tutorial/err-spec.md)
* [性能优化专题](/tutorial/performance.md)
* [App平台:模拟器安装指南](run/installSimulator.md)
* [App平台:uni-app debug](debug/debug-app.md)
* [App平台:Android uts调试](debug/uni-uts-debug.md)
* [App平台:iOS uts调试](debug/uni-uts-debug-ios.md)
* [小程序平台:运行调试](debug/debug-mp.md)
* [uni-vue-devtools 调试](debug/uni-vue-devtools.md)
* [高效开发技巧](snippet.md)
* [uni错误规范](err-spec.md)
* [性能优化专题](performance.md)
* 安全专题
* [综述](/tutorial/safe.md)
* [综述](safe.md)
* 客户端安全
* [app js/nvue文件原生混淆加密](/tutorial/app-sec-confusion.md)
* [Android安全漏洞问题解决方案](/tutorial/app-sec-android.md)
* [app 安全检测API](/tutorial/app-sec-api.md)
* [app 加固](/tutorial/app-security.md)
* [app 隐私合规检测](/tutorial/app-privacy-detect.md)
* [app js/nvue文件原生混淆加密](app-sec-confusion.md)
* [Android安全漏洞问题解决方案](app-sec-android.md)
* [app 安全检测API](app-sec-api.md)
* [app 加固](app-security.md)
* [app 隐私合规检测](app-privacy-detect.md)
* 网络安全
* [云端一体安全网络](https://doc.dcloud.net.cn/uniCloud/secure-network.html)
* [传统服务器与uniCloud安全通信](https://doc.dcloud.net.cn/uniCloud/uni-cloud-s2s.html)
......@@ -150,8 +150,8 @@
* 服务器安全
* [uniCloud ip防刷](https://doc.dcloud.net.cn/uniCloud/ip-filter.html)
* [内容安全审查](https://ext.dcloud.net.cn/plugin?id=5460)
* [国际化专题](/tutorial/i18n.md)
* [国际化开发指南](/tutorial/i18n.md)
* [海外开发者使用指南](/tutorial/internationalization.md)
* [暗黑主题](/tutorial/darkmode.md)
* [版本](/tutorial/version.md)
* [国际化专题](i18n.md)
* [国际化开发指南](i18n.md)
* [海外开发者使用指南](internationalization.md)
* [暗黑主题](darkmode.md)
* [版本](version.md)
......@@ -4,7 +4,7 @@
根据以上规范要求,各大应用市场都加强应用的检测,要求应用必须符合相关政策,否则应用将有被通报或下架的风险。
DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`服务,可在线申请获取详细检测报告,详见:[uni隐私合规检测](/uni-app-privacy-detect.md)
DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`服务,可在线申请获取详细检测报告,详见:[uni隐私合规检测](/tutorial/app-privacy-detect.md)
### APP因合规问题无法上架
......@@ -17,10 +17,10 @@ DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`
+ 配置隐私弹窗时一定要配置使用`template`模式。否则无法上架应用市场。应用内部自己实现的隐私弹窗也不行。一定要使用uni提供的隐私弹窗并使用`template`模式切记!
```json
//androidPrivacy.json
{
"version": "1",
"prompt": "template",
"title": "服务协议和隐私政策",
{
"version": "1",
"prompt": "template",
"title": "服务协议和隐私政策",
"message": "..."
}
```
......@@ -36,7 +36,7 @@ DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`
+ 必须在“隐私与政策”非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围,用户个人信息包括但不限于mac地址、设备序列号、imei、imsi、软件安装列表、通讯录信息、短信信息等。
+ 如果反馈说有违规获取敏感信息行为,请查看[Android平台各功能模块隐私合规协议](https://ask.dcloud.net.cn/article/39484)各功能模块隐私协议。如果你集成了相关模块就一定要写入到app的隐私协议中。
+ 必须在《隐私政策》中必告知用户您的应用基于DCloud uni-app(5+ App/Wap2App)开发,添加如下协议:
`我们的产品基于DCloud uni-app(5+ App/Wap2App)开发,应用运行期间需要收集您的设备唯一识别码(IMEI/android ID/DEVICE_ID/IDFA、SIM 卡 IMSI 信息、OAID)以提供统计分析服务,并通过应用启动数据及异常错误日志分析改进性能和用户体验,为用户提供更好的服务。`
......
......@@ -12,7 +12,7 @@ HBuilder/HBuilderX中使用so库的功能(模块)
- Weex(原生渲染):uni-app(自定义组件模式、nvue页面), **注意:HBuilderX2.1.5及以上版本支持**
- Android X5 Webview(腾讯TBS):腾讯X5内核,**注意:不支持x86**
> HBuilderX2.7.0+ 调整 云端打包默认不再包含 x86 CPU类型库,减少apk包体积[详情](id=nox86)
> HBuilderX2.7.0+ 调整 云端打包默认不再包含 x86 CPU类型库,减少apk包体积[详情](#nox86)
> HBuilderX2.1.5+ 开始支持Android平台的新增适配64位CPU类型,云端打包支持配置App支持的CPU类型
> 满足Google Play从2019年8月1日起上传的App必需支持64位CPU的要求。
......@@ -27,7 +27,7 @@ HBulderX已适配支持以下主流CPU类型:
- x86
少部分平板使用x86,AS模拟器中选了intel x86时使用x86处理器,以及其它常用三方模拟器通常使用x86
>不支持64位x86指令cpu,即不支持x86_64
>不支持64位x86指令cpu,即不支持x86_64
**注意:不勾选x86在模拟器上可能无法正常运行,以下是常见模拟器是否需要包含x86的情况**
- 雷电模拟器:
......@@ -46,17 +46,17 @@ HBulderX已适配支持以下主流CPU类型:
未测试验证,建议包含x86,确保在模拟器正常运行
### 配置支持的CPU类型
**可视化界面配置**
### 配置支持的CPU类型
**可视化界面配置**
打开项目的manifest.json文件,在 “App常用其它设置” -> “Android设置” -> “支持CPU类型” 项中勾选需要支持的CPU类型:
![](https://native-res.dcloud.net.cn/images/uniapp/others/abifilters-manifest.png)
**源码视图配置**
**源码视图配置**
打开项目的manifest.json文件,切换到“源码视图”,根据项目类型进行配置
- uni-app项目
- uni-app项目
在 "app-plus"->"distribute"->"android" 节点的 abiFilters 属性配置支持的CPU类型,示例如下:
``` js
``` js
"app-plus": {
"distribute": {
"android": {
......@@ -77,7 +77,7 @@ HBulderX已适配支持以下主流CPU类型:
#### 离线打包配置
使用Android studio打开Android原生项目,打开对应项目的build.gradle文件。
在Android -> defaultConfig下添加支持的CPU类型,如下示例:
```
```
defaultConfig{
ndk {
abiFilters 'arm64-v8a','armeabi-v7a'
......@@ -87,43 +87,43 @@ defaultConfig{
**注意:离线打包仅支持arm64-v8a、armeabi-v7a、x86三种类型,建议根据自己需求选择打包的CPU类型**
### 默认值@default
- HBuilderX3.92及以下版本,默认值为armeabi-v7a
- HBuilderX3.93及以上版本,为了充分发挥CPU性能,默认值调整为arm64-v8a。解决在部分华为鸿蒙新设备(如Mate60、Mate X5等)应用启动慢的问题。
### 默认值@default
- HBuilderX3.92及以下版本,默认值为armeabi-v7a
- HBuilderX3.93及以上版本,为了充分发挥CPU性能,默认值调整为arm64-v8a。解决在部分华为鸿蒙新设备(如Mate60、Mate X5等)应用启动慢的问题。
### CPU类型选择建议
ARM64位(arm64-v8a)CPU可以兼容ARM32的指令,也就是说只选择armeabi-v7a类型的so库也可以在64位手机上运行,只是没有完全发挥CPU的性能。
选择支持的CPU类型时请参考以下建议:
- 如果不在意apk大小,三种CPU类型都勾选
- 如果要尽量发挥新设备性能,选择arm64-v8a
- 如果在意apk大小,选择armeabi-v7a(几乎在所有ARM指令的所有设备上都可正常运行)
- 如果想兼容性能和apk大小,建议选择armeabi-v7a、arm64-v8a
- 如果要兼容一些平板和模拟器,选择armeabi-v7a、x86
不是所有模拟都仅支持x86指令,如雷电(4.x)、MuMu等模拟器也是支持ARM指令。
- 如果不在意apk大小,三种CPU类型都勾选
- 如果要尽量发挥新设备性能,选择arm64-v8a
- 如果在意apk大小,选择armeabi-v7a(几乎在所有ARM指令的所有设备上都可正常运行)
- 如果想兼容性能和apk大小,建议选择armeabi-v7a、arm64-v8a
- 如果要兼容一些平板和模拟器,选择armeabi-v7a、x86
不是所有模拟都仅支持x86指令,如雷电(4.x)、MuMu等模拟器也是支持ARM指令。
### 查看apk支持的CPU类型
使用解压工具打开apk,在lib目录下可以查看到支持的CPU类型,如下图所示:
使用解压工具打开apk,在lib目录下可以查看到支持的CPU类型,如下图所示:
![](https://native-res.dcloud.net.cn/images/uniapp/others/abifilters-apk.png)
### 常见问题
### 常见问题
#### 在部分华为鸿蒙设备上启动应用慢的问题
部分华为新设备(Mate60、Mate X5等)使用的芯片运行32位应用时只能跑在小核上,相当于限制的CPU的性能,如果应用只包含armeabi-v7a会导致应用启动速度非常慢。需要勾选arm64-v8a来解决此问题。
#### 在部分华为鸿蒙设备上启动应用慢的问题
部分华为新设备(Mate60、Mate X5等)使用的芯片运行32位应用时只能跑在小核上,相当于限制的CPU的性能,如果应用只包含armeabi-v7a会导致应用启动速度非常慢。需要勾选arm64-v8a来解决此问题。
为了适配更多的新设备,建议开发者尽量勾选arm64-v8a。
#### CPU类型配置了x86,云端打包后缺没有包含x86
如果勾选了不支持x86的内置模块或uni原生插件,云端打包后不会包含x86
- 不支持x86的内置模块
- 不支持x86的内置模块
+ Android X5 Webview(腾讯TBS)
- uni原生插件
- uni原生插件
+ 云端插件可以在插件页面详情页面的“平台兼容性”中查看兼容的CPU类型
+ 内地插件可以在[package.json查看abis属性配置](https://nativesupport.dcloud.net.cn/NativePlugin/course/package?id=abis)
#### 上架Google Play市场对CPU类型的要求
提交Google Play时要求支持64位,建议选择"armeabi-v7a"和"arm64-v8a"两个即可,也可以只选择"arm64-v8a"。
提交Google Play时要求支持64位,建议选择"armeabi-v7a"和"arm64-v8a"两个即可,也可以只选择"arm64-v8a"。
**注意:不要勾选"x86"**
......@@ -135,7 +135,7 @@ Performing Streamed Install
adb: failed to install android_debug.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]
```
使用Android Studio自带的x86模拟器,将不包含x86 cpu类型的apk拖到模拟器安装时会弹出如下提示框:
使用Android Studio自带的x86模拟器,将不包含x86 cpu类型的apk拖到模拟器安装时会弹出如下提示框:
![](https://native-res.dcloud.net.cn/images/uniapp/others/abifilters-error.png)
<a id="nox86"/>
......
......@@ -20,22 +20,19 @@
**注意:App要支持disagreeMode,需要根据业务进行适配**
> - **前提条件:HBuilderX更新到3.3.1及以上版本**
> - **第一步:原生隐私政策提示框[配置支持disagreeMode](#disagree)**
> - **前提条件:HBuilderX更新到3.3.1及以上版本**
> - **第一步:原生隐私政策提示框[配置支持disagreeMode](#disagree)**
> - **第二步:[适配App的基本功能服务](#basic-services),确保不要调用任何可能涉及“隐私政策”合规的API**
> - **第三步:适配需要使用`非必要个人信息`的业务功能,在调用功能前[引导用户同意“隐私政策”协议](#showprivacy)**
### 配置支持disagreeMode@disagree
<a id="disagree"></a>
### 配置支持disagreeMode
在HBuilderX中打开项目的原生隐私政策提示框配置文件[androidPrivacy.json](https://ask.dcloud.net.cn/article/36937),添加`disagreeMode`配置设置`support`为true.
在HBuilderX中打开项目的原生隐私政策提示框配置文件[androidPrivacy.json](https://ask.dcloud.net.cn/article/36937),添加`disagreeMode`配置设置`support`为true.
```json
{
"prompt": "template",
"buttonAccept": "同意并接受",
"buttonAccept": "同意并接受",
"buttonRefuse": "基础功能模式",
"disagreeMode": {
"support": false,
......@@ -47,26 +44,21 @@
```
- support
- support
Boolean类型,true表示开启disagreeMode;false表示不开启(用户不同意“隐私政策”则退出应用)。默认值为false。
- loadNativePlugins
Boolean类型,表示在disagreeMode模式是否加载uni原生插件,true表示加载;false表示不加载(此时调用uni.requireNativePlugin加载插件扩展Module返回undefined,插件的扩展组件Component也无法使用)。默认值为true。
- loadNativePlugins
Boolean类型,表示在disagreeMode模式是否加载uni原生插件,true表示加载;false表示不加载(此时调用uni.requireNativePlugin加载插件扩展Module返回undefined,插件的扩展组件Component也无法使用)。默认值为true。
使用场景:在disagreeMode模式下如果因为使用uni原生插件不符合“隐私政策”合规检测,无法确定是哪个插件引起的,可以简单配置loadNativePlugins为false不加载所有原生插件。注意:配置为false需要在引导用户同意“隐私政策”后重启应用。
- visitorEntry
是否增加展示`游客模式`按钮,用于进入无权限模式。 默认为false,即不展示游客模式按钮
- showAlways
是否每次启动展示都展示隐私协议,默认为false。 注意此字段只有在配置了 support/visitorEntry 为true,即当前应用支持无权限模式的情况下的才会生效。如果用户没有配置support/visitorEntry 则延续原有的逻辑,每次打开都会展示隐私弹窗
<a id="basic-services"></a>
### 适配App的基本功能服务
### 适配App的基本功能服务@basic-services
disagreeMode表示用户未同意“隐私政策”,此时App仅提供基本功能服务,此模式下不能调用涉及隐私合规相关的API,如果调用了可能会因为读取隐私信息导致App无法通过合规检测,参考[disagreeMode模式限制uni API和组件](#limit-uni)[disagreeMode模式限制5+ API](#limit-plus)。如果基本功能服务的页面需要需要调用到限制API,需先[判断是否运行在disagreeMode模式](#judge),如果是的话需先[引导用户同意“隐私政策”协议](#showprivacy),用户同意隐私政策后再调用限制API。
<a id="judge"></a>
#### 判断是否运行在disagreeMode模式
#### 判断是否运行在disagreeMode模式@judge
可通过[plus.runtime.isAgreePrivacy](https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.isAgreePrivacy)查询当前应用是否用户同意隐私政策可判断是否运行在disagreeMode模式,示例代码如下:
```
......@@ -161,9 +153,7 @@ plus.runtime.isAgreePrivacy()返回为true表示用户已经同意隐私政策
|Video|plus.video.createLivePusher、plus.video.LivePusher 推流相关API被限制不可以使用
<a id="showPrivacy"></a>
### 引导用户同意“隐私政策”协议
### 引导用户同意“隐私政策”协议@showPrivacy
当用户在disagreeMode模式使用基本功能服务时,可能链接打开使用了限制API的业务功能,此时可调用[plus.runtime.showPrivacyDialog](https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.showPrivacyDialog)弹出隐私政策协议框,引导用户同意隐私政策后再使用相关业务功能。示例代码如下:
```
......
......@@ -8,7 +8,7 @@
|项目类型|API|
|:-|:-|
|uni-app|[uni.getLocation(OBJECT)](api/location/location?id=getlocation)|
|uni-app|[uni.getLocation(OBJECT)](/api/location/location.md#getlocation)|
|5+ App/Wap2App|[plus.geolocation.*](https://www.html5plus.org/doc/zh_cn/geolocation.html)
使用定位功能需在项目manifest.json的“App模块配置”中勾选“Geolocation(定位)”,并根据项目实际需求勾选使用的三方定位SDK:
......@@ -16,7 +16,7 @@
### 系统定位@system
### 系统定位@system
> HBuilderX3.2.16开始独立出“系统定位”模块
......@@ -59,21 +59,21 @@
使用`高德定位`需在“App模块配置”项的“Geolocation(定位)”下,勾选“高德定位”:
![](https://native-res.dcloud.net.cn/images/uniapp/geolocation/amap.png)
#### 参数说明
- 高德用户名
#### 参数说明
- 高德用户名
高德开放平台注册账号的用户名,获取方式参考“[高德开放平台用户名](#amapname)”章节
- appkey_android
- appkey_android
[高德开放平台](https://lbs.amap.com/)为Android平台申请的Key
- appkey_ios
- appkey_ios
[高德开放平台](https://lbs.amap.com/)为iOS平台申请的Key
**注意**
**注意**
- 调用高德定位SDK提供的定位服务,仅支持gcj02坐标系,支持解析地址信息。
- 配置后需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
- 本地离线打包参考[Android平台高德定位模块配置](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/geolocation?id=%e9%ab%98%e5%be%b7%e5%ae%9a%e4%bd%8d)[iOS平台高德定位模块配置](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/geolocation?id=%e9%ab%98%e5%be%b7%e5%ae%9a%e4%bd%8d)
#### 高德开放平台用户名@amapName
登录 [高德开放平台](https://lbs.amap.com/),进入“控制台”,在“账号信息”的“基本信息”中可获取“用户名”:
#### 高德开放平台用户名@amapName
登录 [高德开放平台](https://lbs.amap.com/),进入“控制台”,在“账号信息”的“基本信息”中可获取“用户名”:
![](https://native-res.dcloud.net.cn/images/uniapp/maps/amap_name.png)
......@@ -84,13 +84,13 @@
使用`高德定位`需在“App模块配置”项的“Geolocation(定位)”下,勾选“高德定位”:
![](https://native-res.dcloud.net.cn/images/uniapp/geolocation/baidu.png)
#### 参数说明
- appkey_android
#### 参数说明
- appkey_android
[百度地图开放平台](https://lbsyun.baidu.com/)为Android平台申请的访问应用密钥
- appkey_ios
- appkey_ios
[百度地图开放平台](https://lbsyun.baidu.com/)为iOS平台申请的访问应用密钥
**注意**
**注意**
-调用百度定位SDK提供的定位服务,仅支持gcj02/bd09/bd09ll坐标系,支持解析地址信息。
- 配置后需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
- 本地离线打包参考[Android平台百度定位模块配置](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/geolocation?id=%e7%99%be%e5%ba%a6%e5%ae%9a%e4%bd%8d)[iOS平台百度定位模块配置](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/geolocation?id=%e7%99%be%e5%ba%a6%e5%ae%9a%e4%bd%8d)
......
......@@ -4,19 +4,19 @@ HBuilderX中打开项目的manifest.json文件,在“App图标配置”中可
如果不使用自动生成图标方式,可按下面文档分别配置Android和iOS平台的图标。
### Android平台
**注意事项**
**注意事项**
- 必须使用png格式,其它格式需要使用图片工具转换,注意不要直接将jpg等其它格式图片直接改名为png
- 系统没有对图标分辨率进行限制,按照建议的分辨率配置即可
- 图片支持透明区域,建议使用圆角图标
> 提示:可能有些特殊手机ROM对图标有所要求,提交相应应用市场时注意看是否有要求
#### 云端打包
**可视化界面配置**
#### 云端打包
**可视化界面配置**
推荐在可视化界面操作配置,在“Android图标配置”下根据分辨率选择对应的图标:
![](https://native-res.dcloud.net.cn/images/uniapp/icons/android.png)
**源码视图配置**
**源码视图配置**
切换到源码视图界面,在 "app-plus"->"distribute"->"icons"->"android" 节点根据以下属性配置对应分辨率图标路径:
|属性名称|类型|说明|
......@@ -30,8 +30,8 @@ HBuilderX中打开项目的manifest.json文件,在“App图标配置”中可
> 提示:5+ App项目源码视图节点为app->distribute->icons->android
**默认图标**
云端打包没有配置图标时将使用以下默认图标:
**默认图标**
云端打包没有配置图标时将使用以下默认图标:
![](https://native-res.dcloud.net.cn/images/uniapp/icons/def-android.png)
......@@ -41,7 +41,7 @@ HBuilderX中打开项目的manifest.json文件,在“App图标配置”中可
### iOS平台
**注意事项**
**注意事项**
- 必须使用png格式,其它格式需要使用图片工具转换,注意不要直接将jpg等其它格式图片直接改名为png
- 图标必须是直角,不要使用圆角图标,使用圆角AppStore审核不会通过
- 打包提交appstore时,必须配置1024*1024分辨率的AppStore图标,云端打包机默认使用纯白色图标
......@@ -49,19 +49,19 @@ HBuilderX中打开项目的manifest.json文件,在“App图标配置”中可
更多应用图标相关信息,参考苹果官方说明:[https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/)
#### 云端打包
**可视化界面配置**
#### 云端打包
**可视化界面配置**
推荐在可视化界面操作配置,分别在“app store”、“iPhone图标配置”、“iPad图标配置”下根据分辨率选择对应的图标:
![](https://native-res.dcloud.net.cn/images/uniapp/icons/ios.png)
- app store
- app store
应用需要提交到AppStore上架审核是必须配置
- iPhone图标配置
- iPhone图标配置
打包时勾选“支持iPhone”时必须配置
- iPad图标配置
- iPad图标配置
打包时勾选“支持iPad”是必须配置
**源码视图配置**
**源码视图配置**
切换到源码视图界面,在 "app-plus"->"distribute"->"icons"->"ios" 节点根据以下属性配置对应分辨率图标路径:
|属性名称|类型|说明|
......@@ -83,7 +83,7 @@ iPhone图标源码参数
|settings@3x|String|iOS7+设备Settings设置图标,分辨率要求87x87|
|notification@2x|String|iOS7+设备通知栏图标,分辨率要求40x40|
|notification@3x|String|iOS7+设备通知栏图标,分辨率要求60x60|
<a id="ipad"/>
iPad图标源码参数
......@@ -106,17 +106,15 @@ iPad图标源码参数
### 常见问题
#### iOS平台配置/更新图标后打包安装,图标显示不正确
**解决方案**
#### iOS平台配置/更新图标后打包安装,图标显示不正确
**解决方案**
iOS系统会缓存应用图标,需要重启手机新图标才能生效
<a id="itms90717"/>
#### 提交AppStore审核是报ITMS-90717错误
#### 提交AppStore审核是报ITMS-90717错误@itms90717
这是因为图片中包含透明信息,即alpha通道,完整错误提示如下:
```javascript
ERROR ITMS-90717: "Invalid App Store Icon. The App Store Icon in the asset catalog in 'HBuilder.app' can't be transparent nor contain an alpha channel."
```
**解决方案**
**解决方案**
生成png图标文件时去掉alpha通道,重新提交云端打包
......@@ -2,7 +2,7 @@ App端地图模块封装了市场上主流的三方地图SDK,提供JS API统
|项目类型|API|
|:-|:-|
|uni-app|[uni.getLocation(OBJECT)](https://uniapp.dcloud.io/api/location/location?id=getlocation)[uni.chooseLocation(OBJECT)](https://uniapp.dcloud.io/api/location/location?id=chooselocation)[uni.openLocation(OBJECT)](https://uniapp.dcloud.io/api/location/open-location?id=openlocation)[uni.createMapContext(mapId,this)](api/location/map?id=createmapcontext)[map](component/map)组件|
|uni-app|[uni.getLocation(OBJECT)](https://uniapp.dcloud.io/api/location/location?id=getlocation)[uni.chooseLocation(OBJECT)](https://uniapp.dcloud.io/api/location/location?id=chooselocation)[uni.openLocation(OBJECT)](https://uniapp.dcloud.io/api/location/open-location?id=openlocation)[uni.createMapContext(mapId,this)](api/location/map?id=createmapcontext)[map](/component/map.md)组件|
|5+App/Wap2App|[plus.maps.*](https://www.html5plus.org/doc/zh_cn/maps.html)
使用地图功能需在项目manifest.json的“App模块配置”中勾选“Maps(地图)”,并根据项目实际情况勾选使用的三方地图SDK:
......@@ -10,56 +10,56 @@ App端地图模块封装了市场上主流的三方地图SDK,提供JS API统
> 提示:App模块配置需提交云端打包后才能生效,真机运行调试时请使用[自定义基座](http://ask.dcloud.net.cn/article/35115)
**注意**
- 使用高德地图、百度地图需要商业授权,详情参考 [商业授权相关说明](app-geolocation?id=business)
**注意**
- 使用高德地图、百度地图需要商业授权,详情参考 [商业授权相关说明](app-geolocation?id=business)
- uni-app项目中仅nvue页面支持使用原生SDK
- uni-app项目暂时不支持使用百度地图
### 高德地图
### 高德地图
#### 申请高德地图Key
#### 申请高德地图Key
使用前需到[高德开放平台](https://lbs.amap.com/)创建应用并申请Key
- 登录 [高德开放平台](https://lbs.amap.com/),进入“控制台”,如果没有注册账号请先根据页面提示注册账号
- 登录 [高德开放平台](https://lbs.amap.com/),进入“控制台”,如果没有注册账号请先根据页面提示注册账号
- 打开 “应用管理” -> “我的应用”页面,点击“创建新应用”,根据页面提示填写内容创建应用
- 在应用下点击“添加”为应用添加Key,根据需要分别为Android平台、iOS平台申请Key
#### 配置使用高德地图
#### 配置使用高德地图
打开项目的manifest.json文件,在“App模块配置”项的“Maps(地图)”下,勾选“高德地图”:
![](https://native-res.dcloud.net.cn/images/uniapp/maps/amap.png)
#### 参数说明
- 高德用户名
#### 参数说明
- 高德用户名
高德开放平台注册账号的用户名,获取方式参考“[高德开放平台用户名](#amapname)”章节
- appkey_android
- appkey_android
高德开放平台申请的Android平台Key
- appkey_ios
- appkey_ios
高德开放平台申请的iOS平台Key
**注意**
- HBuilderX标准基座默认使用高德地图SDK,可以直接真机运行测试,此时配置的应用包名、签名信息不生效,正式发布前请提交云端打包或使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)测试
- 本地离线打包参考[Android平台高德地图模块配置](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/map?id=%e9%ab%98%e5%be%b7%e5%9c%b0%e5%9b%be)[iOS平台高德地图模块配置](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/map?id=%e9%ab%98%e5%be%b7%e5%9c%b0%e5%9b%be)
#### 高德开放平台用户名@amapName
登录 [高德开放平台](https://lbs.amap.com/),进入“控制台”,在“账号信息”的“基本信息”中可获取“用户名”:
#### 高德开放平台用户名@amapName
登录 [高德开放平台](https://lbs.amap.com/),进入“控制台”,在“账号信息”的“基本信息”中可获取“用户名”:
![](https://native-res.dcloud.net.cn/images/uniapp/maps/amap_name.png)
### 百度地图
### 百度地图
#### 申请百度地图Key
#### 申请百度地图Key
使用前需到[百度开放平台](https://lbsyun.baidu.com/)创建应用并申请Key
- 登录 [百度开放平台](https://lbsyun.baidu.com/),进入“控制台”,如果没有注册账号请先根据页面提示注册账号
- 登录 [百度开放平台](https://lbsyun.baidu.com/),进入“控制台”,如果没有注册账号请先根据页面提示注册账号
- 打开 “应用管理” -> “我的应用”页面,点击“创建应用”,根据页面提示填写内容创建应用获取Key
#### 配置使用百度地图
#### 配置使用百度地图
打开项目的manifest.json文件,在“App模块配置”项的“Maps(地图)”下,勾选“百度地图”:
![](https://native-res.dcloud.net.cn/images/uniapp/maps/bmap.png)
#### 参数说明
- appkey_android
#### 参数说明
- appkey_android
百度地图开放平台申请的Android平台Key
- appkey_ios
- appkey_ios
百度地图开放平台申请的iOS平台Key
**注意**
......@@ -71,24 +71,24 @@ App端地图模块封装了市场上主流的三方地图SDK,提供JS API统
> HBuilderX3.4.0+版本新增支持
#### 申请Google地图Key
#### 申请Google地图Key
使用前需到[Google地图开放平台](https://console.cloud.google.com/google/maps-apis)创建应用并申请APIKey
- 登录 [Google地图开放平台](https://console.cloud.google.com/google/maps-apis),如果没有注册账号请先根据页面提示注册账号
- 根据页面提示新建项目,也可以选择已经存在的项目
- 登录 [Google地图开放平台](https://console.cloud.google.com/google/maps-apis),如果没有注册账号请先根据页面提示注册账号
- 根据页面提示新建项目,也可以选择已经存在的项目
- 打开“凭证”页面,点击 “创建凭证” -> “API密钥”获取APIKey,由于Google地图需要收费,为了保证安全建议配置限制密钥
+ Android平台
在“应用限制”下勾选“Android应用”,并添加绑定“软件包名称”、“SHA-1证书指纹”;在“API限制”下建议勾选“不限制密钥”
+ iOS平台
在“应用限制”下勾选“iOS应用”,并添加绑定“软件包ID”;在“API限制”下建议勾选“不限制密钥”
+ Android平台
在“应用限制”下勾选“Android应用”,并添加绑定“软件包名称”、“SHA-1证书指纹”;在“API限制”下建议勾选“不限制密钥”
+ iOS平台
在“应用限制”下勾选“iOS应用”,并添加绑定“软件包ID”;在“API限制”下建议勾选“不限制密钥”
#### 配置使用Google地图
#### 配置使用Google地图
打开项目的manifest.json文件,在“App模块配置”项的“Maps(地图)”下,勾选“Google地图”:
![](https://native-res.dcloud.net.cn/images/uniapp/maps/gmap.png)
#### 参数说明
- APIKey_android
#### 参数说明
- APIKey_android
Google地图开放平台申请的Android平台APIKey
- APIKey_ios
- APIKey_ios
Google地图开放平台申请的iOS平台APIKey
**注意**
......
......@@ -3,7 +3,7 @@
> HBuilderX2.4.7+版本新增支持`苹果登录(Sign in with Apple`,苹果登录是** iOS13** 新增加的功能,当你的应用使用了第三方登录比如微信登录,同时也需要集成苹果登录,否则提交AppStore审核会被拒绝
### 开通
### 开通
使用苹果登录首先需要在苹果开发者后台开启 App 的 `Sign In with Apple` 服务:
- 登录到[苹果开发者后台](https://developer.apple.com/)
-[Identifiers](https://developer.apple.com/account/resources/identifiers/list)页面选择应用的 App ID(Bundle ID)进入编辑 `Capabilities` 界面,勾选 `Sign In with Apple` 服务并保存
......@@ -15,7 +15,7 @@
### 配置
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“OAuth(登录鉴权)”下,勾选“苹果登录(Sign in with Apple)”:
![](https://native-res.dcloud.net.cn/images/uniapp/oauth/apple-manifest.png)
......@@ -25,30 +25,30 @@
### 使用苹果登录
### 使用苹果登录
- uni-app项目
调用 [uni.login(OBJECT)](api/plugins/login?id=login) 发起授权登录,,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`apple`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录授权
- uni-app项目
调用 [uni.login(OBJECT)](/api/plugins/login.md#login) 发起授权登录,,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`apple`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录授权
#### 登录按钮样式
#### 登录按钮样式
苹果对登录按钮样式有要求,请按照苹果要求统一设置登录按钮的样式,否则审核可能会被拒绝,注意以下事项:
- 按钮必须在显著的位置(避免滑动屏幕才能看到)
- 登录按钮有三种外观:白色,带有黑色轮廓线的白色和黑色,其他设计可能会影响审核;
- 按钮圆角范围及按钮最小尺寸也有要求;
- 具体规则请参考苹果 [官方文档](https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/)
下面是原生端默认的几种按钮样式供大家参考(width:130pt, height:30pt, corner radius: 6pt)
下面是原生端默认的几种按钮样式供大家参考(width:130pt, height:30pt, corner radius: 6pt)
![](https://native-res.dcloud.net.cn/images/uniapp/oauth/apple-style-zh.png)
#### 示例代码
#### 示例代码
> 注:因为是 iOS13+ 系统才支持苹果登录,所以建议在App的界面入口判断下,只有 iOS13 才显示Apple登录的选项
> 注:因为是 iOS13+ 系统才支持苹果登录,所以建议在App的界面入口判断下,只有 iOS13 才显示Apple登录的选项
- uni-app项目
``` js
- uni-app项目
``` js
uni.login({
provider: 'apple',
success: function (loginRes) {
......@@ -61,19 +61,19 @@ uni.login({
})
},
fail: function (err) {
// 登录授权失败
// 登录授权失败
// err.code错误码参考`授权失败错误码(code)说明`
}
});
```
```
- 5+ App项目
``` js
- 5+ App项目
``` js
var appleOauth = null;
plus.oauth.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取苹果授权登录对象,苹果授权登录id 为 'apple' iOS13以下系统,不会返回苹果登录对应的 service
// 获取苹果授权登录对象,苹果授权登录id 为 'apple' iOS13以下系统,不会返回苹果登录对应的 service
if (service.id == 'apple') {
appleOauth = service;
break;
......@@ -84,10 +84,10 @@ plus.oauth.getServices(function(services) {
// appleOauth.authResult中保存通用认证数据
// appleOauth.appleInfo中保存苹果登录认证完整数据,参考`appleInfo`说明
}, function(err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
}, {
// 默认只会请求用户名字信息,如需请求用户邮箱信息,需要设置 scope: 'email'
// 默认只会请求用户名字信息,如需请求用户邮箱信息,需要设置 scope: 'email'
scope: 'email'
})
}, function(err) {
......@@ -97,7 +97,7 @@ plus.oauth.getServices(function(services) {
**appleInfo**
**appleInfo**
属性|类型|说明
:--|:--|:--|
......
### 开通
- 注册[Facebook](http://www.facebook.com)账号
- 登录[Facebook开发者中心](http://developers.facebook.com/),打开“我的应用”页面
- 点击“创建应用”,根据提示填写应用信息
- 创建应用完成后即可获得应用编号(AppID)
- 进入应用详情页面,为应用添加登录功能,并配置Android/iOS平台信息
### 开通
- 注册[Facebook](http://www.facebook.com)账号
- 登录[Facebook开发者中心](http://developers.facebook.com/),打开“我的应用”页面
- 点击“创建应用”,根据提示填写应用信息
- 创建应用完成后即可获得应用编号(AppID)
- 进入应用详情页面,为应用添加登录功能,并配置Android/iOS平台信息
更多信息详见 [申请开通Facebook登录操作指南](https://uniapp.dcloud.io/tutorial/app-oauth-facebook-open)
更多信息详见 [申请开通Facebook登录操作指南](https://uniapp.dcloud.io/tutorial/app-oauth-facebook-open)
### 配置
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“OAuth(登录鉴权)”下,勾选“Facebook登录”:
![](https://native-res.dcloud.net.cn/images/uniapp/oauth/facebook-manifest.png)
- appid
Facebook开发者中心申请的应用编号(AppID)
- appid
Facebook开发者中心申请的应用编号(AppID)
**注意**
- HBuilderX中标准真机运行基座使用的是DCloud申请HBuilder应用的AppID等信息,仅用于体验Facebook登录功能
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用Facebook登录
### 使用Facebook登录
- uni-app项目
调用 [uni.login(OBJECT)](api/plugins/login?id=login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`facebook`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
- uni-app项目
调用 [uni.login(OBJECT)](/api/plugins/login.md#login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`facebook`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
#### 示例代码
- uni-app项目
``` js
#### 示例代码
- uni-app项目
``` js
uni.login({
provider: 'facebook',
success: function (loginRes) {
......@@ -43,14 +43,14 @@ uni.login({
})
},
fail: function (err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
}
});
```
```
- 5+ App项目
``` js
- 5+ App项目
``` js
var facebookOauth = null;
plus.oauth.getServices(function(services) {
for (var i in services) {
......@@ -62,9 +62,9 @@ plus.oauth.getServices(function(services) {
}
}
facebookOauth.login( function(oauth){
// 授权成功,facebookOauth.authResult 中保存授权信息
// 授权成功,facebookOauth.authResult 中保存授权信息
}, function(err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
})
}, function(err) {
......
### 开通
- 注册[Google](https://accounts.google.com/)账号
- 登录[Google Cloud Platform](https://console.cloud.google.com/),打开“选择项目”界面选择已经创建的项目,如果没有创建项目,点击“新建项目”根据页面提示创建项目
### 开通
- 注册[Google](https://accounts.google.com/)账号
- 登录[Google Cloud Platform](https://console.cloud.google.com/),打开“选择项目”界面选择已经创建的项目,如果没有创建项目,点击“新建项目”根据页面提示创建项目
- 在左侧导航栏中选择 “API和服务” -> “凭证” 打开管理页面
- 点击 “创建凭证” -> “OAuth客户端ID”,根据提示选择“应用类型”,按需分别输入Android/iOS平台配置信息
- 创建凭证后iOS平台可以获取客户端ID(Android平台不需要客户端ID)
更多信息详见 [申请开通Google登录操作指南](https://uniapp.dcloud.io/tutorial/app-oauth-google-open)
更多信息详见 [申请开通Google登录操作指南](https://uniapp.dcloud.io/tutorial/app-oauth-google-open)
### 配置
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“OAuth(登录鉴权)”下,勾选“Google登录”:
![](https://native-res.dcloud.net.cn/images/uniapp/oauth/google-manifest.png)
- iOS平台客户端ID
Google云平台创建的OAuth2.0凭证的iOS平台客户端ID
- iOS平台客户端ID
Google云平台创建的OAuth2.0凭证的iOS平台客户端ID
**注意**
- HBuilderX中标准真机运行基座使用的是DCloud申请HBuilder应用的AppID等信息,仅用于体验Google登录功能
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用Google登录
### 使用Google登录
- uni-app项目
调用 [uni.login(OBJECT)](api/plugins/login?id=login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`google`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
- uni-app项目
调用 [uni.login(OBJECT)](/api/plugins/login.md#login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`google`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
#### 示例代码
- uni-app项目
``` js
#### 示例代码
- uni-app项目
``` js
uni.login({
provider: 'google',
success: function (loginRes) {
......@@ -43,28 +43,28 @@ uni.login({
})
},
fail: function (err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
}
});
```
```
- 5+ App项目
``` js
- 5+ App项目
``` js
var googleOauth = null;
plus.oauth.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取微信登录对象
// 获取微信登录对象
if (service.id == 'google') {
googleOauth = service;
break;
}
}
googleOauth.login( function(oauth){
// 授权成功,googleOauth.authResult 中保存授权信息
// 授权成功,googleOauth.authResult 中保存授权信息
}, function(err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
})
}, function(err) {
......
### 开通
- 登录[腾讯开放平台](https://connect.qq.com/index.html),打开 “应用管理” -> “移动应用” 页面
### 开通
- 登录[腾讯开放平台](https://connect.qq.com/index.html),打开 “应用管理” -> “移动应用” 页面
- 在页面中选择 “创建应用” -> “创建移动应用”,根据提示填写信息创建应用
- 创建成功后,在应用详情中页面可以获取 APP ID
- 在应用详情页面的 “基本信息” -> “平台信息” 中,点击“修改”可以设置iOS平台的通用链接(UniversalLink)
......@@ -8,14 +8,14 @@
### 配置
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“OAuth(登录鉴权)”下,勾选“QQ登录”:
![](https://native-res.dcloud.net.cn/images/uniapp/oauth/qq-manifest.png)
- appid
QQ开放平台申请应用的AppID值
- UniversalLinks
iOS平台通用链接,必须与QQ开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
- appid
QQ开放平台申请应用的AppID值
- UniversalLinks
iOS平台通用链接,必须与QQ开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
......@@ -23,17 +23,17 @@ iOS平台通用链接,必须与QQ开放平台配置的一致,推荐使用[
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用QQ登录
### 使用QQ登录
- uni-app项目
调用 [uni.login(OBJECT)](api/plugins/login?id=login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`qq`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
- uni-app项目
调用 [uni.login(OBJECT)](/api/plugins/login.md#login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`qq`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
#### 示例代码
- uni-app项目
``` js
#### 示例代码
- uni-app项目
``` js
uni.login({
provider: 'qq',
success: function (loginRes) {
......@@ -46,28 +46,28 @@ uni.login({
})
},
fail: function (err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
}
});
```
```
- 5+ App项目
``` js
- 5+ App项目
``` js
var qqOauth = null;
plus.oauth.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取QQ登录对象
// 获取QQ登录对象
if (service.id == 'qq') {
qqOauth = service;
break;
}
}
qqOauth.login( function(oauth){
// 授权成功,qqOauth.authResult 中保存授权信息
// 授权成功,qqOauth.authResult 中保存授权信息
}, function(err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
})
}, function(err) {
......
### 开通
- 登录[新浪微博开放平台](http://open.weibo.com/),打开 “移动应用 MOBILE” 页面
- 在页面中选择 “立即接入”,根据提示填写信息创建应用
- 创建成功后,在 “我的应用” 中点击应用,可以在应用详情页面
- 在应用详情页面的 “应用信息” -> “基本信息” 中可获取 App Key,点击编辑可设置iOS平台的通用链接(UniversalLink)
- 在应用详情页面的 “应用信息” -> “高级信息” -> “OAuth2.0 授权设置” 中可以设置授权回调页(redirect_url)
### 开通
- 登录[新浪微博开放平台](http://open.weibo.com/),打开 “移动应用 MOBILE” 页面
- 在页面中选择 “立即接入”,根据提示填写信息创建应用
- 创建成功后,在 “我的应用” 中点击应用,可以在应用详情页面
- 在应用详情页面的 “应用信息” -> “基本信息” 中可获取 App Key,点击编辑可设置iOS平台的通用链接(UniversalLink)
- 在应用详情页面的 “应用信息” -> “高级信息” -> “OAuth2.0 授权设置” 中可以设置授权回调页(redirect_url)
更多信息详见新浪微博官方文档 [移动应用接入](https://open.weibo.com/wiki/Connect/login)
### 配置
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“OAuth(登录鉴权)”下,勾选“新浪微博登录”:
![](https://native-res.dcloud.net.cn/images/uniapp/oauth/sina-manifest.png)
- appkey
新浪微博开放平台申请应用的AppKey值
- redirect_url
新浪微博开放平台申请应用中设置的授权回调页
- UniversalLinks
iOS平台通用链接,必须与新浪微博开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
- appkey
新浪微博开放平台申请应用的AppKey值
- redirect_url
新浪微博开放平台申请应用中设置的授权回调页
- UniversalLinks
iOS平台通用链接,必须与新浪微博开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
......@@ -26,17 +26,17 @@ iOS平台通用链接,必须与新浪微博开放平台配置的一致,推
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用新浪微博登录
### 使用新浪微博登录
- uni-app项目
调用 [uni.login(OBJECT)](api/plugins/login?id=login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`sinaweibo`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
- uni-app项目
调用 [uni.login(OBJECT)](/api/plugins/login.md#login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`sinaweibo`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
#### 示例代码
- uni-app项目
``` js
#### 示例代码
- uni-app项目
``` js
uni.login({
provider: 'sinaweibo',
success: function (loginRes) {
......@@ -49,28 +49,28 @@ uni.login({
})
},
fail: function (err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
}
});
```
```
- 5+ App项目
``` js
- 5+ App项目
``` js
var weiboOauth = null;
plus.oauth.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取新浪微博登录对象
// 获取新浪微博登录对象
if (service.id == 'sinaweibo') {
weiboOauth = service;
break;
}
}
weiboOauth.login( function(oauth){
// 授权成功,weiboOauth.authResult 中保存授权信息
// 授权成功,weiboOauth.authResult 中保存授权信息
}, function(err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
})
}, function(err) {
......
> 此文档为App端登录说明,H5和小程序端[详情](https://uniapp.dcloud.io/api/plugins/login.html#login)
### 开通
### 开通
- 登录[微信开放平台](https://open.weixin.qq.com/),添加移动应用并提交审核,审核通过后可获取应用ID(AppID),AppSecret等信息
- 在应用详情中`申请开通`微信登录功能,根据页面提示填写资料,提交审核
- 申请审核通过后即可打包使用微信授权登录功能
> 更多信息详见微信官方文档 [移动应用微信登录开放指南](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html)
### 配置
### 配置
打开项目的manifest.json文件,在“App模块配置”项的“OAuth(登录鉴权)”下,勾选“微信登录”:
![](https://native-res.dcloud.net.cn/images/uniapp/oauth/weixin-manifest.png)
- appid
微信开放平台申请应用的AppID值
- appid
微信开放平台申请应用的AppID值
- appSecret(HBuilderX3.4.18+ 不再提供此参数的可视化配置,详见[配置参数安全性问题](#配置参数安全性问题)</br>
微信开放平台申请应用的AppSecret值
- UniversalLinks
iOS平台通用链接,必须与微信开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
微信开放平台申请应用的AppSecret值
- UniversalLinks
iOS平台通用链接,必须与微信开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
- HBuilderX中标准真机运行基座使用的是DCloud申请HBuilder应用的AppID等信息,仅用于体验微信登录功能
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用微信登录
### 使用微信登录
1. 客户端调用api向微信请求授权,获取临时票据(code),向开发者业务服务器发起网络请求
2. 业务服务器通过code + 仅保存在服务器的appsecret参数,向:微信开放平台接口发起网络请求[详情](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Authorized_API_call_UnionID.html)
3. 业务服务器成功获取用户信息后,再依据unionid或openid查数据库的用户表并生成新token,并返回token给客户端
4. 客户端得到token后,保存到storage完成登录。
示例代码
- uni-app项目
``` js
uni.login({
示例代码
- uni-app项目
``` js
uni.login({
"provider": "weixin",
"onlyAuthorize": true, // 微信登录仅请求授权认证
success: function(event){
......@@ -50,21 +50,21 @@ uni.login({
});
},
fail: function (err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
}
})
```
> 相关API文档: [uni.login](https://uniapp.dcloud.io/api/plugins/login.html#login),[uni.request](https://uniapp.dcloud.io/api/request/request.html)
- 5+ App项目
- 5+ App项目
``` js
``` js
var weixinOauth = null;
plus.oauth.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取微信登录对象
// 获取微信登录对象
if (service.id == 'weixin') {
weixinOauth = service;
break;
......@@ -84,7 +84,7 @@ plus.oauth.getServices(function(services) {
}
});
}, function(err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
})
}, function(err) {
......@@ -93,20 +93,20 @@ plus.oauth.getServices(function(services) {
```
> 相关API文档: [plus.oauth.getServices](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices),[plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService)
#### 配置参数安全性问题
#### 配置参数安全性问题
HBuilderX中配置的appsecret参数,云端打包后会保存在apk/ipa中,存在参数泄露的风险!HBuilderX3.4.18+ 不再提供此参数的可视化配置。
对于安全性要求较低的开发者,可以通过manifest.json -> 源码视图 -> app-plus -> distribute -> sdkConfigs -> oauth -> weixin -> 添加appsecret 配置。即可不经业务服务器验证完成登录:
- uni-app项目
调用 [uni.login(OBJECT)](api/plugins/login?id=login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`weixin`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
- uni-app项目
调用 [uni.login(OBJECT)](/api/plugins/login.md#login) 发起授权登录,调用 [uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo) 获取用户信息,OBJECT参数中provider属性值固定为`weixin`
- 5+ App项目
调用 [plus.oauth.getServices(successCB,errorCB)](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.getServices) 获取登录服务对象 [plus.oauth.AuthService](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService), 再调用其 [login](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.login) 方法进行登录认证、[getUserInfo](https://www.html5plus.org/doc/zh_cn/oauth.html#plus.oauth.AuthService.getUserInfo)方法获取用户信息
#### 示例代码
- uni-app项目
``` js
#### 示例代码
- uni-app项目
``` js
uni.login({
provider: 'weixin',
success: function (loginRes) {
......@@ -119,28 +119,28 @@ uni.login({
})
},
fail: function (err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
}
});
```
```
- 5+ App项目
``` js
- 5+ App项目
``` js
var weixinOauth = null;
plus.oauth.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取微信登录对象
// 获取微信登录对象
if (service.id == 'weixin') {
weixinOauth = service;
break;
}
}
weixinOauth.login( function(oauth){
// 授权成功,weixinOauth.authResult 中保存授权信息
// 授权成功,weixinOauth.authResult 中保存授权信息
}, function(err) {
// 登录授权失败
// 登录授权失败
// err.code是错误码
})
}, function(err) {
......
......@@ -2,7 +2,7 @@ App端OAuth(登录鉴权)模块封装了市场上主流的三方登录SDK,提
|项目类型|API|
|:-|:-|
|uni-app|[uni.preLogin(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=prelogin)[uni.login(OBJECT)](api/plugins/login?id=login)[uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo)[uni.closeAuthView()](https://uniapp.dcloud.io/api/plugins/login?id=closeauthview)[uni.getCheckBoxState(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getcheckboxstate)[uni.getUniverifyManager(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuniverifymanager)|
|uni-app|[uni.preLogin(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=prelogin)[uni.login(OBJECT)](/api/plugins/login.md#login)[uni.getUserInfo(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo)[uni.closeAuthView()](https://uniapp.dcloud.io/api/plugins/login?id=closeauthview)[uni.getCheckBoxState(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getcheckboxstate)[uni.getUniverifyManager(OBJECT)](https://uniapp.dcloud.io/api/plugins/login?id=getuniverifymanager)|
|5+App/Wap2App|[plus.oauth.*](https://www.html5plus.org/doc/zh_cn/oauth.html)
如果服务端使用[uniCloud](https://uniapp.dcloud.io/uniCloud/README),官方提供了[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)云端统一登录服务,把微信登录、短信验证码登录及角色权限管理等服务端登录开发,进行了统一的封装。前端统一的`uni.login`和云端统一的`uni-id`搭配,可以极大提升登录业务的开发效率,强烈推荐给开发者使用。
......@@ -18,11 +18,11 @@ App端OAuth(登录鉴权)模块封装了市场上主流的三方登录SDK,提
- 在App项目中调用API进行登录,成功后获取到授权标识提交到业务服务器完成登录操作
支持的三方登录平台:
- [一键登录(univerify)](univerify.md)
- [一键登录(univerify)](/univerify.md)
- [苹果登录(Sign in with Apple)](app-oauth-apple.md)
- [微信登录](app-oauth-weixin.md)
- [QQ登录](app-oauth-qq.md)
- [新浪微博登录](app-oauth-sina.md)
- [新浪微博登录](app-oauth-weixin.md)
- [Google登录](app-oauth-google.md)
- [Facebook登录](app-oauth-facebook.md)
......
......@@ -2,7 +2,7 @@ App端支付模块封装了市场上主流的三方支付平台SDK,提供JS AP
|项目类型|API|
|:-|:-|
|uni-app|[uni.requestPayment(OBJECT)](api/plugins/payment?id=requestpayment)|
|uni-app|[uni.requestPayment(OBJECT)](/api/plugins/payment.md#requestpayment)|
|5+ App/Wap2App|[plus.payment.*](https://www.html5plus.org/doc/zh_cn/payment.html)
如果服务端使用[uniCloud](https://uniapp.dcloud.io/uniCloud/README),官方提供了[uniPay](https://uniapp.dcloud.io/uniCloud/unipay)云端统一支付服务,极大提升支付业务的开发效率,强烈推荐给开发者使用,参考示例:[https://ext.dcloud.net.cn/plugin?id=1835](https://ext.dcloud.net.cn/plugin?id=1835)
......@@ -18,14 +18,14 @@ App端支付模块封装了市场上主流的三方支付平台SDK,提供JS AP
- 在客户端调用API进行支付
支持的三方支付平台:
- [Apple应用内支付](https://uniapp.dcloud.io/app-payment-aip)
- [Apple应用内支付](https://uniapp.dcloud.io/app-payment-aip)
HBuilderX1.0.0+版本支持
- [支付宝支付](https://uniapp.dcloud.io/app-payment-alipay)
- [微信支付](https://uniapp.dcloud.io/app-payment-weixin)
- [Paypal支付](https://uniapp.dcloud.io/app-payment-paypal)
- [支付宝支付](https://uniapp.dcloud.io/app-payment-alipay)
- [微信支付](https://uniapp.dcloud.io/app-payment-weixin)
- [Paypal支付](https://uniapp.dcloud.io/app-payment-paypal)
HBuilderX3.3.7+版本支持
- [Stripe支付](https://uniapp.dcloud.io/app-payment-stripe)
- [Stripe支付](https://uniapp.dcloud.io/app-payment-stripe)
HBuilderX3.3.7+版本支持
- [Google支付](https://uniapp.dcloud.io/app-payment-google)
- [Google支付](https://uniapp.dcloud.io/app-payment-google)
HBuilderX3.3.7+版本支持
> HBuilderX2.6.3+版本开始支持配置隐私政策提示框
> HBuilderX3.1.10+版本优化template模式策略,解决应用市场检测到弹出隐私政策提示框之前读取mac地址和应用列表的问题
> HBuilderX3.2.1+版本开始支持androidPrivacy.json文件配置隐私政策提示框,真机运行时也可生效
> HBuilderX3.2.5+版本隐私政策提示框内容中的链接支持本地 html 页面地址
> `注意:目前设置custom模式策略,并不能完全避免在弹出隐私提示框之前,读取设备信息(如mac地址、应用列表等)的情况,主要原因是自定义模式隐私提示框并不能阻塞应用的生命周期,使用到一些三方SDK(如X5 Webview内核、UniPush等)在应用启动时会执行初始化操作,三方SDK这是可能会读取设备信息。碰到此问题的开发者请先使用template模式解决,我们后续会提供新的自定义隐私提示框样式解决方案。`
> HBuilderX2.6.3+版本开始支持配置隐私政策提示框
> HBuilderX3.1.10+版本优化template模式策略,解决应用市场检测到弹出隐私政策提示框之前读取mac地址和应用列表的问题
> HBuilderX3.2.1+版本开始支持androidPrivacy.json文件配置隐私政策提示框,真机运行时也可生效
> HBuilderX3.2.5+版本隐私政策提示框内容中的链接支持本地 html 页面地址
> `注意:目前设置custom模式策略,并不能完全避免在弹出隐私提示框之前,读取设备信息(如mac地址、应用列表等)的情况,主要原因是自定义模式隐私提示框并不能阻塞应用的生命周期,使用到一些三方SDK(如X5 Webview内核、UniPush等)在应用启动时会执行初始化操作,三方SDK这是可能会读取设备信息。碰到此问题的开发者请先使用template模式解决,我们后续会提供新的自定义隐私提示框样式解决方案。`
**请使用HBuilderX`3.2.15`+ 版本打包,并使用template配置隐私弹窗否则无法正常上架应用市场**
**uni小程序SDK暂时不支持uniapp自己配置隐私弹窗,需要宿主自行实现隐私弹窗**
**请使用HBuilderX`3.2.15`+ 版本打包,并使用template配置隐私弹窗否则无法正常上架应用市场**
**uni小程序SDK暂时不支持uniapp自己配置隐私弹窗,需要宿主自行实现隐私弹窗**
DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`服务,可在线申请获取详细检测报告,详见:[uni隐私合规检测](/uni-app-privacy-detect.md)
DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`服务,可在线申请获取详细检测报告,详见:[uni隐私合规检测](/tutorial/app-privacy-detect.md)
### 概述
### 概述
根据工业和信息化部关于开展APP侵害用户权益专项整治要求,App提交到应用市场必须满足以下条件:
- 应用启动运行时需弹出隐私政策协议,说明应用采集用户数据
这里将详细介绍如何配置弹出“隐私协议和政策”提示框
- 应用不能强制要求用户授予权限,即不能“不给权限不让用”
如不希望应用启动时申请“读写手机存储”和“访问设备信息”权限,请参考:[https://ask.dcloud.net.cn/article/36549](https://ask.dcloud.net.cn/article/36549)
- 应用启动运行时需弹出隐私政策协议,说明应用采集用户数据
这里将详细介绍如何配置弹出“隐私协议和政策”提示框
- 应用不能强制要求用户授予权限,即不能“不给权限不让用”
如不希望应用启动时申请“读写手机存储”和“访问设备信息”权限,请参考:[https://ask.dcloud.net.cn/article/36549](https://ask.dcloud.net.cn/article/36549)
为了兼顾隐私政策提示框的易用性和灵活性,解决弹出隐私政策提示框之前可能弹出系统授权框的问题。Android平台提供了以下隐私政策提示配置策略:
- template
使用原生提供的隐私政策模板提示框,应用启动时在splash界面弹出。
+ 优点:在系统授权提示框之前显示,用户点击确认后才会进入应用
+ 缺点:只能配置提示文本及链接地址,无法自定义提示框样式
- none
不处理隐私政策
不提交到应用市场时使用
- template
使用原生提供的隐私政策模板提示框,应用启动时在splash界面弹出。
+ 优点:在系统授权提示框之前显示,用户点击确认后才会进入应用
+ 缺点:只能配置提示文本及链接地址,无法自定义提示框样式
- none
不处理隐私政策
不提交到应用市场时使用
<a id='collect'></a>
### DCloud数据采集说明
为了持续优化应用及提供统计报表功能,在运行过程中会采集应用启动时间、异常错误日志等数据,其中包含设备唯一识别码。
> DCloud通过了国家信息安全等级保护三级,证书编号:11010813802-20001,保障相关数据的安全性
> DCloud并非大数据公司,采集的数据是为开发者提供统计服务和产品持续优化,不包含个人隐私信息
### DCloud数据采集说明
为了持续优化应用及提供统计报表功能,在运行过程中会采集应用启动时间、异常错误日志等数据,其中包含设备唯一识别码。
> DCloud通过了国家信息安全等级保护三级,证书编号:11010813802-20001,保障相关数据的安全性
> DCloud并非大数据公司,采集的数据是为开发者提供统计服务和产品持续优化,不包含个人隐私信息
**请在《隐私政策》中必告知用户您的应用基于DCloud uni-app(5+ App/Wap2App)开发,增加如下参考条款**
`我们的产品基于DCloud uni-app(5+ App/Wap2App)开发,应用运行期间需要收集您的设备唯一识别码(IMEI/android ID/DEVICE_ID/IDFA、SIM 卡 IMSI 信息、OAID)以提供统计分析服务,并通过应用启动数据及异常错误日志分析改进性能和用户体验,为用户提供更好的服务。详情内容请访问《DCloud用户服务条款》。(DCloud用户服务条款超链至:https://ask.dcloud.net.cn/protocol.html)`
### 配置方式
### 配置方式
#### HBuilderX3.2.1及以上版本配置方式
#### HBuilderX3.2.1及以上版本配置方式
从HBuilderX3.2.1+版本开始新增androidPrivacy.json文件配置隐私政策提示框,支持真机运行查看效果,在androidPrivacy.json中也支持配置部分样式(如背景颜色、标题颜色、按钮颜色等)。
打开项目的manifest.json文件,切换到“App启动界面配置”,在“Android启动界面样式”中勾选“使用原生隐私政策提示框”
![](https://native-res.dcloud.net.cn/images/uniapp/privacy/manifest-android.png)
......@@ -51,7 +51,7 @@ DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`
勾选后会在项目中自动添加androidPrivacy.json文件,可以双击打开自定义配置以下内容:
```json
{
"version": "1",
"version": "1",
"prompt": "template",
"title": "服务协议和隐私政策",
"message": "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
......@@ -69,7 +69,7 @@ DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`
"support": false,
"loadNativePlugins": false,
"visitorEntry": true,
"showAlways": false
"showAlways": false
},
"styles": {
"backgroundColor": "#00FF00",
......@@ -89,54 +89,54 @@ DCloud联合业内主流隐私合规检测厂商推出了`uni隐私合规检测`
}
}
```
- version
隐私政策版本号,如果应用升级后希望重新弹出隐私政策提示框,则需要设置新版本
- prompt
是否使用原生隐私政策提示框,值为“template”表示使用,“none”表示不使用
- title
隐私政策提示框标题文本内容
- message
隐私政策提示框正文内容,支持富文本richtext类型字符串,支持a/font/br等节点,点击a链接会调用内置页面打开其href属性中链接地址。
**注意:务必配置此提示内容,参考上面示例内容并修改《服务协议》和《隐私政策》链接地址**
- buttonAccept
模板提示框上接受按钮的文本,默认值为“同意”
- buttonRefuse
模板提示框上拒绝按钮的文本,默认不显示此按钮
- version
隐私政策版本号,如果应用升级后希望重新弹出隐私政策提示框,则需要设置新版本
- prompt
是否使用原生隐私政策提示框,值为“template”表示使用,“none”表示不使用
- title
隐私政策提示框标题文本内容
- message
隐私政策提示框正文内容,支持富文本richtext类型字符串,支持a/font/br等节点,点击a链接会调用内置页面打开其href属性中链接地址。
**注意:务必配置此提示内容,参考上面示例内容并修改《服务协议》和《隐私政策》链接地址**
- buttonAccept
模板提示框上接受按钮的文本,默认值为“同意”
- buttonRefuse
模板提示框上拒绝按钮的文本,默认不显示此按钮
- hrefLoader HX 3.4.13之后版本新增,system 使用系统webview 打开隐私协议链接,默认使用uni-app内置web组件
隐私政策提示框中的链接地址加载方式,可取值:system-表示使用系统浏览器打开;default-表示使用应用内置webview页面打开。默认值为default。
**注意:可能有些检测机构认为webview会读取隐私信息,这时可以配置为system来解决此问题**
隐私政策提示框中的链接地址加载方式,可取值:system-表示使用系统浏览器打开;default-表示使用应用内置webview页面打开。默认值为default。
**注意:可能有些检测机构认为webview会读取隐私信息,这时可以配置为system来解决此问题**
- backToExit HX 3.6.20之后版本新增。用来设置弹出隐私弹窗时,用户点击系统回退按钮 是否能退出应用。默认为false 不退出。部分应用市场不接受此行为,则开发者可以设置为true,允许用户点击回退按钮时,退出应用。
- disagreeMode
用户不同意隐私协议的响应配置 **具体配置及说明查看**[https://uniapp.dcloud.io/app-disagreemode](https://uniapp.dcloud.io/app-disagreemode)
+ support 用户拒绝隐私协议后,是否直接进入游客模式,默认false关闭
+ loadNativePlugins 表示在disagreeMode模式是否加载uni原生插件,true表示加载;false表示不加载(此时调用uni.requireNativePlugin加载插件扩展Module返回undefined,扩展组件Component也无法使用)。默认值为true。
- disagreeMode
用户不同意隐私协议的响应配置 **具体配置及说明查看**[https://uniapp.dcloud.io/app-disagreemode](https://uniapp.dcloud.io/app-disagreemode)
+ support 用户拒绝隐私协议后,是否直接进入游客模式,默认false关闭
+ loadNativePlugins 表示在disagreeMode模式是否加载uni原生插件,true表示加载;false表示不加载(此时调用uni.requireNativePlugin加载插件扩展Module返回undefined,扩展组件Component也无法使用)。默认值为true。
+ visitorEntry HBuilderX 3.6.7 版本后支持,默认false,当设置为true,隐私协议弹窗 会出现 游客模式 按钮
+ showAlways HBuilderX 3.6.10 版本后支持,默认false 标记用户拒绝协议后,下次启动是否继续弹出,默认false,拒绝后不弹出
- second
配置二次确认提示框显示内容,message属性值不为空时弹出二次确认提示框
+ title 二次确认提示框上的标题
+ message 二次确认提示框上的内容,支持富文本richtext类型字符串
+ buttonAccept 二次确认提示框上接受按钮的文本
+ buttonRefuse 二次确认提示框上拒绝按钮的文本
- styles
配置隐私政策提示框样式
+ backgroundColor 提示框背景颜色,#RRGGBB格式字符串
+ borderRadius 提示框背景圆角半径,单位为px(逻辑像素)
+ title 提示框标题样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
+ buttonAccept 接受按钮样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
+ buttonRefuse 拒绝按钮样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
+ buttonVisitor HX 3.6.7 版本后支持,游客模式按钮样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
uni-app项目可以使用uni原生插件能支持更多自定义隐私政策提示框样式,可参考:[https://ext.dcloud.net.cn/plugin?id=5581](https://ext.dcloud.net.cn/plugin?id=5581)
#### HBuilderX3.2.0及以下版本配置方法
打开项目的manifest.json文件,切换到“源码视图”项
- uni-app项目
在 "app-plus" -> "privacy" 节点下添加 prompt节点
- 5+ App项目
在 "plus" -> "privacy" 节点下添加 prompt节点
privacy节点数据格式如下:
- second
配置二次确认提示框显示内容,message属性值不为空时弹出二次确认提示框
+ title 二次确认提示框上的标题
+ message 二次确认提示框上的内容,支持富文本richtext类型字符串
+ buttonAccept 二次确认提示框上接受按钮的文本
+ buttonRefuse 二次确认提示框上拒绝按钮的文本
- styles
配置隐私政策提示框样式
+ backgroundColor 提示框背景颜色,#RRGGBB格式字符串
+ borderRadius 提示框背景圆角半径,单位为px(逻辑像素)
+ title 提示框标题样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
+ buttonAccept 接受按钮样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
+ buttonRefuse 拒绝按钮样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
+ buttonVisitor HX 3.6.7 版本后支持,游客模式按钮样式,其下仅支持color属性配置文本颜色,值为#RRGGBB格式字符串
uni-app项目可以使用uni原生插件能支持更多自定义隐私政策提示框样式,可参考:[https://ext.dcloud.net.cn/plugin?id=5581](https://ext.dcloud.net.cn/plugin?id=5581)
#### HBuilderX3.2.0及以下版本配置方法
打开项目的manifest.json文件,切换到“源码视图”项
- uni-app项目
在 "app-plus" -> "privacy" 节点下添加 prompt节点
- 5+ App项目
在 "plus" -> "privacy" 节点下添加 prompt节点
privacy节点数据格式如下:
```
"privacy": {
"prompt": "template", //可取值template、none
......@@ -144,17 +144,17 @@ privacy节点数据格式如下:
}
}
```
- prompt
字符串类型,必填,隐私政策提示框配置策略,可取值template,none,默认值为none
+ template
使用原生提示框模板,可自定义标题、内容已经按钮上的文本
- prompt
字符串类型,必填,隐私政策提示框配置策略,可取值template,none,默认值为none
+ template
使用原生提示框模板,可自定义标题、内容已经按钮上的文本
+ none
不弹出隐私政策提示框
- template
json格式,可选,模板提示框上显示的内容
不弹出隐私政策提示框
- template
json格式,可选,模板提示框上显示的内容
#### 模板提示框
配置promt属性值为template时,表示使用原生模板隐私政策提示框,效果如下:
#### 模板提示框
配置promt属性值为template时,表示使用原生模板隐私政策提示框,效果如下:
![](https://native-res.dcloud.net.cn/images/uniapp/privacy/template-android.png)
**应用启动前,在Splash页面时显示此提示框,用户点击同意按钮后才会进入应用**
......@@ -173,7 +173,7 @@ privacy节点数据格式如下:
"message": "  进入应用前,你需先同意<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>,否则将退出应用。",
"buttonAccept": "同意并继续",
"buttonRefuse": "退出应用",
}
}
}
}
```
......@@ -266,9 +266,9 @@ HBuilderX3.1.12+版本新增支持模板隐私提示框二次确认功能,点
> HBuilderX3.2.12+版本androidPrivacy.json支持国际化
- uni-app项目
可参考page.json文件国际化方式处理,详见:[uni-app项目 pages.json 国际化](https://uniapp.dcloud.io/tutorial/i18n.html#nvue)
- 5+ App项目
- uni-app项目
可参考page.json文件国际化方式处理,详见:[uni-app项目 pages.json 国际化](https://uniapp.dcloud.io/tutorial/i18n.html#nvue)
- 5+ App项目
不支持uni-app形式的国际化配置,可以对androidPrivacy.json文件中需要国际化处理的字段添加Locales,示例如下:
```
{
......@@ -289,7 +289,7 @@ HBuilderX3.1.12+版本新增支持模板隐私提示框二次确认功能,点
}
```
### 隐私协议内容需要注意的问题
### 隐私协议内容需要注意的问题
需要在《隐私政策》中必告知用户您的应用基于DCloud uni-app(5+ App/Wap2App)开发,添加如下参考条款:
......
......@@ -8,7 +8,7 @@
### 安全漏洞风险问题的处理原则
**对于反馈的安全漏洞问题我们会根据风险等级,优先解决高风险和中风险问题**
**对于反馈的安全漏洞问题我们会根据风险等级,优先解决高风险和中风险问题**
对于低风险问题,理论上不会影响应用的安全质量,因此通常情况下不会解决低风险安全漏洞问题。
首先我们需要判断风险漏洞是哪些代码引起的,可以通过安全检测报告中漏洞详情中的`漏洞代码`类名进行判断,如果是以"io.dcloud"开头则表示是DCloud的代码,如下:
......@@ -16,11 +16,11 @@
如果是以其它字符开头,则表示是三方SDK或uni原生插件的代码,如下:
![](https://native-res.dcloud.net.cn/images/uniapp/security/android/third.png)
- DCloud代码的问题
- DCloud代码的问题
这类问题我们会尽快处理解决,或提供相关配置
- 三方SDK代码的问题
- 三方SDK代码的问题
由于没有三方SDK源码,我们无法修改三方SDK的风险漏洞,建议根据实际情况选择是否使用对应功能模块来规避。同时也需要开发者积极反馈到相关平台提供修复漏洞风险问题的SDK,我们会关注三方SDK的更新,并及时更新对应功能模块。
- uni原生插件代码的问题
- uni原生插件代码的问题
uni原生插件源码有插件作者维护,需要联系插件作者解决
......@@ -40,94 +40,89 @@ uni原生插件源码有插件作者维护,需要联系插件作者解决
<a id="web_untrustedca"/>
#### Webview绕过证书校验漏洞 及 Android主机名\证书弱校验风险
**修复方案**
**修复方案**
HBuilderX3.1.14+版本新增untrustedca节点配置是否允许使用非受信证书。
在项目manifest.json中"app-plus"->"ssl"节点下配置"untrustedca"为"refuse",示例如下:
``` json
"app-plus": { //5+ App项目对应节点名称为"plus"
"ssl": {
"untrustedca": "refuse"
},
// ...
"app-plus": { //5+ App项目对应节点名称为"plus"
"ssl": {
"untrustedca": "refuse"
},
// ...
}
```
untrustedca属性值域说明:
- "accept"
- "accept"
接受此非受信证书,继续访问;
- "refuse"
- "refuse"
拒绝此非受信证书,停止访问;
- "warning"
- "warning"
弹出警告提示框提醒用户,由用户确定是否继续访问,仅针对webview内部请求。
<a id="export"/>
#### Activity、Service、Receiver等组件导出风险
**风险描述**
#### Activity、Service、Receiver等组件导出风险@export
**风险描述**
APP的Activity、Service、Receiver等组件可以在AndroidManifest.xml中通过配置属性android:exported设置
为私有(false)或公有(true),设置为公有时则认为组件对外导出,可以被其它任何程序的任何组件访问。导出的组件可能被第三方App恶意调用,可能返回隐私信息给恶意应用,造成数据泄露;可能导致应用崩溃,造成拒绝服务等漏洞。
**修复方案**
**修复方案**
HBuilderX3.1.14+版本已经将DCloud管理的代码中所有不需要被外部访问的组件都设置为私有(即android:exported属性值设置为false),仅将需要被外部访问的组件,如App入口Activity(io.dcloud.PandoraEntry)设置为公有。
另外需要注意,一些三方SDK因为功能需要会将其组件设置为对外导出,如下:
- 微信SDK
- 微信SDK
使用微信分享、登录、支付模块时,因SDK功能需要会设置WXEntryActivity、WXPayEntryActivity等组件对外导出
- 个推SDK
- 个推SDK
UniPush模块用到个推SDK,内部功能涉及到CustomGTService、PushReceiver、GActivity、NotificationServic等组件都要求对外导出
#### 应用签名未校验风险
**风险描述**
#### 应用签名未校验风险
**风险描述**
签名证书是对App开发者身份的唯一标识,如果程序未对签名证书进行校验,可能被反编译后进行二次打包使用其它签名证书重新签名。如重新签名的App可以正常启动,则可能导致App被仿冒盗版,影响其合法收入,甚至可能被添加钓鱼代码、病毒代码、恶意代码,导致用户敏感信息泄露或者恶意攻击。
**修复方案**
**修复方案**
对APK进行加固,推荐[uni安全加固](/tutorial/app-security.md)其背后支持对接多个加固服务商,包括腾讯云和蚂蚁小程序云。
#### APK可被反编译后取得源代码风险
**风险描述**
#### APK可被反编译后取得源代码风险
**风险描述**
说的打包为App的原生APK可以被反编译获取Java源代码。
**修复方案**
**修复方案**
对APK进行加固,推荐[uni安全加固](/tutorial/app-security.md)其背后支持对接多个加固服务商,包括腾讯云和蚂蚁小程序云。
<a id="webview_jsinterface"/>
#### WebView远程代码执行漏洞
**风险描述**
#### WebView远程代码执行漏洞 @webview-jsinterface
**风险描述**
用该漏洞可以根据客户端能力实现远程任意代码执行攻击。 WebView 远程代码执行漏洞触发前提条件:
1. 使用addJavascriptInterface方法注册可供JavaScript调用的Java对象
2. 使用WebView加载外部网页或者本地网页
3. Android系统版本低于4.2。
**修复方案**
**修复方案**
HBuilderX发布到App的Android平台最低支持Android4.4,即minSdkVersion大于等于19。也就是说Android4.4及以上版本并不存在此漏洞,如果你的项目配置了minSdkVersion低于19,则请参考[https://ask.dcloud.net.cn/article/193](https://ask.dcloud.net.cn/article/193)修改。
#### 密钥硬编码漏洞
**风险描述**
**风险描述**
应用程序在加解密时,使用硬编码在程序中的密钥,攻击者通过反编译拿到密钥可以轻易解密APP通信数据
**修复方案**
**修复方案**
HBuilderX3.1.14+版本已修复此问题,在内部逻辑中使用的密钥全部做了混淆加密处理。
#### SO文件破解风险漏洞
**风险描述**
**风险描述**
SO文件为APK中包含的动态链接库文件,Android利用NDK技术将C/C++语言实现的核心代码编译为SO库文件供Java层调用。SO文件被破解可能导致应用的核心功能代码和算法泄露。攻击者利用核心功能与算法可轻易抓取到客户端的敏感数据,并对其解密,导致用户的隐私泄露或直接财产损失
**修复方案**
**修复方案**
对APK中的SO文件进行加固保护,推荐[uni安全加固](/tutorial/app-security.md)其背后支持对接多个加固服务商,包括腾讯云和蚂蚁小程序云。
#### Strandhogg漏洞
**风险描述**
**风险描述**
StrandHogg之所以独特,是因为它无需进行植根即可启用复杂的攻击,它利用Android的多任务系统中的一个弱点来实施强大的攻击,使恶意应用程序可以伪装成该设备上的任何其他应用程序。此漏洞利用基于一个称为“ taskAffinity”的Android控件设置,该控件允许任何应用程序(包括恶意应用程序)自由地采用其所需的多任务处理系统中的任何身份。
**修复方案**
该漏洞已于2020.4.1的安全补丁中修复(涵盖Android 8.0 / 8.1 / 9.0+)。由于已经通过系统补丁封堵。理论上该漏洞不会对高版本系统的手机设备构成威胁。
而app客户端开发并没有彻底规避该漏洞的方案。各检测平台推荐配置`android:taskAffinity=“”`,但仅是临时方案。但该方案会导致应用运行到android11+系统设备时任务堆栈窗口变成两个的问题。
**修复方案**
该漏洞已于2020.4.1的安全补丁中修复(涵盖Android 8.0 / 8.1 / 9.0+)。由于已经通过系统补丁封堵。理论上该漏洞不会对高版本系统的手机设备构成威胁。
而app客户端开发并没有彻底规避该漏洞的方案。各检测平台推荐配置`android:taskAffinity=“”`,但仅是临时方案。但该方案会导致应用运行到android11+系统设备时任务堆栈窗口变成两个的问题。
由于`android:taskAffinity=“”`配置存在bug!所以我们并不会默认这样配置。但为开发者提供的云打包配置选项。由开发者决定是否配置临时封堵该漏洞。具体如下:
+ 请使用HX3.3.10+版本。根据app类型在项目的manifest.json中配置`hasTaskAffinity`。true表示配置`android:taskAffinity=“”`,false不配置。默认为false
+ **uni-app** 请按如下配置填写到项目的manifest.json中。
......@@ -156,12 +151,12 @@ StrandHogg之所以独特,是因为它无需进行植根即可启用复杂的
```
#### 未配置网络安全属性漏洞
**风险描述**
**风险描述**
从Nougat(Android 7) 一个名为“Network Security Configuration'的新安全功能也随之而来。如果应用程序的 SDK高于或等于24,则只有系统证书才会被信任。Android Network Security Configuration 功能提供了一个简单的层,用来保护应用程序在未加密的明文中意外传输的敏感数据。可以针对特定域和特定应用配置这些设置。如缺少networkSecurityConfig 特性,应用程序将使用系统默认安全配置,致使应用程序在不安全的定制 ROM 上运行时可能遭受恶意网络攻击。
**修复方案**
**修复方案**
+ 根据Android平台[网络安全配置文档](https://developer.android.google.cn/training/articles/security-config?hl=zh-cn)生成`network_security_config.xml`配置文件
+ 根据Android平台[网络安全配置文档](https://developer.android.google.cn/training/articles/security-config?hl=zh-cn)生成`network_security_config.xml`配置文件
+ 通过HBuilderX实现networkSecurityConfig配置!参考[Android原生应用清单文件和资源文档](https://uniapp.dcloud.net.cn/tutorial/app-nativeresource-android.html)
+`network_security_config.xml`文件拷贝到应用资源`nativeResources\android\res\xml`目录下
+ 配置`AndroidManifest.xml`中application节点!添加networkSecurityConfig属性配置。配置参考如下:
......
### 开通
- 登录[腾讯开放平台](https://connect.qq.com/index.html),打开 “应用管理” -> “移动应用” 页面
### 开通
- 登录[腾讯开放平台](https://connect.qq.com/index.html),打开 “应用管理” -> “移动应用” 页面
- 在页面中选择 “创建应用” -> “创建移动应用”,根据提示填写信息创建应用
- 创建成功后,在应用详情中页面可以获取 APP ID
- 在应用详情页面的 “基本信息” -> “平台信息” 中,点击“修改”可以设置iOS平台的通用链接(UniversalLink)
......@@ -8,14 +8,14 @@
### 配置
### 配置
打开项目的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)
- appid
QQ开放平台申请应用的AppID值
- UniversalLinks
iOS平台通用链接,必须与QQ开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
......@@ -23,17 +23,17 @@ iOS平台通用链接,必须与QQ开放平台配置的一致,推荐使用[
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](https://ask.dcloud.net.cn/article/35115)
### 使用QQ分享
### 使用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项目
调用 [uni.share(OBJECT)](/api/plugins/share.md#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-app项目
``` js
uni.share({
provider: 'qq',
summary: "我正在使用HBuilderX开发uni-app,赶紧跟我一起来体验!",
......@@ -44,15 +44,15 @@ uni.share({
console.log("fail:" + JSON.stringify(err));
}
});
```
```
- 5+ App项目
``` js
- 5+ App项目
``` js
var qqShare = null;
plus.share.getServices(function(services) {
for (var i in services) {
var service = services[i];
// 获取QQ分享对象
// 获取QQ分享对象
if (service.id == 'qq') {
qqShare = service;
break;
......@@ -61,9 +61,9 @@ plus.share.getServices(function(services) {
qqShare.send( {
content: '我正在使用HBuilderX开发App,赶紧跟我一起来体验!'
}, function(){
// 分享成功
// 分享成功
}, function(err) {
// 分享操作失败
// 分享操作失败
// err.code是错误码
})
}, function(err) {
......
### 开通
- 登录[新浪微博开放平台](http://open.weibo.com/),打开 “移动应用 MOBILE” 页面
- 在页面中选择 “立即接入”,根据提示填写信息创建应用
- 创建成功后,在 “我的应用” 中点击应用,可以在应用详情页面
- 在应用详情页面的 “应用信息” -> “基本信息” 中可获取 App Key,点击编辑可设置iOS平台的通用链接(UniversalLink)
### 开通
- 登录[新浪微博开放平台](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)
- appkey
新浪微博开放平台申请应用的AppKey值
- redirect_url
新浪微博开放平台申请应用中设置的回调页
- UniversalLinks
iOS平台通用链接,必须与新浪微博开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
......@@ -25,17 +25,17 @@ iOS平台通用链接,必须与新浪微博开放平台配置的一致,推
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](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项目
调用 [uni.share(OBJECT)](/api/plugins/share.md#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-app项目
``` js
uni.share({
provider: 'sinaweibo',
summary: "我正在使用HBuilderX开发uni-app,赶紧跟我一起来体验!",
......@@ -46,15 +46,15 @@ uni.share({
console.log("fail:" + JSON.stringify(err));
}
});
```
```
- 5+ App项目
``` js
- 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;
......@@ -63,9 +63,9 @@ plus.share.getServices(function(services) {
weiboShare.send( {
content: '我正在使用HBuilderX开发App,赶紧跟我一起来体验!'
}, function(){
// 分享成功
// 分享成功
}, function(err) {
// 分享操作失败
// 分享操作失败
// err.code是错误码
})
}, function(err) {
......
### 开通
### 开通
- 登录[微信开放平台](https://open.weixin.qq.com/),添加移动应用并提交审核,审核通过后可获取应用ID(AppID)
- 在应用详情中确认已获取`分享到朋友圈``分享给朋友`等接口
- 在HBuilderX中配置appid、iOS通用链接后即可打包使用微信分享功能
......@@ -7,14 +7,14 @@
### 配置
### 配置
打开项目的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)
- appid
微信开放平台申请应用的AppID值
- UniversalLinks
iOS平台通用链接,必须与微信开放平台配置的一致,推荐使用[一键生成iOS通用链接](https://uniapp.dcloud.io/api/plugins/universal-links.html)
**注意**
......@@ -22,17 +22,17 @@ iOS平台通用链接,必须与微信开放平台配置的一致,推荐使
- 配置参数需提交云端打包后才能生效,真机运行时请使用[自定义调试基座](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项目
调用 [uni.share(OBJECT)](/api/plugins/share.md#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-app项目
``` js
uni.share({
provider: "weixin",
scene: "WXSceneSession",
......@@ -45,15 +45,15 @@ uni.share({
console.log("fail:" + JSON.stringify(err));
}
});
```
```
- 5+ App项目
``` js
- 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;
......@@ -62,9 +62,9 @@ plus.share.getServices(function(services) {
weixinShare.send( {
content: '我正在使用HBuilderX开发App,赶紧跟我一起来体验!'
}, function(){
// 分享成功
// 分享成功
}, function(err) {
// 分享操作失败
// 分享操作失败
// err.code是错误码
})
}, function(err) {
......
......@@ -2,7 +2,7 @@ App端Share(分享)模块封装了市场上主流的三方分享SDK,提供JS A
|项目类型|API|
|:-|:-|
|uni-app|[uni.share(OBJECT)](api/plugins/share#share)[uni.shareWithSystem(OBJECT)](api/plugins/share#sharewithsystem)|
|uni-app|[uni.share(OBJECT)](/api/plugins/share.md#share)[uni.shareWithSystem(OBJECT)](/api/plugins/share.md#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)插件方便开发者使用。
......@@ -18,8 +18,8 @@ uni-app项目中,官方提供了封装好的[uni-share](https://ext.dcloud.net
- 在App项目中调用API进行分享操作
支持的三方分享平台:
- [微信分享](tutorial/app-share-weixin)
- [QQ分享](tutorial/app-share-qq)
- [新浪微博分享](tutorial/app-share-sina)
- [微信分享](./app-share-weixin.md)
- [QQ分享](./app-share-qq.md)
- [新浪微博分享](./app-share-weibo.md)
......@@ -61,21 +61,19 @@ HBuilderX中提供了以下`启动界面`方式:
| 启动界面 | 平台支持 | 特点 |
|-- |-- |-- |
| 通用启动界面 | Android、iOS均支持。其中在iOS上通过storyboard实现 |简单,自定义性弱、可适配不同屏幕 |
| 自定义启动图 | Android支持,同时支持使用[.9.png图片](#9png);iOS可以打包,但从2020年6月30日起,无法提交Appstore|为了适配不同屏幕尺寸,需要做大量图片 |
| 自定义启动图 | Android支持,同时支持使用[.9.png图片](#_9png);iOS可以打包,但从2020年6月30日起,无法提交Appstore|为了适配不同屏幕尺寸,需要做大量图片 |
|[自定义storyboard启动界面](#storyboard)|仅iOS支持,HBuilderX2.8+版本 | 可适配不同屏幕 |
> 提示:启动界面设置需提交云端打包后才能生效
<a id="common"/>
#### 通用启动界面
#### 通用启动界面@common
`通用启动界面`是一种简单、可适配不同屏幕的`启动界面`。它以app的logo、name为元素,自动生成适配不同屏幕尺寸、适配不同OS要求的`启动界面`
`通用启动界面`有着最低的门槛,仅需要开发者为app在manifest里配好logo和name即可。并且符合任何应用商店的上线规范。它在iOS上就是通过storyboard实现的。
> 提示`通用启动界面`是为了方便开发者而设计的,它不具有很强的灵活性,如果开发者有较强的自定义需求,Android平台请使用[.9.png格式自定义启动图](#9png)、iOS平台请使用[自定义storyboard启动界面](#storyboard)
> 提示`通用启动界面`是为了方便开发者而设计的,它不具有很强的灵活性,如果开发者有较强的自定义需求,Android平台请使用[.9.png格式自定义启动图](#_9png)、iOS平台请使用[自定义storyboard启动界面](#storyboard)
##### Android平台通用启动界面
......@@ -139,9 +137,7 @@ HBuilderX中提供了以下`启动界面`方式:
<a id="storyboard"/>
#### 自定义storyboard启动界面
#### 自定义storyboard启动界面@storyboard
Storyboard是Apple提供的一种简化的布局界面,通过xml描述界面,不能编程。
虽然无法制作非常灵活的界面,但满足启动界面是没问题的,比如设定背景色背景图、设定前景文字、图片的位置。
......
......@@ -22,4 +22,4 @@ HBuilder中有2种断点调试方案,一种是使用浏览器自带的调试
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/syncbreakpoint.jpg)
关于另一种使用HBuilderX的调试控制台的方案,[另见](h5-debug.md)
\ No newline at end of file
关于另一种使用HBuilderX的调试控制台的方案,[另见](/tutorial/debug/debug-web-via-chrome.md#h5-debug)
\ No newline at end of file
......@@ -217,9 +217,9 @@ HBuilderX 内置了 weex 调试工具的强化版,包括审查界面元素、
6. 只有```text```标签可以设置字体大小,字体颜色。
7. 布局不能使用百分比、没有媒体查询。
8. nvue 切换横竖屏时可能导致样式出现问题,建议有 nvue 的页面锁定手机方向。
9. 支持的css有限,不过并不影响布局出你需要的界面,```flex```还是非常强大的。[详见](/nvue-css?id=flex)
9. 支持的css有限,不过并不影响布局出你需要的界面,```flex```还是非常强大的。[详见](./nvue-css.md#flex)
10. 不支持背景图。但可以使用```image```组件和层级来实现类似web中的背景效果。因为原生开发本身也没有web这种背景图概念
11. css选择器支持的比较少,只能使用 class 选择器。[详见](/nvue-css)
11. css选择器支持的比较少,只能使用 class 选择器。[详见](./nvue-css.md)
12. nvue 的各组件在安卓端默认是透明的,如果不设置```background-color```,可能会导致出现重影的问题。
13. ```class``` 进行绑定时只支持数组语法。
14. Android端在一个页面内使用大量圆角边框会造成性能问题,尤其是多个角的样式还不一样的话更耗费性能。应避免这类使用。
......@@ -227,7 +227,7 @@ HBuilderX 内置了 weex 调试工具的强化版,包括审查界面元素、
16. 原生开发没有页面滚动的概念,页面内容高过屏幕高度并不会自动滚动,只有部分组件可滚动(```list``````waterfall``````scroll-view/scroller```),要滚的内容需要套在可滚动组件下。这不符合前端开发的习惯,所以在 nvue 编译为 uni-app模式时,给页面外层自动套了一个 ```scroller```,页面内容过高会自动滚动。(组件不会套,页面有```recycle-list```时也不会套)。后续会提供配置,可以设置不自动套。
17. 在 App.vue 中定义的全局js变量不会在 nvue 页面生效。```globalData``````vuex```是生效的。
18. App.vue 中定义的全局css,对nvue和vue页面同时生效。如果全局css中有些css在nvue下不支持,编译时控制台会报警,建议把这些不支持的css包裹在[条件编译](https://uniapp.dcloud.io/platform)里,```APP-PLUS-NVUE```
19. 不能在 ```style``` 中引入字体文件,nvue 中字体图标的使用参考:[加载自定义字体](/nvue-api?id=addrule)。如果是本地字体,可以用```plus.io```的API转换路径。
19. 不能在 ```style``` 中引入字体文件,nvue 中字体图标的使用参考:[加载自定义字体](./nvue-api.md#addrule)。如果是本地字体,可以用```plus.io```的API转换路径。
20. 目前不支持在 nvue 页面使用 ```typescript/ts```
21. nvue 页面关闭原生导航栏时,想要模拟状态栏,可以[参考文章](https://ask.dcloud.net.cn/article/35111)。但是,仍然强烈建议在nvue页面使用原生导航栏。nvue的渲染速度再快,也没有原生导航栏快。原生排版引擎解析```json```绘制原生导航栏耗时很少,而解析nvue的js绘制整个页面的耗时要大的多,尤其在新页面进入动画期间,对于复杂页面,没有原生导航栏会在动画期间产生整个屏幕的白屏或闪屏。
......
......@@ -6,7 +6,7 @@ uni-app项目中,一个页面就是一个符合`Vue SFC规范`的 vue 文件
- 在 uni-app js 引擎版中,后缀名是`.vue`文件或`.nvue`文件。
这些页面均全平台支持,差异在于当 uni-app 发行到App平台时,`.vue`文件会使用webview进行渲染,`.nvue`会使用原生进行渲染,详见:[nvue原生渲染](/tutorial/nvue-outline)
一个页面可以同时存在vue和nvue,在[pages.json](../collocation/pages.md)的路由注册中不包含页面文件名后缀,同一个页面可以对应2个文件名。重名时优先级如下:
- 在非app平台,先使用vue,忽略nvue
- 在app平台,使用nvue,忽略vue
......@@ -14,7 +14,7 @@ uni-app项目中,一个页面就是一个符合`Vue SFC规范`的 vue 文件
- 在 uni-app x 中,后缀名是`.uvue`文件
uni-app x 中没有js引擎和webview,不支持和vue页面并存。
uni-app x 在app-android上,每个页面都是一个全屏activity,不支持透明。
## 页面管理
......@@ -136,7 +136,7 @@ template中文名为`模板`,它类似html的标签。但有2个区别:
<text>标题</text>
</view>
<scroll-view>
</scroll-view>
</template>
```
......@@ -271,7 +271,7 @@ style的写法与web的css基本相同。
|onHide|监听页面隐藏|||
|onUnload|监听页面卸载|||
|onResize|监听窗口尺寸变化|App、微信小程序、快手小程序||
|onPullDownRefresh|监听用户下拉动作,一般用于下拉刷新,参考[示例](api/ui/pulldown)|||
|onPullDownRefresh|监听用户下拉动作,一般用于下拉刷新,参考[示例](/api/ui/pulldown.md)|||
|onReachBottom|页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体见下方注意事项|||
|onTabItemTap|点击 tab 时触发,参数为Object,具体见下方注意事项|微信小程序、QQ小程序、支付宝小程序、百度小程序、H5、App、快手小程序、京东小程序||
|onShareAppMessage|用户点击右上角分享|微信小程序、QQ小程序、支付宝小程序、抖音小程序、飞书小程序、快手小程序、京东小程序||
......@@ -342,14 +342,14 @@ onReady后,页面元素就可以自由操作了,比如ref获取节点。同
了解了页面加载时序原理,我们就知道如何避免页面加载常见的问题:
- 优化白屏的方法:
1. 页面dom太多,注意有的组件写的不好,会拖累整体页面。uni-app x 里减少dom数量的策略,[详见](../uni-app-x/performance.md)
1. 页面dom太多,注意有的组件写的不好,会拖累整体页面。uni-app x 里减少dom数量的策略,[详见](https://doc.dcloud.net.cn/uni-app-x/performance.html)
2. 联网不要在onReady里,那样太慢了,在onLoad里早点联网
3. 在pages.json里配置原生导航栏和背景色
4. 有的页面template内容非常少,整页就是一个需要联网加载的列表,这会造成虽然首批dom飞快渲染了,但页面其实还是白的,联网后才能显示字和图。
此时需要在template里做一些简单占位组件,比如loading组件、骨架屏,让本地先显示一些内容。
- 卡住动画不启动的原因:
1. 页面dom太多,注意有的组件写的不好,会拖累整体页面。uni-app x 里减少dom数量的策略,[详见](../uni-app-x/performance.md)
1. 页面dom太多,注意有的组件写的不好,会拖累整体页面。uni-app x 里减少dom数量的策略,[详见](https://doc.dcloud.net.cn/uni-app-x/performance.html)
2. onLoad里执行了耗时的同步计算
### onShow和onHide
......@@ -377,7 +377,7 @@ a页面刚进入时,会触发a页面的onShow。
**注意**
- `uni-app x android` 平台,如需获取 [activity 实例](plugin/uts-for-android.md#activity),此时当前页面的 `activity 实例`并未创建完成,会获取到上一个页面的 `activity 实例`(首页会获取应用默认的 `activity 实例`)。如需获取当前页面的 `activity 实例`,应在 `onShow``onReady` 生命周期中获取。
- `uni-app x android` 平台,如需获取 [activity 实例](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-for-android.html#activity),此时当前页面的 `activity 实例`并未创建完成,会获取到上一个页面的 `activity 实例`(首页会获取应用默认的 `activity 实例`)。如需获取当前页面的 `activity 实例`,应在 `onShow``onReady` 生命周期中获取。
### onReachBottom
......
因手机差异较大,HBuilder并没有提供App的模拟器。不管uni-app或5+App/wap2app项目,都需要连接真实的手机或手机模拟器来运行测试,称之为“真机运行”。
- Android平台
HBuilder支持adb协议,在HBuilder运行的电脑上,可以使用usb线连接Android设备,也可以使用安装在电脑上的Android模拟器(包括google官方模拟器,三方模拟器如“雷电”、“夜神”等)
- iOS平台
HBuilder支持itunes协议,在HBuilder运行的电脑上,使用usb线连接iPhone或iPad;如果是mac电脑,则可以连接XCode自带的iOS模拟器。如果是arm架构cpu,还可以直接启动真机运行基座。
- Android平台
HBuilder支持adb协议,在HBuilder运行的电脑上,可以使用usb线连接Android设备,也可以使用安装在电脑上的Android模拟器(包括google官方模拟器,三方模拟器如“雷电”、“夜神”等)
- iOS平台
HBuilder支持itunes协议,在HBuilder运行的电脑上,使用usb线连接iPhone或iPad;如果是mac电脑,则可以连接XCode自带的iOS模拟器。如果是arm架构cpu,还可以直接启动真机运行基座。
真机运行的目的,是为了实现代码修改的热刷新,避免打包才能看到效果。在HBuilder中编辑代码,在手机上实时看到修改效果,并且可以在HBuilder控制台看到日志。
......@@ -11,7 +11,7 @@ HBuilder支持itunes协议,在HBuilder运行的电脑上,使用usb线连接i
## 运行入口
通过HBuilder顶部运行菜单、或工具栏运行按钮、或快捷键,均可激活运行入口。
1. HBuilder顶部运行菜单
1. HBuilder顶部运行菜单
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/menurunapp.png" style="zoom: 50%;" />
......@@ -23,7 +23,7 @@ HBuilder支持itunes协议,在HBuilder运行的电脑上,使用usb线连接i
相比于HBuilder顶部运行菜单,工具栏运行按钮下的运行菜单内容较少,只保留了最常见的运行。
3. 快捷键【Ctrl+r】
3. 快捷键【Ctrl+r】
实际上激活了工具栏运行按钮。可继续搭配数字键,实现无鼠标快捷运行操作。
......@@ -31,45 +31,45 @@ HBuilder支持itunes协议,在HBuilder运行的电脑上,使用usb线连接i
## 连接设备
点击运行到iOS或Android设备时,会弹出选择界面,需选择要连接的手机设备或模拟器。
点击运行到iOS或Android设备时,会弹出选择界面,需选择要连接的手机设备或模拟器。
可以多设备运行,每个运行设备会在HBuilder底部控制台新开一个独立窗口,互不干扰。
可以多设备运行,每个运行设备会在HBuilder底部控制台新开一个独立窗口,互不干扰。
但一个设备同时只能运行一个项目,不同的项目运行到相同手机只有最后一个项目生效。
> 连接设备过程中如果找不到手机,可以尝试点击“刷新”按钮,如果还是无法找到手机请参考[真机运行常见问题](run-app-faq.md)
### Android设备选择
### Android设备选择
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/select-android.jpeg" style="zoom: 50%;" />
**注意事项**
- 如果电脑里安装有模拟器(Android模拟器需要先启动),HBuilder会直接检测到设备并显示在候选列表中。可以参考[如何安装模拟器](installSimulator.md)
**注意事项**
- 如果电脑里安装有模拟器(Android模拟器需要先启动),HBuilder会直接检测到设备并显示在候选列表中。可以参考[如何安装模拟器](installSimulator.md)
- 确认Android手机设置中`USB调试`模式已开启。通常在手机的【设置】【开发者选项】里,有的手机在插上数据线后在系统通知栏里也可以设置,注意不能设置为u盘模式,如果是充电模式则必须同时设置充电时`允许usb调试`
### iOS设备选择@ios_device
### iOS设备选择@ios-device
> HBuilderX中自带的标准真机运行基座使用DCloud向苹果申请的企业开发者证书签名,根据[苹果开发者企业计划许可协议](https://developer.apple.com/support/downloads/terms/apple-developer-enterprise-program/Apple-Developer-Enterprise-Program-License-Agreement-20220606-Chinese-Simplified.pdf)要求,使用企业开发者证书签名的App只允许企业员工内部使用,不允许企业外部人员安装使用。
> 因收到苹果公司警告,自2022年9月14日起iOS真机设备不再支持使用标准真机运行基座,详情见论坛公告:[https://ask.dcloud.net.cn/article/40041](https://ask.dcloud.net.cn/article/40041)
> HBuilderX中自带的标准真机运行基座使用DCloud向苹果申请的企业开发者证书签名,根据[苹果开发者企业计划许可协议](https://developer.apple.com/support/downloads/terms/apple-developer-enterprise-program/Apple-Developer-Enterprise-Program-License-Agreement-20220606-Chinese-Simplified.pdf)要求,使用企业开发者证书签名的App只允许企业员工内部使用,不允许企业外部人员安装使用。
> 因收到苹果公司警告,自2022年9月14日起iOS真机设备不再支持使用标准真机运行基座,详情见论坛公告:[https://ask.dcloud.net.cn/article/40041](https://ask.dcloud.net.cn/article/40041)
> 在iOS真机设备上运行请向苹果申请证书制作[自定义基座](#customplayground)或者在Mac电脑使用[iOS模拟器](#ios-simulator)
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/select-ios.jpeg" style="zoom: 50%;" />
**注意事项**
- 确保usb线的连接通畅(有些数据线质量不佳,需使用高电压usb端口,如果无法识别时候请尝试更换数据线)
- 如果windows电脑连接iOS设备需电脑安装iTunes软件,并确保apple的mobile device服务开启、iTunes可找到手机
- 手机连接电脑后,确保在手机上弹出的“要信任此电脑吗?”提示框中点了“信任”按钮
**注意事项**
- 确保usb线的连接通畅(有些数据线质量不佳,需使用高电压usb端口,如果无法识别时候请尝试更换数据线)
- 如果windows电脑连接iOS设备需电脑安装iTunes软件,并确保apple的mobile device服务开启、iTunes可找到手机
- 手机连接电脑后,确保在手机上弹出的“要信任此电脑吗?”提示框中点了“信任”按钮
<a id="ios_simulator"/>
<a id="ios-simulator"/>
如果是Mac电脑安装XCode后,“标准运行基座”支持使用iOS模拟器
![](https://native-res.dcloud.net.cn/images/hx/run/ios-sim.png)
如果是Mac电脑安装XCode后,“标准运行基座”支持使用iOS模拟器
![](https://native-res.dcloud.net.cn/images/hx/run/ios-sim.png)
点击后进入iOS模拟器选择界面
![](https://native-res.dcloud.net.cn/images/hx/run/ios-sim-select.png)
点击后进入iOS模拟器选择界面
![](https://native-res.dcloud.net.cn/images/hx/run/ios-sim-select.png)
上面的界面会额外显示搜索框,因XCode的iOS模拟器非常多,可通过搜索框过滤快速选择需要使用的模拟器。
上面的界面会额外显示搜索框,因XCode的iOS模拟器非常多,可通过搜索框过滤快速选择需要使用的模拟器。
## 运行
......@@ -79,12 +79,12 @@ HBuilder支持itunes协议,在HBuilder运行的电脑上,使用usb线连接i
该插件内置“标准运行基座”,这个基座使用的是DCloud的包名、证书和三方SDK配置。如果要自定义,则需要使用[自定义运行基座](#customplayground)
在运行菜单中选择要运行的手机设备或模拟器,点击运行按钮,会执行如下流程:
1. uni-app项目编译(5+ App/Wap2App项目无需编译)
2. 通过数据线给手机安装真机运行基座(需要手机屏幕高亮并在手机端点击允许)
3. 编译后的代码同步到手机设备上
4. 启动手机端的真机运行基座,加载同步到手机的代码(iPhone手机需手动点击桌面图标启动)
1. uni-app项目编译(5+ App/Wap2App项目无需编译)
2. 通过数据线给手机安装真机运行基座(需要手机屏幕高亮并在手机端点击允许)
3. 编译后的代码同步到手机设备上
4. 启动手机端的真机运行基座,加载同步到手机的代码(iPhone手机需手动点击桌面图标启动)
运行成功后,HBuilder底部的控制台显示成功日志。此后修改代码会差量同步到手机上,手机程序会动态热刷。同时console.log代码会打印到控制台上,点击打印日志可以跳转到相关代码。
运行成功后,HBuilder底部的控制台显示成功日志。此后修改代码会差量同步到手机上,手机程序会动态热刷。同时console.log代码会打印到控制台上,点击打印日志可以跳转到相关代码。
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/run-app-console.jpg" style="zoom: 50%;" />
......@@ -113,18 +113,18 @@ MacOSX,如果无法自动启动App,请排查以下原因:
- 手机处于息屏状态
- 项目编译运行失败、或安装基座失败
## 标准基座@playground
## 标准基座@playground
标准运行基座,是DCloud为方便开发者低门槛调试而提供的,此基座App使用的是DCloud的包名、证书和三方SDK配置。
在原生层不变的情况下,js等动态代码可以在运行基座上动态加载,实现热重载运行。
**HBuilderX3.7.1版本调整标准基座支持的系统版本**
- Android平台
**HBuilderX3.7.1版本调整标准基座支持的系统版本**
- Android平台
要求Android5(API Leavel 21)及以上系统,如需在Android4.4设备真机运行,请使用自定义基座。更多App支持的最低版本设置[参考文档](https://uniapp.dcloud.net.cn/tutorial/app-android-minsdkversion.html)
- iOS平台
- iOS平台
要求iOS10及以上系统,如需在iOS9.*设备真机运行,请使用自定义基座。更多App支持的最低版本设置参考manifest.json的[deploymentTarget](https://uniapp.dcloud.net.cn/collocation/manifest-app.html#ios)
## 自定义基座@customplayground
## 自定义基座@customplayground
如果要自定义原生层,则需要走一遍iOS或Android的打包流程,由XCode或Android studio编译打包生成ipa或apk安装包。
但打包后无法方便调试,不能热重载和显示控制台日志。所以HBuilder在打包时提供了一个特殊选项,打包“自定义运行基座”。
......@@ -133,18 +133,18 @@ MacOSX,如果无法自动启动App,请排查以下原因:
> 打包App的入口在HBuilder顶部发行菜单,或快捷键【Ctrl+u】
自定义运行基座可以所有配置生效(主要是manifest.json的配置),包括:
- App名称、图标、封面splash、包名、证书
自定义运行基座可以所有配置生效(主要是manifest.json的配置),包括:
- App名称、图标、封面splash、包名、证书
- App模块配置、三方sdk配置(如微信、推送、地图、语音识别等三方sdk配置)
- App权限配置
- uni原生插件
- uni原生插件
- 其他manifest.json文档提到的需打包生效的配置
打包自定义运行基座后,HBuilder会自动将生成后的apk和ipa包存放在 项目目录/unpackage/debug目录下,文件名分别为`android_debug.apk``iOS_debug.ipa`
一个项目只能生成一个自定义基座,多次生成只保留最后一次结果。
生成自定义基座后,在设备选择窗口,可以选择自定义基座,如下图所示:
生成自定义基座后,在设备选择窗口,可以选择自定义基座,如下图所示:
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/hx_select_base.jpg" style="zoom: 50%;" />
......
......@@ -4,7 +4,7 @@
HBuilderX 3.6.9+, 新增 uts插件 Android平台 真机运行支持三方 Gradle 仓储。
运行带有uts插件的项目到Android设备,如果您遇到以下提示,请配置[运行环境](#android环境配置)
运行带有uts插件的项目到Android设备,如果您遇到以下提示,请配置[运行环境](#环境配置)
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/20221111173829.jpg" style="zoom: 50%;" />
......@@ -26,7 +26,7 @@ HBuilderX 3.6.9+, 新增 uts插件 Android平台 真机运行支持三方 Grad
1. 点击图标1的下载地址进入下载页面。如图所示,点击红圈部分下载工具包。
![image](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/gradle.png)
2. 将步骤1下载的内容解压后,找到bin目录下的执行脚本,填入图标3处。
**注意** mac为`%解压路径%/bin/gradle`;window为`%解压路径%\bin\gradle.bat`
......@@ -48,7 +48,7 @@ HBuilderX 3.6.9+, 新增 uts插件 Android平台 真机运行支持三方 Grad
1. 如图所示,根据平台下载Command line tools only。
![image](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/sdk.png)
2. 下载解压后通过`%解压目录%/bin/sdkmanager脚本安装build-tools和platforms
```
sdkmanager --sdk_root=%sdk路径% --install "build-tools;30.0.0"
......
......@@ -4,7 +4,7 @@
uni-app 有 vue 页面、nvue 页面、uvue页面。
- vue 页面是 webview 渲染的
- app-nvue 页面是原生渲染的,其样式比 web 会限制更多,另见[nvue的css](/tutorial/nvue-css)
- app-uvue 页面是原生渲染的,是 web 的css子集,另见[uvue的css](../uni-app-x/css/readme.md)
- app-uvue 页面是原生渲染的,是 web 的css子集,另见[uvue的css](https://doc.dcloud.net.cn/uni-app-x/css/)
uni-app 的 css 与 web 的 css 基本一致。本文没有讲解 css 的用法。在你了解 web 的 css 的基础之上,本文讲述一些样式相关的注意事项。
......@@ -127,7 +127,7 @@ rpx 是相对于基准宽度的单位,可以根据屏幕宽度进行自适应
- `page` 相当于 `body` 节点,例如:
```css
<!-- 设置页面背景颜色使用 scoped 会导致失效 -- >
<!-- 设置页面背景颜色使用 scoped 会导致失效 -- >
page {
background-color: #ccc;
}
......
......@@ -54,18 +54,18 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 以前一个 `html` 大节点,里面有 `script``style` 节点;
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
</html>
```
......@@ -73,16 +73,16 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 现在 `template` 是一级节点,用于写tag组件, `script``style` 是并列的一级节点,也就是有3个一级节点。这个叫[vue单文件组件规范sfc](https://cn.vuejs.org/v2/guide/single-file-components.html)
```html
<template>
<view>
注意必须有一个view,且只能有一个根view。所有内容写在这个view下面。
</view>
</template>
<script>
export default {
}
</script>
<style>
<template>
<view>
注意必须有一个view,且只能有一个根view。所有内容写在这个view下面。
</view>
</template>
<script>
export default {
}
</script>
<style>
</style>
```
......@@ -92,7 +92,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 以前通过script src、link href引入外部的js和css;
```html
<script src="js/jquery-1.10.2.js" type="text/javascript"></script>
<script src="js/jquery-1.10.2.js" type="text/javascript"></script>
<link href="css/bootstrap.css" rel="stylesheet" type="text/css"/>
```
......@@ -104,20 +104,20 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
```html
<script>
var util = require('../../../common/util.js'); //require这个js模块
var formatedPlayTime = util.formatTime(playTime); //调用js模块的方法
<script>
var util = require('../../../common/util.js'); //require这个js模块
var formatedPlayTime = util.formatTime(playTime); //调用js模块的方法
</script>
```
而在这个 `util.js` 里,要把之前的 `function` 封装为对象的方法
```js
function formatTime(time) {
return time;//这里没写逻辑
}
module.exports = {
formatTime: formatTime
function formatTime(time) {
return time;//这里没写逻辑
}
module.exports = {
formatTime: formatTime
}
```
......@@ -125,26 +125,26 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
当然还有一些高级的用法
```js
// 直接使用js模块的属性。在hello uni-app有示例
var dateUtils = require('../../../common/util.js').dateUtils;
// 将js导入并重命名为echarts,然后使用echarts.来继续执行方法。在hello uni-app有示例
import * as echarts from '/components/echarts/echarts.simple.min.js';
// 直接使用js模块的属性。在hello uni-app有示例
var dateUtils = require('../../../common/util.js').dateUtils;
// 将js导入并重命名为echarts,然后使用echarts.来继续执行方法。在hello uni-app有示例
import * as echarts from '/components/echarts/echarts.simple.min.js';
```
**css外部文件导入**。全局样式,在根目录下的 `app.vue` 里写入,每个页面都会加载 `app.vue` 里的样式。
```html
<style>
@import "./common/uni.css";
.uni-hello-text{
color:#7A7E83;
}
<style>
@import "./common/uni.css";
.uni-hello-text{
color:#7A7E83;
}
</style>
```
**另外,vue支持组件导入,可以更方便的封装一个包括界面、js、样式的库**[详见](/vue-components.md)
**另外,vue支持组件导入,可以更方便的封装一个包括界面、js、样式的库**[详见](./vue-components.md)
### 组件/标签的变化
......@@ -164,22 +164,22 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 以前的 DOM 操作,如果你想改变某个 DOM 元素的显示内容,比如一个view的显示文字:给view设id,然后js里通过选择器获取 DOM 元素,进一步通过js进行赋值操作,修改 DOM 元素的属性或值。
```html
<html>
<head>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded",function () {
document.getElementById("spana").innerText="456"
})
function changetextvalue () {
document.getElementById("spana").innerText="789"
}
</script>
</head>
<body>
<span id="spana">123</span>
<button type="button" onclick="changetextvalue()">修改为789</button>
</body>
</html>
<html>
<head>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded",function () {
document.getElementById("spana").innerText="456"
})
function changetextvalue () {
document.getElementById("spana").innerText="789"
}
</script>
</head>
<body>
<span id="spana">123</span>
<button type="button" onclick="changetextvalue()">修改为789</button>
</body>
</html>
```
......@@ -189,29 +189,29 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
```html
<template>
<view>
<text>{{textvalue}}</text><!-- 这里演示了组件值的绑定 -->
<button :type="buttontype" @click="changetextvalue()">修改为789</button><!-- 这里演示了属性和事件的绑定 -->
</view>
</template>
<script>
export default {
data() {
return {
textvalue:"123",
buttontype:"primary"
};
},
onLoad() {
this.textvalue="456"//这里修改textvalue的值,其实123都来不及显示就变成了456
},
methods: {
changetextvalue() {
this.textvalue="789"//这里修改textvalue的值,页面自动刷新为789
}
}
}
<template>
<view>
<text>{{textvalue}}</text><!-- 这里演示了组件值的绑定 -->
<button :type="buttontype" @click="changetextvalue()">修改为789</button><!-- 这里演示了属性和事件的绑定 -->
</view>
</template>
<script>
export default {
data() {
return {
textvalue:"123",
buttontype:"primary"
};
},
onLoad() {
this.textvalue="456"//这里修改textvalue的值,其实123都来不及显示就变成了456
},
methods: {
changetextvalue() {
this.textvalue="789"//这里修改textvalue的值,页面自动刷新为789
}
}
}
</script>
```
......@@ -224,7 +224,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
相比Web平台, Vue.js 在 `uni-app` 中使用差异主要集中在两个方面:
- 新增:`uni-app` 除了支持 Vue 实例的组件生命周期,还拥有[应用生命周期](/collocation/App.md#applifecycle)[页面的生命周期](/tutorial/page.md#lifecycle)
- 受限:相比 Web 平台,在小程序和 App 端部分功能支持不完善,具体见[兼容性列表](/vue3-api)
- 受限:相比 Web 平台,在小程序和 App 端部分功能支持不完善,具体见[兼容性列表](./vue3-api)
......@@ -367,7 +367,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
> - `Set`
> - `JSON`
> - `Intl`
>
>
> 你不应该在模板表达式中试图访问用户定义的全局变量。
......@@ -398,10 +398,10 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
<image v-bind:src="imgUrl"></image>
<!-- 缩写 -->
<image :src="imgUrl"></image>
<!-- prop 绑定。“prop”必须在 my-component 中声明。-->
<my-component :prop="someThing"></my-component>
<button v-bind:disabled="isButtonDisabled">Button</button>
```
......@@ -416,7 +416,7 @@ v-on 指令,它用于监听 DOM 事件。v-on缩写为‘ @ ’,下文简称
```html
<!-- 完整语法 -->
<view v-on:click="doSomething">点击</view>
<view v-on:click="doSomething">点击</view>
<!-- 缩写 -->
<view @click="doSomething">点击</view>
```
......@@ -1351,7 +1351,7 @@ v-for 指令可以实现基于一个数组来渲染一个列表。
每一个计算属性都包含一个 `getter` 和一个 `setter` ,默认是利用 `getter` 来读取。所有 `getter``setter``this` 上下文自动地绑定为 Vue 实例。
#### 计算属性的 getter
#### 计算属性的 getter
在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作。在模板中放入太多的逻辑会让模板过重且难以维护。例如:
......@@ -1549,8 +1549,11 @@ Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据
### 侦听器watch
- 类型:{ [key: string]: string%20%7C%20Function%20%7C%20Object%20%7C%20Array%20%7D
- 类型
```ts
interface Watch { [key: string]: string | Function | Object | Array }
```
- 一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 `$watch()` ,遍历 `watch` 对象的每一个 `property`
......
......@@ -2,7 +2,7 @@
> 已经了解 Vue2,只想了解 Vue3 新功能可以参阅[vue3新功能](https://v3.cn.vuejs.org/guide/migration/introduction.html#%E6%A6%82%E8%A7%88)!
>
>
> 已经有 Vue2 项目,需要适配 Vue3 的可参阅[vue2 项目迁移 vue3](https://uniapp.dcloud.io/tutorial/migration-to-vue3)!
......@@ -57,18 +57,18 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 以前一个 `html` 大节点,里面有 `script``style` 节点;
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
</html>
```
......@@ -76,16 +76,16 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 现在 `template` 是一级节点,用于写tag组件, `script``style` 是并列的一级节点,也就是有3个一级节点。这个叫[vue单文件组件规范sfc](vue3-components.md)
```html
<template>
<view>
注意必须有一个view,且只能有一个根view。所有内容写在这个view下面。
</view>
</template>
<script>
export default {
}
</script>
<style>
<template>
<view>
注意必须有一个view,且只能有一个根view。所有内容写在这个view下面。
</view>
</template>
<script>
export default {
}
</script>
<style>
</style>
```
......@@ -95,7 +95,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 以前通过script src、link href引入外部的js和css;
```html
<script src="js/jquery-1.10.2.js" type="text/javascript"></script>
<script src="js/jquery-1.10.2.js" type="text/javascript"></script>
<link href="css/bootstrap.css" rel="stylesheet" type="text/css"/>
```
......@@ -108,20 +108,20 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
```html
<script>
var util = require('../../../common/util.js'); //require这个js模块
var formatedPlayTime = util.formatTime(playTime); //调用js模块的方法
<script>
var util = require('../../../common/util.js'); //require这个js模块
var formatedPlayTime = util.formatTime(playTime); //调用js模块的方法
</script>
```
而在这个 `util.js` 里,要把之前的 `function` 封装为模块(module)的方法并导出(exports)。只有被导出的方法和属性才能被外部调用,不导出的属于模块内部函数和变量。这是es6的模块规范。
```js
function formatTime(time) {
return time;//这里没写逻辑
}
module.exports = {
formatTime: formatTime
function formatTime(time) {
return time;//这里没写逻辑
}
module.exports = {
formatTime: formatTime
}
```
......@@ -129,21 +129,21 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
当然还有一些高级的用法,比如在导出时可以重命名
```js
// 直接使用js模块的属性。在hello uni-app有示例
var dateUtils = require('../../../common/util.js').dateUtils;
// 直接使用js模块的属性。在hello uni-app有示例
var dateUtils = require('../../../common/util.js').dateUtils;
// 将js导入并重命名为echarts,然后使用echarts.来继续执行方法。在hello uni-app有示例
import * as echarts from '/components/echarts/echarts.simple.min.js';
import * as echarts from '/components/echarts/echarts.simple.min.js';
```
**css外部文件导入**。全局样式,在根目录下的 `app.vue` 里写入,每个页面都会加载 `app.vue` 里的样式。
```html
<style>
@import "./common/uni.css";
.uni-hello-text{
color:#7A7E83;
}
<style>
@import "./common/uni.css";
.uni-hello-text{
color:#7A7E83;
}
</style>
```
......@@ -166,12 +166,12 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 以前script里随便写js变量和function
```html
<script type="text/javascript">
var a;
function funa () {
<script type="text/javascript">
var a;
function funa () {
}
</script>
</script>
```
- 现在script里默认有export default,在里面写data、事件和method
......@@ -183,33 +183,33 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
* 模板里要调用的方法,都需要写在`methods`下面。每个方法也需要用逗号分隔。不需要再使用`function`声明,只要写在`methods`下的函数,都可以在template里调用。同样,HBuilderX里敲`vmethods`代码块,也可以生成相应结构。
```html
<template>
<view>
<template>
<view>
<text>{{textvalue}}</text><!-- 这里演示了组件值的绑定 -->
<button :type="buttontype" @click="changetextvalue()">修改为789</button><!-- 这里演示了属性和事件的绑定 -->
</view>
</template>
</view>
</template>
<script>
var globalvar = 1
function globalfun(){}
export default {
data() {
return {
textvalue:"123",
buttontype:"primary"
};
},
onLoad() {
export default {
data() {
return {
textvalue:"123",
buttontype:"primary"
};
},
onLoad() {
globalvar = 2
globalfun()
this.textvalue="456"//这里修改textvalue的值
},
methods: {
changetextvalue() {
},
methods: {
changetextvalue() {
this.textvalue="789"//这里修改textvalue的值
}
}
}
}
}
}
</script>
```
......@@ -218,22 +218,22 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
- 以前的 DOM 操作,如果你想改变某个 DOM 元素的显示内容,比如一个view的显示文字:给view设id,然后js里通过选择器获取 DOM 元素,进一步通过js进行赋值操作,修改 DOM 元素的属性或值。
```html
<html>
<head>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded",function () {
document.getElementById("spana").innerText="456"
})
function changetextvalue () {
document.getElementById("spana").innerText="789"
}
</script>
</head>
<body>
<span id="spana">123</span>
<button type="button" onclick="changetextvalue()">修改为789</button>
</body>
</html>
<html>
<head>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded",function () {
document.getElementById("spana").innerText="456"
})
function changetextvalue () {
document.getElementById("spana").innerText="789"
}
</script>
</head>
<body>
<span id="spana">123</span>
<button type="button" onclick="changetextvalue()">修改为789</button>
</body>
</html>
```
......@@ -243,29 +243,29 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
```html
<template>
<view>
<text>{{textvalue}}</text><!-- 这里演示了组件值的绑定 -->
<button :type="buttontype" @click="changetextvalue()">修改为789</button><!-- 这里演示了属性和事件的绑定 -->
</view>
</template>
<script>
export default {
data() {
return {
textvalue:"123",
buttontype:"primary"
};
},
onLoad() {
this.textvalue="456"//这里修改textvalue的值,其实123都来不及显示就变成了456
},
methods: {
changetextvalue() {
this.textvalue="789"//这里修改textvalue的值,页面自动刷新为789
}
}
}
<template>
<view>
<text>{{textvalue}}</text><!-- 这里演示了组件值的绑定 -->
<button :type="buttontype" @click="changetextvalue()">修改为789</button><!-- 这里演示了属性和事件的绑定 -->
</view>
</template>
<script>
export default {
data() {
return {
textvalue:"123",
buttontype:"primary"
};
},
onLoad() {
this.textvalue="456"//这里修改textvalue的值,其实123都来不及显示就变成了456
},
methods: {
changetextvalue() {
this.textvalue="789"//这里修改textvalue的值,页面自动刷新为789
}
}
}
</script>
```
......@@ -280,7 +280,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
相比Web平台, Vue.js 在 `uni-app` 中使用差异主要集中在两个方面:
- 新增:`uni-app` 除了支持 Vue 实例的组件生命周期,还拥有[应用生命周期](/collocation/App.md#applifecycle)[页面的生命周期](/tutorial/page.md#lifecycle)
- 受限:相比 Web 平台,在小程序和 App 端部分功能支持不完善,具体见[兼容性列表](/vue3-api)
- 受限:相比 Web 平台,在小程序和 App 端部分功能支持不完善,具体见[兼容性列表](./vue3-api)
[uni-app 项目支持 vue 3.0介绍,及升级指南](https://ask.dcloud.net.cn/article/37834)
......@@ -442,7 +442,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
> - `JSON`
> - `Intl`
> - `BigInt`
>
>
> 你不应该在模板表达式中试图访问用户定义的全局变量。
......@@ -465,7 +465,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
<image v-bind:src="imgUrl"></image>
<!-- 缩写 -->
<image :src="imgUrl"></image>
<button v-bind:disabled="isButtonDisabled">Button</button>
```
......@@ -480,7 +480,7 @@ v-on 指令,它用于监听 `DOM` 事件。v-on缩写为‘ @ ’,下文简
```html
<!-- 完整语法 -->
<view v-on:click="doSomething">点击</view>
<view v-on:click="doSomething">点击</view>
<!-- 缩写 -->
<view @click="doSomething">点击</view>
```
......@@ -1060,7 +1060,7 @@ v-for 指令可以实现基于一个数组来渲染一个列表。
- 有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。
> 不要使用对象或数组之类的非基本类型值作为 v-for 的 key。请用字符串或数值类型的值。
>
>
> 如不提供 :key,会报一个 `warning`, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。
示例:
......@@ -1522,7 +1522,7 @@ v-for 指令可以实现基于一个数组来渲染一个列表。
每一个计算属性都包含一个 `getter` 函数和一个 `setter`函数 ,默认是利用 `getter` 函数来读取。所有 `getter``setter` 函数的 `this` 上下文自动地绑定为 Vue 实例。
#### 计算属性的 getter
#### 计算属性的 getter
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如,有一个嵌套数组对象:
......
......@@ -199,7 +199,7 @@ uni-push产品有2个入口:
以上两种方案各有优劣,方案一更加灵活;比如:客服功能,客户端接收到聊天消息时,应用如果已经打开聊天对话页面,就直接将监听到的推送内容,渲染到页面。如果应用未打开聊天页,则调用api创建“通知栏消息”提醒用户;此时你还可以执行一些其他逻辑,比如将tabBar的消息中心加红点等。方案二比较简便,客户端无需额外编写代码,自动创建通知栏消息;但仅适用于不关心客户端行为就创建“通知栏消息”的场景,如广告营销内容的推送等。
#### 客户端类型@getuiPhoneType
#### 客户端类型@getuiPhoneType
个推的客户端类型是仅根据使用的sdk类型来判断的,分为两类:
1. native sdk(在`manifest.json`->`APP 模块配置`->`uniPush 2.0`配置界面勾选离线推送时启用的 sdk),获取到的 cid 的 phoneType 为 APP 类型。
2. jssdk(`manifest.json`->`APP 模块配置`->`uniPush 2.0`配置界面,仅勾选在线推送,未勾选离线推送时启用的 sdk),获取到的 cid 的 phoneType 均为小程序,而不管实际上你的客户端是 APP、小程序还是 web。
......@@ -349,10 +349,10 @@ exports.main = async (event, context) => {
如果项目使用[uni-id-pages](https://ext.dcloud.net.cn/plugin?id=8577)[uni-id-pages-x](https://ext.dcloud.net.cn/plugin?name=uni-id-pages-x),即可直接指定基于uni-id的user_id、user_tag,并可筛选设备的平台、登录信息是否有效等,执行推送消息。
uni-id-pages/uni-id-pages-x 已经内置了:在登录账号、退出账号、切换账号、token续期、注销账号5个时机,管理uni-id-device表、opendb-device表与user_id、push_clientid、platform、os_name等字段的映射关系。[详情参考](./uniCloud/uni-cloud-push/mate.md)
uni-id-pages/uni-id-pages-x 已经内置了:在登录账号、退出账号、切换账号、token续期、注销账号5个时机,管理uni-id-device表、opendb-device表与user_id、push_clientid、platform、os_name等字段的映射关系。[详情参考](https://doc.dcloud.net.cn/uniCloud/uni-cloud-push/mate.html)
::: warning 注意
以上内置逻辑,在uni-id-pages下,会自动判断是否启用push模块自动执行;但uni-id-pages-x下,需手动在:`/uni_modules/uni-id-pages-x/init.uts`导入 autoReportPushClientId 模块。
::: warning 注意
以上内置逻辑,在uni-id-pages下,会自动判断是否启用push模块自动执行;但uni-id-pages-x下,需手动在:`/uni_modules/uni-id-pages-x/init.uts`导入 autoReportPushClientId 模块。
:::
此外uni-push2.0 还提供了uni-admin中的web控制台[uni-push-admin](https://ext.dcloud.net.cn/plugin?name=uni-push-admin)。包含消息推送、推送统计等功能,而且是开源的,可自定义。如图:
......
* [Git/SVN](/worktile/git-svn.md)
* [cli 脚手架](/worktile/CLI.md)
* [编译运行环境](/worktile/running-env.md)
* [自动化测试](/worktile/auto/quick-start.md)
* [快速开始](/worktile/auto/quick-start.md)
* [API](/worktile/auto/api.md)
* [HBuilderX自动化测试插件](/worktile/auto/hbuilderx-extension/index.md)
* [CLI项目自动化测试](/worktile/auto/uniapp-cli-project.md)
* [持续集成](/worktile/CI.md)
\ No newline at end of file
* [Git/SVN](git-svn.md)
* [cli 脚手架](CLI.md)
* [编译运行环境](running-env.md)
* [自动化测试](auto/quick-start.md)
* [快速开始](auto/quick-start.md)
* [API](auto/api.md)
* [HBuilderX自动化测试插件](auto/hbuilderx-extension/index.md)
* [CLI项目自动化测试](auto/uniapp-cli-project.md)
* [持续集成](CI.md)
\ No newline at end of file
......@@ -16,7 +16,7 @@
1. 本插件支持`uni-app普通项目``uniapp-cli项目`。uniapp-cli项目,运行自动化测试,需要在当前项目下安装自动化测试依赖。
2. Windows电脑不支持运行测试到`ios手机`
3. MacOSX电脑,仅支持运行测试到`iOS模拟器`,不支持ios真机,测试iOS模拟器,需要电脑装安装XCode。
4. 运行测试到H5,仅支持`chrome`浏览器,不支持其它浏览器。
4. 运行测试到H5,仅支持`chrome`浏览器,不支持其它浏览器。
5. 运行测试到Android手机,如果HBuilderX仅检测到一个android设备,`直接`运行测试到当前已连接设备。`多个`设备时,会弹窗要求选择手机。
6. node: 当本机未安装node时,将使用HBuilderX`内置node`运行测试。反之,本机安装了node,则使用本机的node。
7. 运行测试到微信小程序,必须在manifest.json内,配置微信小程序 appid。如果微信开发者工具无法成功打开项目,首次请手动打开。
......@@ -33,7 +33,7 @@
## 测试环境安装@env
**插件依赖:**
**插件依赖:**
- H5、微信、ios、android自动化测试依赖`puppeteer``adbkit``node-simctl``jest``playwright`,运行插件时,如果未安装此依赖,将会弹窗自动安装。
- `注意`:本插件0.0.3版本及以下,node: 当本机未安装node时,将使用HBuilderX内置的node运行测试。反之,本机安装了node,则使用本机的node。
......@@ -50,7 +50,7 @@ uni-app普通项目,`初始化测试环境`或`运行测试`时,如果未安
如下图所示,项目管理器,选中项目,右键菜单【初始化测试环境】
注意:安装环境依赖时,如果检测到项目下不存在测试配置文件[env.js](/docs/file/env)[jest.config.js](../../auto/quick-start?id=jestconfigjs),则会自动创建测试配置文件。
注意:安装环境依赖时,如果检测到项目下不存在测试配置文件 `env.js` [jest.config.js](../../auto/quick-start?id=jestconfigjs),则会自动创建测试配置文件。
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/env_install.gif" style="zoom: 70%;border: 1px solid #eee; border-radius: 10px;"/>
......@@ -92,7 +92,7 @@ uni-app项目,pages页面,右键菜单,创建测试用例
### 选择设备@select-devices
> 如果无法获取到设备信息,请[参考](tutorial/run/run-app-faq.md)
> 如果无法获取到设备信息,请[参考](/tutorial/run/run-app-faq.md)
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app-test-select-device.jpg" style="zoom: 45%;border: 1px solid #eee;border-radius: 5px;"/>
......
# uni-app自动化测试@about
uni-app提供了一批[API](/collocation/auto/api),这些API可以操控uni-app应用,包括运行、跳转页面、触发点击等,并可以获取页面元素状态、进行截图,从而实现对uni-app项目进行自动化测试的目的。
uni-app提供了一批[API](./api.md),这些API可以操控uni-app应用,包括运行、跳转页面、触发点击等,并可以获取页面元素状态、进行截图,从而实现对uni-app项目进行自动化测试的目的。
本功能使用到了业内常见的测试库如jest(MIT协议)。
推荐使用方式:研发提交源码到版本库后,持续集成系统自动拉取源码,自动运行自动化测试。
### 特性@features
开发者可以利用[API](/collocation/auto/api)做以下事情:
开发者可以利用[API](./api.md)做以下事情:
* 控制跳转到指定页面
* 获取页面数据
......@@ -23,7 +23,7 @@ uni-app提供了一批[API](/collocation/auto/api),这些API可以操控uni-ap
### CLI
如果您想在`终端命令行`进行自动化测试、或使用持续集成进行测试,请使用uni-app [CLI](https://uniapp.dcloud.net.cn/quickstart?id=_2-通过vue-cli命令行) 工程,[CLI项目自动化测试教程](/collocation/auto/uniapp-cli-project)
如果您想在`终端命令行`进行自动化测试、或使用持续集成进行测试,请使用uni-app [CLI](https://uniapp.dcloud.net.cn/quickstart?id=_2-通过vue-cli命令行) 工程,[CLI项目自动化测试教程](uniapp-cli-project.md)
### 测试插件@descriptions
......
......@@ -55,14 +55,14 @@ npm install puppeteer@14.0.0 --save-dev
2. 根据API编写测试的js代码,参考测试用例
API文档见:[https://uniapp.dcloud.io/collocation/auto/api](https://uniapp.dcloud.io/collocation/auto/api)
测试文件目录配置见 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
测试文件目录配置见 [jest.config.js](./quick-start.md#jestconfigjs)
3. 运行测试
1. 运行测试
```shell
npm run test:h5
```
4. 测试结果
1. 测试结果
```js
>> cross-env UNI_PLATFORM=h5 jest -i
...
......@@ -72,14 +72,14 @@ Snapshots: 0 total
Time: 14.995s, estimated 16s
```
更多配置参考 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
更多配置参考 [jest.config.js](./quick-start.md#jestconfigjs)
### App-Android测试流程
1. 配置全局 `adb` 环境变量
2. 配置 `Hbuilder` 调试基座/自定义基座 `android_base.apk` 目录,参考 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
2. 配置 `Hbuilder` 调试基座/自定义基座 `android_base.apk` 目录,参考 [jest.config.js](./quick-start.md#jestconfigjs)
3. 创建 `cli` 工程/现有 `cli` 工程
切换到工程目录,安装依赖包 `adbkit`
......@@ -104,9 +104,9 @@ npm run test:android
npm install node-simctl --save-dev
```
2. 配置模拟器id,参考 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
2. 配置模拟器id,参考 [jest.config.js](./quick-start.md#jestconfigjs)
3. 配置 `Hbuilder` 调试基座/自定义基座 `Pandora_simulator.app` 目录,参考 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
3. 配置 `Hbuilder` 调试基座/自定义基座 `Pandora_simulator.app` 目录,参考 [jest.config.js](./quick-start.md#jestconfigjs)
4. 编写测试代码,参考测试用例
......
......@@ -41,7 +41,7 @@ if (process.env.NODE_ENV === 'production') {
平台判断有 2 种场景,一种是在编译期判断,一种是在运行期判断。
- 编译期判断
编译期判断,即条件编译,不同平台在编译出包后已经是不同的代码。详见:[条件编译](/platform)
编译期判断,即条件编译,不同平台在编译出包后已经是不同的代码。详见:[条件编译](/tutorial/platform.md)
```javascript
// #ifdef H5
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册