uni-app iOS平台:用Native.js来写 如何判断系统功能权限是否开启
uni-app iOS平台:用Native.js来写 如何判断系统功能权限是否开启
更新:插件市场已经提供了封装更完善版本:https://ext.dcloud.net.cn/plugin?id=594
1、推送
判断推送权限是否开启
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
var enabledTypes = 0;
if (app.currentUserNotificationSettings) {
var settings = app.currentUserNotificationSettings();
enabledTypes = settings.plusGetAttribute("types");
console.log("enabledTypes1:" + enabledTypes);
if (enabledTypes == 0) {
console.log("推送权限没有开启");
}else {
console.log("已经开启推送功能!")
}
plus.ios.deleteObject(settings);
} else {
enabledTypes = app.enabledRemoteNotificationTypes();
if (enabledTypes == 0) {
console.log("推送权限没有开启!");
} else {
console.log("已经开启推送功能!")
}
console.log("enabledTypes2:" + enabledTypes);
}
plus.ios.deleteObject(app);
plus.ios.deleteObject(UIApplication);
2、定位
判断定位权限是否开启
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("手机系统的定位已经打开");
} else {
console.log("手机系统的定位没有打开");
}
plus.ios.deleteObject(cllocationManger);
3、麦克风
判断麦克风权限是否开启
var avaudiosession = plus.ios.import("AVAudioSession");
var avaudio = avaudiosession.sharedInstance();
var permissionStatus = avaudio.recordPermission();
console.log("permissionStatus:" + permissionStatus);
if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
console.log("麦克风权限没有开启");
} else {
console.log("麦克风权限已经开启");
}
plus.ios.deleteObject(avaudiosession);
4、相机
判断相机权限是否开启
var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
console.log("authStatus:" + authStatus);
if (authStatus == 3) {
console.log("相机权限已经开启");
} else {
console.log("相机权限没有开启");
}
plus.ios.deleteObject(AVCaptureDevice);
5、相册
判断相册权限是否开启
var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
var authStatus = PHPhotoLibrary.authorizationStatus();
console.log("authStatus:" + authStatus);
if (authStatus == 3) {
console.log("相册权限已经开启");
} else {
console.log("相册权限没有开启");
}
plus.ios.deleteObject(PHPhotoLibrary);
6、通讯录
判断通讯录权限是否开启
var CNContactStore = plus.ios.import("CNContactStore");
var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
if (cnAuthStatus == 3) {
console.log("通讯录权限已经开启");
} else {
console.log("通讯录权限没有开启");
}
plus.ios.deleteObject(CNContactStore);
7、日历
判断日历权限是否开启
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
if (ekAuthStatus == 3) {
console.log("日历权限已经开启");
} else {
console.log("日历权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
8、备忘录
判断备忘录权限是否开启
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
if (ekAuthStatus == 3) {
console.log("备忘录权限已经开启");
} else {
console.log("备忘录权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
9、网络
判断网络是否开启
var cellularData = plus.ios.newObject("CTCellularData");
var state = cellularData.plusGetAttribute("restrictedState");
if (state == 2) {
console.log("已经开启了互联网权限:NotRestricted");
} else if (state == 0) {
console.log("StateUnknown");
} else if (state == 1) {
console.log("Restricted");
}
plus.ios.deleteObject(cellularData);
9、蓝牙
判断蓝牙是否开启
判断蓝牙权限是否开启无法用native.js来写,可以用蓝牙模块的API, getBluetoothAdapterState(获取本机蓝牙适配器状态),onBluetoothAdapterStateChange(监听蓝牙适配器状态变化事件)来判断。
提示用户开启权限
plus.nativeUI.confirm("XX权限没有开启,是否去开启?", function(e) {
if (e.index == 0) {
var UIApplication = plus.ios.import("UIApplication");
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.import("NSURL");
var setting2 = NSURL2.URLWithString("app-settings:");
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
}
}, {
"buttons": ["Yes", "No"],
"verticalAlign": "center"
});
1 回复
在uni-app的iOS平台上,使用Native.js来判断系统功能权限(如相机、位置服务等)是否开启,可以通过调用iOS的原生模块来实现。下面是一个示例代码,展示了如何使用Native.js来判断相机权限是否开启。
首先,确保你已经在manifest.json
文件中配置了使用Native.js的权限。
{
"mp-weixin": { /* 其他配置 */ },
"app-plus": {
"distribute": {
/* 其他配置 */
},
"usingComponents": true,
"nativePlugins": true // 确保启用了Native.js
}
}
然后,在页面的JavaScript文件中,你可以使用以下代码来判断相机权限:
// 引入Native.js模块
const native = uni.requireNativePlugin('native');
function checkCameraPermission() {
return new Promise((resolve, reject) => {
// 调用原生方法检查相机权限
native.exec('AVFoundation', 'authorizationStatusForMediaType', [uni.getSystemInfoSync().platform === 'ios' ? 'kUTTypeImage' : ''], (res) => {
// 解析返回的状态码
const status = res.message[0];
let permissionGranted = false;
switch (status) {
case 0: // AVAuthorizationStatusNotDetermined
permissionGranted = false;
break;
case 1: // AVAuthorizationStatusRestricted
case 2: // AVAuthorizationStatusDenied
permissionGranted = false;
break;
case 3: // AVAuthorizationStatusAuthorized
permissionGranted = true;
break;
default:
permissionGranted = false;
}
resolve(permissionGranted);
}, (err) => {
console.error('Error checking camera permission:', err);
reject(err);
});
});
}
// 使用示例
checkCameraPermission().then(permissionGranted => {
if (permissionGranted) {
console.log('Camera permission is granted.');
// 执行需要相机权限的操作
} else {
console.log('Camera permission is not granted.');
// 提示用户授权或处理无权限的情况
}
}).catch(err => {
console.error('Failed to check camera permission:', err);
});
注意:
- 上面的代码示例使用了
AVFoundation
框架的authorizationStatusForMediaType
方法来检查相机权限。这个方法在iOS平台上有效。 kUTTypeImage
是用于指定媒体类型的常量,这里表示检查图片(相机)权限。- 由于Native.js直接调用原生代码,错误处理和状态码解析需要根据实际返回的结果进行调整。
- 在实际项目中,请确保对错误情况进行妥善处理,并考虑用户隐私和权限管理的最佳实践。