DCloud_IOS_CLP
DCloud_IOS_CLP
  • 发布:2019-05-10 12:13
  • 更新:2019-08-13 09:30
  • 阅读:1119

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

分类: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);  

提示用户开启权限

跳转到应用的权限页面,下面写了一个提示框让用户去选择

                                      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("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);  
                        }  
                    }, {  
                        "buttons": ["Yes", "No"],  
                        "verticalAlign": "center"  
                    });  

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

2 关注 分享
1109895279@qq.com 1578433613@qq.com

要回复文章请先登录注册

2776332953@qq.com

2776332953@qq.com

动态获取权限,我写的方法,欢迎来盘 https://ask.dcloud.net.cn/article/36262
2019-08-13 09:30
2776332953@qq.com

2776332953@qq.com

回复 DCloud_IOS_CLP:
对 ios 没用,昨天试了试,ios 的应用第一次使用 相机,这时候他的应用列表里没有 相机 权限,检查没有怎么办?打开 应用的权限页面 里面没有,只能先检查权限 如果用 plus.navigator.checkPermission 检查得先判断一下是否等于 undetermined(第一次执行 相机),如果是第一次先 plus.camera.getCamera().captureImage 一下,这时候会打开 相机 页面,如果拒绝的话会黑屏,返回,在打开相机,再 check ,这时不会等于 undetermined 了,等于 denied,然后再走 跳转到应用的权限页面 流程,这时候这个页面才会有 相机 的开关,以后都这么着循环重复了,每次都有提示.....,android 没事直接动态申请就行了,我写了个简单方法,一会发出来。
2019-08-13 08:57
DCloud_IOS_CLP

DCloud_IOS_CLP (作者)

回复 2776332953@qq.com:
可以先检查,在触发按钮事件
2019-08-12 17:02
2776332953@qq.com

2776332953@qq.com

有点问题,app第一次如果直接用 plus.camera 调用摄像头时会出现 是否允许 打开相机,如果拒绝的话,下次再调用 plus.camera,就不会有任何提示,相机是黑屏的(应用的权限页面,相机存在了(关闭的))。如果直接 plus.navigator.checkPermission 或用上面的代码检测相机权限发现是“相册权限没有开启”,这时候去提示用户开启权限跳转到应用的权限页面,发现,里面根本没有相机开关。纠结于我想用户每次使用时都先动态监测一下给出提示,而不是黑屏。
2019-08-12 10:03
1109895279@qq.com

1109895279@qq.com

很感谢,官方给出了,这几个的处理方案,android 的在出个 版本 就 完美了!
2019-05-14 15:03