let isIos = false;

// #ifdef APP-PLUS
isIos = (plus.os.name === 'iOS')
// #endif

// 判断安卓主方法
function requestAndroidPermission(permissionID, ifRequest) {
	return new Promise((resolve, reject) => {
		plus.android.requestPermissions([permissionID], onSuccess, onError)
		function onSuccess(res) {
			const grantedList = res.granted
			const deniedList = res.deniedPresent
			const deniedAlwaysList = res.deniedAlways
			if(grantedList.includes(permissionID)) {
				resolve(true)
			} else {
				resolve(false)
				ifRequest && gotoAppPermissionSetting()
			}
		}
		function onError(err) {
			reject(err)
		}
	})
}

// 分别判断Ios
function judgeIosPermissionPush(ifRequest) {
	return new Promise(resolve => {
		var UIApplication = plus.ios.import("UIApplication");
		var app = UIApplication.sharedApplication();
		var enabledTypes = 0;
		if (app.currentUserNotificationSettings) {
			var settings = app.currentUserNotificationSettings();
			enabledTypes = settings.plusGetAttribute("types");
			if (enabledTypes == 0) {
				ifRequest && gotoAppPermissionSetting()
				resolve(false)
			} else {
				resolve(true)
			}
			plus.ios.deleteObject(settings);
		} else {
			enabledTypes = app.enabledRemoteNotificationTypes();
			if (enabledTypes == 0) {
				ifRequest && gotoAppPermissionSetting()
				resolve(false)
			} else {
				resolve(true)
			}
		}
		plus.ios.deleteObject(app);
		plus.ios.deleteObject(UIApplication);
	})
}

// 判断定位权限是否开启
function judgeIosPermissionLocation(ifRequest) {
	return new Promise(resolve => {
		var cllocationManger = plus.ios.import("CLLocationManager");
		var status = cllocationManger.authorizationStatus();
		if(status == 2) {
			ifRequest && gotoAppPermissionSetting()
			resolve(false)
		} else {
			resolve(true)
		}
		plus.ios.deleteObject(cllocationManger);
	})
}

// 判断麦克风权限是否开启
function judgeIosPermissionRecord(ifRequest) {
	return new Promise(resolve => {
		var avaudiosession = plus.ios.import("AVAudioSession");
		var avaudio = avaudiosession.sharedInstance();
		var permissionStatus = avaudio.recordPermission();
		if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
			ifRequest && gotoAppPermissionSetting()
			resolve(false)
		} else {
			resolve(true)
		}
		plus.ios.deleteObject(avaudiosession);
	})
}

// 判断相机权限是否开启
function judgeIosPermissionCamera(ifRequest) {
	return new Promise(resolve => {
		var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
		var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
		if (authStatus == 3) {
			resolve(true)
		} else {
			ifRequest && gotoAppPermissionSetting()
			resolve(false)
		}
		plus.ios.deleteObject(AVCaptureDevice);
	})
}

// 判断相册权限是否开启
function judgeIosPermissionPhotoLibrary(ifRequest) {
	return new Promise(resolve => {
		var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
		var authStatus = PHPhotoLibrary.authorizationStatus();
		if (authStatus == 3) {
			resolve(true)
		} else {
			ifRequest && gotoAppPermissionSetting()
			resolve(false)
		}
		plus.ios.deleteObject(PHPhotoLibrary);
	})
}

// 判断通讯录权限是否开启
function judgeIosPermissionContact(ifRequest) {
	return new Promise(resolve => {
		var CNContactStore = plus.ios.import("CNContactStore");
		var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
		if (cnAuthStatus == 3) {
			resolve(true)
		} else {
			ifRequest && gotoAppPermissionSetting()
			resolve(false)
		}
		plus.ios.deleteObject(CNContactStore);
	})
}

// 判断所有权限
function getPermisson(permisson, ifRequest=false) {
	switch (permisson){
		case "location":
			if(isIos) {
				return judgeIosPermissionLocation(ifRequest)
			} else {
				return requestAndroidPermission("android.permission.ACCESS_FINE_LOCATION", ifRequest)
			}
			break;
		case "camera":
			if(isIos) {
				return judgeIosPermissionCamera(ifRequest)
			} else {
				return requestAndroidPermission("android.permission.CAMERA", ifRequest)
			}
			break;
		case "photo":
			if(isIos) {
				return judgeIosPermissionPhotoLibrary(ifRequest)
			} else {
				return requestAndroidPermission("android.permission.READ_EXTERNAL_STORAGE", ifRequest)
			}
			break;
		case "record":
			if(isIos) {
				return judgeIosPermissionRecord(ifRequest)
			} else {
				return requestAndroidPermission("android.permission.RECORD_AUDIO", ifRequest)
			}
			break;
		case "contact":
			if(isIos) {
				return judgeIosPermissionContact(ifRequest)
			} else {
				return requestAndroidPermission("android.permission.READ_CONTACTS", ifRequest)
			}
			break;
		case "call":
			if(isIos) {
				return Promise.resolve(true)
			} else {
				return requestAndroidPermission("android.permission.CALL_PHONE", ifRequest)
			}
			break;
		case "push":
			if(isIos) {
				return judgeIosPermissionPush(ifRequest)
			} else {
				return Promise.resolve(true)
			}
			break;
		default:
			break;
	}
}

// 去设置
function gotoAppPermissionSetting() {
	if (isIos) {
		var UIApplication = plus.ios.import("UIApplication");
		var application2 = UIApplication.sharedApplication();
		var NSURL2 = plus.ios.import("NSURL");
		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");		
		var setting2 = NSURL2.URLWithString("app-settings:");
		application2.openURL(setting2);

		plus.ios.deleteObject(setting2);
		plus.ios.deleteObject(NSURL2);
		plus.ios.deleteObject(application2);
	} else {
		var Intent = plus.android.importClass("android.content.Intent");
		var Settings = plus.android.importClass("android.provider.Settings");
		var Uri = plus.android.importClass("android.net.Uri");
		var mainActivity = plus.android.runtimeMainActivity();
		var intent = new Intent();
		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
		var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
		intent.setData(uri);
		mainActivity.startActivity(intent);
	}
}

// 检查是否开启了定位
function checkSystemEnableLocation() {
	if (isIos) {
		var result = false;
		var cllocationManger = plus.ios.import("CLLocationManager");
		var result = cllocationManger.locationServicesEnabled();
		plus.ios.deleteObject(cllocationManger);
		return result;
	} else {
		var context = plus.android.importClass("android.content.Context");
		var locationManager = plus.android.importClass("android.location.LocationManager");
		var main = plus.android.runtimeMainActivity();
		var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
		var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
		return result
	}
}

export default {
	getPermisson,
	checkSystemEnableLocation
}

以上是代码封装

以下是使用方式

// 使用
import $P from '../../../utils/zpermission.js'

onShow() {
	$P.getPermisson('location').then(res => {
		console.log(res) // true or false
	})
	const res = $P.checkSystemEnableLocation()
	console.log(res)  // true or false
},

注意: 定位权限返回为真并不意味着可以定位   需要进一步验证是否开启了定位  也就是手机里面的定位开关

安卓iOS的权限判断方法都是用 Promise 封装  使用方法一致   iOS 没有Error(catch)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐