翼度科技»论坛 编程开发 JavaScript 查看内容

uniapp_05_权限检测和跳转到设置

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
关于 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: 失败回调
    1.     // 查询定位和推送权限
    2.     plus.android.requestPermissions(
    3.         ['android.permission.ACCESS_FINE_LOCATION', 'push'],
    4.         (res)=>{
    5.             console.log("====> 权限查询成功", res);
    6.             // granted:      以获取到权限
    7.             // deniedPresent:已拒绝权限(临时)
    8.             // deniedAlways :已拒绝权限(永久)
    9.             const { granted, deniedPresent, deniedAlways } = res;
    10.             if(granted.length) resolve(1);
    11.             if(deniedPresent.length) resolve(0);
    12.             if(deniedAlways.length) resolve(-1);
    13.         },
    14.         (err)=>{
    15.             // code   : 错误编码
    16.             // message: 错误信息描述
    17.             resolve({...err})
    18.         }
    19.     )
    复制代码
  • ios权限查询

    ios 权限查询需要先导入对应权限的包
    1.     // 查询定位权限
    2.     const cllocationManger = plus.ios.import("CLLocationManager");
    3.         const status = plus.ios.invoke(cllocationManger, 'authorizationStatus');
    4.         result = status == 0 || status == 3;
    5.         plus.ios.deleteObject(cllocationManger);
    复制代码
跳转到应用详情


  • Android 跳转

    setData : 传入的是uri,用于数据的过滤。setData可以被系统用来寻找匹配目标组件。
    putExtra: 只是用来设定各种不同类型的附加数据。不被系统用来寻找匹配目标组件。
    直接跳转应用详情里的权限页需要适配不同品牌的手机 (用雷电模拟器试了华为的发现没用)
    1.     // 跳转到应用详情
    2.     const main = plus.android.runtimeMainActivity();
    3.     const Intent = plus.android.importClass('android.content.Intent');
    4.     const Settings = plus.android.importClass("android.provider.Settings");
    5.     const Uri = plus.android.importClass("android.net.Uri");
    6.     const pkName = main.getPackageName(); // 获取应用id
    7.     const uri = Uri.fromParts("package", pkName, null); //
    8.     let _intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    9.     _intent.setData(uri);
    10.     main.startActivity(_intent);
    11.     // 跳转到应用详情对应权限设置
    12.     // 华为 (不生效)
    13.     const main = plus.android.runtimeMainActivity();
    14.     const Intent = plus.android.importClass('android.content.Intent');
    15.     let _intent = new Intent();
    16.     _intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    17.     const pkName = main.getPackageName();
    18.     _intent.putExtra("packageName", pkName);
    19.     const ComponentName = plus.android.importClass('android.content.ComponentName');
    20.     const _comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
    21.     _intent.setComponent(_comp);
    22.     main.startActivity(_intent);
    23.    
    复制代码
  • IOS 跳转
    1.     // 跳转到应用详情
    2.     const UIApplication = plus.ios.import("UIApplication");
    3.     const application2 = UIApplication.sharedApplication();
    4.     const NSURL2 = plus.ios.import("NSURL");
    5.     // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");               
    6.     const setting2 = NSURL2.URLWithString("app-settings:");
    7.     application2.openURL(setting2);
    8.    
    9.     plus.ios.deleteObject(setting2);
    10.     plus.ios.deleteObject(NSURL2);
    11.     plus.ios.deleteObject(application2);
    12.     // 跳转到应用详情对应权限设置
    13.     const app = plus.ios.invoke('UIApplication', 'sharedApplication');
    14.     // UIApplicationOpenSettingsURLString
    15.     const setting = plus.ios.invoke('NSURL', 'URLWithString:', "App-Prefs:root=Privacy&path=LOCATION_SERVICES");
    16.     plus.ios.invoke(app, 'openURL:', setting);  
    17.     plus.ios.deleteObject(setting);  
    18.     plus.ios.deleteObject(app);
    复制代码
跳转到系统设置


  • Android 跳转
    1.     // 设置
    2.     const main = plus.android.runtimeMainActivity(),
    3.           Intent = plus.android.importClass('android.content.Intent'),
    4.           Settings = plus.android.importClass('android.provider.Settings');
    5.     let _intent = new Intent(Settings.ACTION_SETTINGS);
    6.     main.startActivity(_intent);
    7.     // 定位服务设置
    8.     const main = plus.android.runtimeMainActivity();
    9.     const Intent = plus.android.importClass('android.content.Intent'),
    10.           Settings = plus.android.importClass('android.provider.Settings');
    11.     const pkName = main.getPackageName(),
    12.             uid = main.getApplicationInfo().plusGetAttribute("uid");
    13.     let _intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    14.     _intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
    15.     main.startActivity(_intent); // 打开系统设置GPS服务页面
    复制代码
  • IOS 跳转
    1.     // 设置
    2.     const app = plus.ios.invoke('UIApplication', 'sharedApplication');
    3.     const setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');  
    4.     plus.ios.invoke(app, 'openURL:', setting);  
    5.     plus.ios.deleteObject(setting);  
    6.     plus.ios.deleteObject(app);
    复制代码
参考


来源:https://www.cnblogs.com/tsuru/p/17577761.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具