ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

uniapp AndroidiOS 定位权限检查

uniapp AndroidiOS 定位权限检查

定位权限检查

// 检查定位权限状态
export const checkPermission = () => {const platform = uni.getSystemInfoSync().platform;console.log('platform', platform)// #ifdef APP-PLUSif (platform === 'android') {// Androidreturn checkAndroidPermission();} else if (platform === 'ios') {// iOSreturn checkIOSPermission();}// #endif
};/*** 获取Android定位权限状态* @returns {Promise<string>} 返回权限状态:*   'granted_always' - 始终允许*   'granted_when_in_use' - 仅在使用时允许 (Android 10+)*   'denied' - 已拒绝*   'denied_forever' - 拒绝且不再询问*/
// Android 检测权限
export const checkAndroidPermission = () => {return new Promise((resolve) => {// #ifdef APP-PLUS// 0-引导 1-允许 2-设置const main = plus.android.runtimeMainActivity();const ActivityCompat = plus.android.importClass('androidx.core.app.ActivityCompat');const PackageManager = plus.android.importClass('android.content.pm.PackageManager');const Manifest = plus.android.importClass('android.Manifest');const ContextCompat = plus.android.importClass('androidx.core.content.ContextCompat');// 检查是否已授权const hasFineLocation = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED;const hasCoarseLocation = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_COARSE_LOCATION) === PackageManager.PERMISSION_GRANTED;if (!hasFineLocation && !hasCoarseLocation) {// 如果完全没有权限,检查是否被永久拒绝console.log("Android 权限被拒绝")resolve(2);return;}// 如果有权限,检查是否是"始终允许" (Android 10+)if (plus.os.version >= 10) {const AppOpsManager = plus.android.importClass('android.app.AppOpsManager');const appOps = main.getSystemService('appops');const mode = plus.android.invoke(appOps,'checkOpNoThrow',AppOpsManager.OPSTR_FINE_LOCATION,main.getApplicationInfo().uid,main.getPackageName());// 处理可能的null返回值if (mode === null) {console.warn('checkOpNoThrow返回null,降级检查运行时权限');const hasPermission = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED;console.log("降级检查运行hasPermission", hasPermission)resolve(hasPermission ? 1 : 2);return;}console.log("Android===mode", mode)switch (mode) {case 0: // MODE_ALLOWEDconsole.log('始终允许定位');resolve(1);break;case 4: // MODE_FOREGROUNDconsole.log('仅允许前台定位');resolve(1);break;case 1: // MODE_IGNOREDconsole.log('已拒绝但可再次请求');resolve(1);break;case 2: // MODE_ERROREDconsole.log('已永久拒绝需手动设置');resolve(2);break;default:console.log('其他状态', mode);}} else {// Android 9及以下无法区分"始终允许"和"仅在使用时允许"console.log("Android 权限始终允许")resolve(1);}});// #endif
}// iOS 检测权限
export const checkIOSPermission = () => {console.log('iOS 检测权限');return new Promise((resolve, reject) => {// #ifdef APP-PLUSconst cllocationManger = plus.ios.import('CLLocationManager');const status = cllocationManger.authorizationStatus();const enable = cllocationManger.locationServicesEnabled();// 0-引导 1-允许 2-设置// status 含义:// 0: 未决定(kCLAuthorizationStatusNotDetermined)// 2: 已拒绝(kCLAuthorizationStatusDenied)// 3: 始终允许(kCLAuthorizationStatusAuthorizedAlways)// 4: 仅使用时允许(kCLAuthorizationStatusAuthorizedWhenInUse)console.log('status', status);if (!enable) {resolve(2);} else if (status === 2) {// 拒绝resolve(2);} else if (status === 4) {// 仅使用时允许resolve(0);} else if (status === 3) {// 未决定resolve(1);} else {resolve(0);}plus.ios.deleteObject(cllocationManger);// #endif});
};// 权限请求
export const getAndroidLocation = () => {return new Promise((resolve, reject) => {plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'],(result) => {console.log('android,', result);// 0-引导 1-允许 2-设置if (result.granted.length) {console.log('Android 已授予定位权限');resolve(1);} else if (result.deniedAlways.length) {// 拒绝,跳转系统设置console.log('Android 已拒绝定位权限');resolve(2);} else {resolve(0);}},(error) => {console.log("Android 检测权限---err", error)reject(error);});})
}

使用

		if (check) {// #ifdef APP-PLUScheckPermission().then(async code => {uni.setStorageSync("locationPermissions", true);console.log("code", code)// 0-引导 1-允许 2-设置if (code === 0) {console.log("权限引导")} else if (code === 1) {console.log("允许");} else if (code === 2) {console.log("跳转权限设置")}}).catch((err) => {console.log("报错", err)uni.showModal({content: '检测权限失败,请确认是否打开GPS,再重启APP',showCancel: false,confirmText: "去开启",success(res) {uni.openAppAuthorizeSetting()}})})}
返回列表