关于 uniapp 权限申请和跳转系统页面
- 查询权限
- 跳转到应用详情
- 跳转到系统设置
- 参考
此文中所有 IOS 中使用的代码,因为没有设备所以均未经过实机测试
查询权限
uni.authorize 获取权限只支持微信小程序不支持app,只能用 Native.js 来实现
-
安卓权限查询
plus.android.requestPermissions(permissions, successCb, errorCB)
- permissions:需要查询的权限数组
- successCb:成功回调 有三个参数
granted - Array[String]字符串数组,已获取权限列表;
deniedPresent - Array[String]字符串数据,已拒绝(临时)的权限列表;
deniedAlways - Array[String]字符串数据,永久拒绝的权限列表。 - errorCB: 失败回调
// 查询定位和推送权限 plus.android.requestPermissions( ['android.permission.ACCESS_FINE_LOCATION', 'push'], (res)=>{ console.log("====> 权限查询成功", res); // granted: 以获取到权限 // deniedPresent:已拒绝权限(临时) // deniedAlways :已拒绝权限(永久) const { granted, deniedPresent, deniedAlways } = res; if(granted.length) resolve(1); if(deniedPresent.length) resolve(0); if(deniedAlways.length) resolve(-1); }, (err)=>{ // code : 错误编码 // message: 错误信息描述 resolve({...err}) } )
-
ios权限查询
ios 权限查询需要先导入对应权限的包
// 查询定位权限 const cllocationManger = plus.ios.import("CLLocationManager"); const status = plus.ios.invoke(cllocationManger, 'authorizationStatus'); result = status == 0 || status == 3; plus.ios.deleteObject(cllocationManger);
跳转到应用详情
-
Android 跳转
setData : 传入的是uri,用于数据的过滤。setData可以被系统用来寻找匹配目标组件。
putExtra: 只是用来设定各种不同类型的附加数据。不被系统用来寻找匹配目标组件。
直接跳转应用详情里的权限页需要适配不同品牌的手机 (用雷电模拟器试了华为的发现没用)
// 跳转到应用详情 const main = plus.android.runtimeMainActivity(); const Intent = plus.android.importClass('android.content.Intent'); const Settings = plus.android.importClass("android.provider.Settings"); const Uri = plus.android.importClass("android.net.Uri"); const pkName = main.getPackageName(); // 获取应用id const uri = Uri.fromParts("package", pkName, null); // let _intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); _intent.setData(uri); main.startActivity(_intent); // 跳转到应用详情对应权限设置 // 华为 (不生效) const main = plus.android.runtimeMainActivity(); const Intent = plus.android.importClass('android.content.Intent'); let _intent = new Intent(); _intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); const pkName = main.getPackageName(); _intent.putExtra("packageName", pkName); const ComponentName = plus.android.importClass('android.content.ComponentName'); const _comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"); _intent.setComponent(_comp); main.startActivity(_intent);
-
IOS 跳转
// 跳转到应用详情 const UIApplication = plus.ios.import("UIApplication"); const application2 = UIApplication.sharedApplication(); const NSURL2 = plus.ios.import("NSURL"); // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES"); const setting2 = NSURL2.URLWithString("app-settings:"); application2.openURL(setting2); plus.ios.deleteObject(setting2); plus.ios.deleteObject(NSURL2); plus.ios.deleteObject(application2); // 跳转到应用详情对应权限设置 const app = plus.ios.invoke('UIApplication', 'sharedApplication'); // UIApplicationOpenSettingsURLString const setting = plus.ios.invoke('NSURL', 'URLWithString:', "App-Prefs:root=Privacy&path=LOCATION_SERVICES"); plus.ios.invoke(app, 'openURL:', setting); plus.ios.deleteObject(setting); plus.ios.deleteObject(app);
跳转到系统设置
-
Android 跳转
// 设置 const main = plus.android.runtimeMainActivity(), Intent = plus.android.importClass('android.content.Intent'), Settings = plus.android.importClass('android.provider.Settings'); let _intent = new Intent(Settings.ACTION_SETTINGS); main.startActivity(_intent); // 定位服务设置 const main = plus.android.runtimeMainActivity(); const Intent = plus.android.importClass('android.content.Intent'), Settings = plus.android.importClass('android.provider.Settings'); const pkName = main.getPackageName(), uid = main.getApplicationInfo().plusGetAttribute("uid"); let _intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); _intent.putExtra('android.provider.extra.APP_PACKAGE', pkName); main.startActivity(_intent); // 打开系统设置GPS服务页面
-
IOS 跳转
// 设置 const app = plus.ios.invoke('UIApplication', 'sharedApplication'); const setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:'); plus.ios.invoke(app, 'openURL:', setting); plus.ios.deleteObject(setting); plus.ios.deleteObject(app);