uni-app iOS平台:用Native.js来写 如何判断系统功能权限是否开启

发布于 1周前 作者 yuanlaile 来自 Uni-App

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"  
});

安卓权限见:https://ask.dcloud.net.cn/article/35861


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);
});

注意:

  1. 上面的代码示例使用了AVFoundation框架的authorizationStatusForMediaType方法来检查相机权限。这个方法在iOS平台上有效。
  2. kUTTypeImage是用于指定媒体类型的常量,这里表示检查图片(相机)权限。
  3. 由于Native.js直接调用原生代码,错误处理和状态码解析需要根据实际返回的结果进行调整。
  4. 在实际项目中,请确保对错误情况进行妥善处理,并考虑用户隐私和权限管理的最佳实践。
回到顶部