更新记录
1.1(2019-07-20) 下载此版本
- 补充Android动态权限判断
- 补充打开App权限设置界面
- 补充检查手机设备定位服务是否开启
1.0(2019-07-18) 下载此版本
1.0 包括iOS的App权限判断和Android的系统状态判断
平台兼容性
Native.js是纯前端js代码,不需要打包自定义基座。Native.js的详细介绍见Native.js入门
利用Native.js可获取当前App的授权状态,可打开App的授权设置界面。
本js插件已经封装为模块,并提供了一个示例应用。
使用步骤
- 下载本插件并存放到项目目录下,比如js_sdk/wa-permission/permission.js
- 在页面中引入这个js模块
import permision from "@/js_sdk/wa-permission/permission.js"
- 调用模块的方法
permision.judgeIosPermission("location") //判断iOS上是否给予位置权限,有权限返回true,否则返回false
API
该模块的方法如下:
方法1:Bool permision.judgeIosPermission(String permissionID)
获取iOS设备上当前App是否有某项权限
参数说明
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
permissionID | String | 是 | iOS权限名称,值域清单如下表 |
permissionID 值域清单
参数名 | 说明 |
---|---|
location | 位置 |
push | 推送(限iOS,注意Android上推送并不是一个权限) |
camera | 摄像头 |
photoLibrary | 相册 |
record | 麦克风 |
contact | 通讯录 |
calendar | 日历 |
memo | 备忘录 |
示例
permision.judgeIosPermission("location") //判断iOS上是否给予位置权限,有权限返回true,否则返回false
方法2:await Number permision.requestAndroidPermission(String permisionID)
获取Android设备上当前App是否有某项权限
注意:Android是动态权限,请求权限状态时会触发弹框询问是否赋权(如果已经同意或永久禁止则不会询问),所以必须使用异步方式来处理
参数说明
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
permissionID | String | 是 | Android权限名称,值域清单如下表 |
permissionID 值域清单
参数名 | 说明 |
---|---|
android.permission.ACCESS_FINE_LOCATION | 位置权限 |
android.permission.ACCESS_COARSE_LOCATION | 模糊位置权限(蓝牙\ble依赖) |
android.permission.CAMERA | 摄像头权限 |
android.permission.READ_EXTERNAL_STORAGE | 外部存储(含相册)读取权限 |
android.permission.WRITE_EXTERNAL_STORAGE | 外部存储(含相册)写入权限 |
android.permission.RECORD_AUDIO | 麦克风权限 |
android.permission.READ_CONTACTS | 通讯录读取权限 |
android.permission.WRITE_CONTACTS | 通讯录写入权限 |
android.permission.READ_CALENDAR | 日历读取权限 |
android.permission.WRITE_CALENDAR | 日历写入权限 |
android.permission.READ_SMS | 短信读取权限 |
android.permission.SEND_SMS | 短信发送权限 |
android.permission.RECEIVE_SMS | 接收新短信权限 |
android.permission.READ_PHONE_STATE | 获取手机识别码等信息的权限 |
android.permission.CALL_PHONE | 拨打电话权限 |
android.permission.READ_CALL_LOG | 获取通话记录权限 |
这里支持Android所有android.permission的值,更多值可参考Android开发文档
返回值值域说明
permision.requestAndroidPermission(permisionID)
返回值为数字,包括-1、0、1这3个数字。
返回值 | 说明 |
---|---|
1 | 已获取授权 |
0 | 未获取授权 |
-1 | 被永久拒绝授权 |
示例
// vue的method里编写如下代码
async requestAndroidPermission(permisionID) {
var result = await permision.requestAndroidPermission(permisionID)
var strStatus
if (result == 1) {
strStatus = "已获得授权"
} else if (result == 0) {
strStatus = "未获得授权"
} else {
strStatus = "被永久拒绝权限"
}
uni.showModal({
content: permisionID + strStatus,
showCancel: false
});
},
方法3: void permision.gotoAppPermissionSetting()
打开当前App的权限设置界面。可用于引导用户赋权
内部已封装,不区分iOS和Android
示例代码
permision.gotoAppPermissionSetting()
iOS上如果没有调用过的权限,不会出现在权限设置界面。
Android碎片化严重,直接打开了App的设置界面。
方法4:Bool permision.checkSystemEnableLocation()
获取当前手机是否开启或关闭了定位服务
内部已封装,不区分iOS和Android
返回值 | 说明 |
---|---|
true | 开启 |
false | 关闭 |
示例
permision.checkSystemEnableLocation() //返回true或false
扩展阅读
Native.js是用js调用原生API的一种写法,示例如下:
判断定位权限是否开启以及手机自身的位置服务是否被关闭
var cllocationManger = plus.ios.import("CLLocationManager");
var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
console.log("enable:" + enable);
console.log("status:" + status);
if (enable && status != 2) {
console.log("手机系统的定位已经打开且App已经获得定位权限");
} else {
console.log("手机系统的定位没有打开或App没有获得定位权限");
}
plus.ios.deleteObject(cllocationManger);
了解更多,可下载插件后看模块源码
FAQ
关于onShow调用问题
调用系统 api 就会触发OnShow,导致多次调用引起闪退。可以加个锁的概念,防止被重复调用。具体参考:https://ext.dcloud.net.cn/plugin?id=5605
plus is not defined
本插件是app专用插件,plus是app专用的全局对象,适用于5+App和uni-app的App端。运行在非app端时,比如web、小程序,就会提示plus is not defined