• ios 判断用户是否开启权限---并跳转设置


    ios 判断用户是否开启权限---并跳转设置

    ios 判断用户是否开启权限---并跳转“系统设置”

    1.判断 访问相册 或 相机 权限是否开启

    2.检测是否开启定位

    后面将持续更新

    只有在应用请求过位置权限 或者 通知权限的时候,才会跳进自己app里面的设置呢。不然直接跳到系统设置界面

    //打开app定位设置

            NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

            

            if([[UIApplication sharedApplication] canOpenURL:settingsURL]) {

                

                [[UIApplication sharedApplication] openURL:settingsURL];

                

            }

    工具/原料

     
    • Mac / Mac mini
    • Xcode

    方法/步骤

     
    1.  

      1.  =====判断 访问相册 或 相机 权限是否开启====

      //在info.plist 里面设置

      NSCameraUsageDescription 

      Privacy - Camera Usage Description      App需要您的同意,才能访问相机

      NSPhotoLibraryUsageDescription

      Privacy - Photo Library Usage Description   App需要您的同意,才能访问相册

      科普:

      //=================相册=======================

      //相册权限判断 需要引入框架

      #import <Photos/PHPhotoLibrary.h>  //相册

      ===PHAuthorizationStatus===相册权限状态判断

      在8.0系统以后,新加入了Photos.framework框架,我们可以利用框架中的PHAuthorizationStatus进行相册权限状态判断。

      ==判断是否开启相册权限 的4中状态

      typedef NS_ENUM(NSInteger,PHAuthorizationStatus) {    

           //==1. 用户还没有关于这个应用程序做出了选择    

           PHAuthorizationStatusNotDetermined = 0,  

        

          //==2. 这个应用程序未被授权访问图片数据。用户不能更改该应用程序的状态,可能是由于活动的限制,如家长控制到位。   

         PHAuthorizationStatusRestricted,  

         //==3. 用户已经明确否认了这个应用程序访问图片数据    

         PHAuthorizationStatusDenied, 

         //==4. 用户授权此应用程序访问图片数据    

         PHAuthorizationStatusAuthorized

       

      }PHOTOS_AVAILABLE_IOS_TVOS(8_0, 10_0);

      //========================相机=====================

      //相册权限判断 需要引入框架

      #import <AVFoundation/AVCaptureDevice.h>#import <AVFoundation/AVMediaFormat.h>

      //=======AVAuthorizationStatus====

      ==判断是否开启相机权限 的4中状态

      typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {   

        

           //1. 表明用户尚未选择关于客户端是否可以访问硬件     

          AVAuthorizationStatusNotDetermined = 0,  

        

          //2. 客户端未被授权访问硬件的媒体类型。用户不能改变客户机的状态,可能由于活跃的限制,如家长控制      

         AVAuthorizationStatusRestricted,  

         

         //3. 明确拒绝用户访问硬件支持的媒体类型的客户     

        AVAuthorizationStatusDenied, 

          

        //4. 客户端授权访问硬件支持的媒体类型     

        AVAuthorizationStatusAuthorized 

      } NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

      =================使用====================

      //选择从相册获取图片

      //判断状态  如果已经授权 则从相册选取相片  

                       如果没有授权  则跳转到授权设置界面

      //选择从相机获取图片

      //判断状态  如果已经授权 则打开摄像头  

                       如果没有授权  则跳转到授权设置界面

      //引入下面的框架

      //相册权限判断 需要引入框架

      #import <Photos/PHPhotoLibrary.h>  //相册

      //相册权限判断 需要引入框架

      #import <AVFoundation/AVCaptureDevice.h>#import <AVFoundation/AVMediaFormat.h>

      【注意】  控制器要遵循的协议

      相册     <UIImagePickerControllerDelegate>

                 <UINavigationControllerDelegate>

      //自定义的枚举

      typedef NS_ENUM(NSInteger, ChosePhontType) {

          ChosePhontTypeAlbum,  //相册

          ChosePhontTypeCamera   //相机

      };

      //下面部分可以直接粘贴复制使用

      -(void)clickHeaderImageView{   //点击头像

              UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"选择相片" message:nil preferredStyle:UIAlertControllerStyleActionSheet];

              UIAlertAction *album = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

                  [self chosePhoto:ChosePhontTypeAlbum]; //从系统相册选择照片

              }];

              UIAlertAction *camera = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

                  [self chosePhoto:ChosePhontTypeCamera]; //相机

              }];

              UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {

                  //

              }];

              [alert addAction:album];

              [alert addAction:camera];

              [alert addAction:cancel];

              [self presentViewController:alert animated:YES completion:^{

              }];

      }

      //==========访问系统  相册 / 相机  ===============

      - (void)chosePhoto:(ChosePhontType)type{

          

          UIImagePickerController *piker = [[UIImagePickerController alloc] init];

          piker.delegate = self;

          piker.allowsEditing = YES;

          

          if (type == ChosePhontTypeAlbum) {   // 相册

              //======判断 访问相册 权限是否开启=======

              PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

              //有被授权访问的照片数据   用户已经明确否认了这一照片数据的应用程序访问

              if (status == PHAuthorizationStatusRestricted ||

                  status == PHAuthorizationStatusDenied) {

                  //====没有权限====

                  UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"去开启访问相册权限?" message:nil preferredStyle:UIAlertControllerStyleAlert];

                  UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

                      

                  }];

                  UIAlertAction *ok = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {

                      //===无权限 引导去开启===

                      [self openJurisdiction];

                  }];

                  // 将UIAlertAction添加到UIAlertController中

                  [alertController addAction:cancel];

                  [alertController addAction:ok];

                  // present显示

                  [self presentViewController:alertController animated:YES completion:nil];

              }else{    //====有访问相册的权限=======

                  

                  piker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

              }

              

          }else if (type == ChosePhontTypeCamera) {  // 相机

              //======判断 访问相机 权限是否开启=======

              AVAuthorizationStatus authStatus =  [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

              //===无权限====

              if (authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied){

                  //====没有权限====

                  UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"去开启访问相机权限?" message:nil preferredStyle:UIAlertControllerStyleAlert];

                  UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

                      

                  }];

                  UIAlertAction *ok = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {

                      //===无权限 引导去开启===

                      [self openJurisdiction];

                  }];

                  // 将UIAlertAction添加到UIAlertController中

                  [alertController addAction:cancel];

                  [alertController addAction:ok];

                  // present显示

                  [self presentViewController:alertController animated:YES completion:nil];

                  

              }else{  //===有权限======

                  

                  if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {   //相机可用

                      piker.sourceType = UIImagePickerControllerSourceTypeCamera;

                  }else{  // 相机不可用

                      [SVProgressHUD showErrorWithStatus:@"相机不可用"];

                      return;

                  }

              }

          }

          [self presentViewController:piker animated:YES completion:^{

          }];

      }

      #pragma mark-------去设置界面开启权限----------

      -(void)openJurisdiction{

          NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

          if ([[UIApplication sharedApplication] canOpenURL:url]) {

              [[UIApplication sharedApplication] openURL:url];

          }

      }

      #pragma mark UIImagePickerController回调方法================

      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { //选取的照片

          //选取的照片

          UIImage *image = info[UIImagePickerControllerEditedImage];

          _tableViewHeaderView.headerV.image = image;

          

          [self dismissViewControllerAnimated:YES completion:nil];

      }

      - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { //取消选择

          [self dismissViewControllerAnimated:YES completion:nil];

      }

      ios 判断用户是否开启权限---并跳转设置
    2.  

      //2.=======检测是否开启定位======

      //在info.plist 里面配置

      NSLocationWhenInUseUsageDescription

      Privacy - Location When In Use Usage Description    App需要使用定位功能

      NSLocationAlwaysUsageDescription

      Privacy - Location Always Usage Description     App需要使用定位功能

      引入框架 

      #import <CoreLocation/CoreLocation.h>  //定位

      遵循协议 <CLLocationManagerDelegate>

      //=========CLAuthorizationStatus=========

      typedef NS_ENUM(int, CLAuthorizationStatus) {

              //定位服务授权状态是用户没有决定是否使用定位服务

              kCLAuthorizationStatusNotDetermined = 0,

             //定位服务授权状态是受限制的。可能是由于活动限制定位服务,用户不能改变。这个状态可能不是用户拒绝的定位服务

              kCLAuthorizationStatusRestricted,

              //定位服务授权状态已经被用户明确禁止,或者在设置里的定位服务中关闭

              kCLAuthorizationStatusDenied,

              //定位服务授权状态已经被用户允许在任何状态下获取位置信息。包括监测区域、访问区域、或者在有显著的位置变化的时候

              kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(10_12, 8_0),

              //定位服务授权状态仅被允许在使用应用程序的时候

              kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),

              //已被废弃

              kCLAuthorizationStatusAuthorized NS_ENUM_DEPRECATED(10_6, NA, 2_0, 8_0, "Use kCLAuthorizationStatusAuthorizedAlways") __TVOS_PROHIBITED __WATCHOS_PROHIBITED = kCLAuthorizationStatusAuthorizedAlways

          };

      【注意】

      //1.

      //判断定位是否开启是判断的整个手机系统的定位是否打开,并不是针对这一应用

      //[CLLocationManager locationServicesEnabled]

      //跳转到  整个手机系统的“定位”设置界面

       [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"]];

      //2.

      //跳转至 系统的权限设置界面

      NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

              [[UIApplication sharedApplication] openURL:settingsURL];

      //================使用=================

      引入框架 

      #import <CoreLocation/CoreLocation.h>  //定位

      遵循协议 <CLLocationManagerDelegate>

      //当前状态

      CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

      if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied) {  

              //定位开启 

          }

      //全局变量

      CLLocationManager * locationManager;

       NSString * currentCity; //当前城市

       NSString *prv; //当前省

      -(void)addLocation{   //开始定位

          

          //判断定位是否开启是判断的整个手机系统的定位是否打开,并不是针对这一应用

          //判断定位功能是否打开

          if ([CLLocationManager locationServicesEnabled]) {

              

              locationManager = [[CLLocationManager alloc] init];

              locationManager.delegate = self;  //遵循协议

              //精确定位

              locationManager.desiredAccuracy = kCLLocationAccuracyBest;

              [locationManager requestWhenInUseAuthorization];  //使用时定位

              currentCity = [[NSString alloc] init];

              [locationManager startUpdatingLocation];  //开始定位

          }

      }

      #pragma mark CoreLocation delegate----- 定位----

      //定位失败则执行此代理方法

      //定位失败弹出提示框,点击"打开定位"按钮,会打开系统的设置,提示打开定位服务

      - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {

          

          UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:@"允许"定位"提示" message:@"请在设置中打开定位" preferredStyle:UIAlertControllerStyleAlert];

          UIAlertAction * ok = [UIAlertAction actionWithTitle:@"打开定位" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

              

              //打开app定位设置

              NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

              [[UIApplication sharedApplication] openURL:settingsURL];

          }];

          UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

              

          }];

          [alertVC addAction:cancel];

          [alertVC addAction:ok];

          [self presentViewController:alertVC animated:YES completion:nil];

          

      }

      //定位成功

      - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {

          //

          [locationManager stopUpdatingLocation];

          CLLocation *currentLocation = [locations lastObject];

          CLGeocoder * geoCoder = [[CLGeocoder alloc] init];

          

          //反编码

          [geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

              if (placemarks.count > 0) {

                  CLPlacemark *placeMark = placemarks[0];

                  currentCity = placeMark.locality;

                  if (!currentCity) {

                      currentCity = @"无法定位当前城市";

                  }

                  NSLog(@"%@",currentCity); //这就是当前的城市

                  NSLog(@"%@",placeMark.name);//具体地址:  xx市xx区xx街道

                  //administrativeArea   省

                  NSLog(@"%@",placeMark.administrativeArea);

              }

              else if (error == nil && placemarks.count == 0) {

                  NSLog(@"No location and error return");

              }

              else if (error) {

                  NSLog(@"location error: %@ ",error);

              }

              

          }];

      }

    3.  

      //3.=======检测是否允许消息推送======

      #import <UserNotifications/UserNotifications.h>

      //====方法一

      + (BOOL)isAllowedNotification {      

            //

           if ([UIDevice isSystemVersioniOS8]) {  // >= ios8

                    // system is iOS8          

                    UIUserNotificationSettings *setting = [[UIApplication sharedApplication  ] currentUserNotificationSettings];         

                    if (UIUserNotificationTypeNone != setting.types) {            

                          return YES;       

                     }    

            } else {//iOS7 

            

                    UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

                  if(UIRemoteNotificationTypeNone != type) {           

                         return YES;

                    }else

             }    

             return NO;

       }

      + (BOOL)isSystemVersioniOS8 {      

                //check systemVerson of device 

               UIDevice *device = [UIDevice currentDevice]; 

               float sysVersion = [device.systemVersion floatValue];

               if (sysVersion >= 8.0f) {

                    return YES;

               }

               return NO;

       }

      //====方法二

      if ([[UIDevice currentDevice].systemVersion floatValue]>=8.0f) {       

                UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];       

              if (UIUserNotificationTypeNone == setting.types) {           

                    NSLog(@"推送关闭");        

              }else{            

                   NSLog(@"推送打开");       

               }    

      }else{       

             UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];       

             if(UIRemoteNotificationTypeNone == type){            

                   NSLog(@"推送关闭");       

              }else{            

                  NSLog(@"推送打开");        

              }   

       }

      // 去设置

      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];  

      //===方法三

      + (void)isOpenMessageNotificationServiceWithBlock:(ReturnBlock)returnBlock  

      {  

          BOOL isOpen = NO;  

      #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0  

          UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];  

          if (setting.types != UIUserNotificationTypeNone) {  

              isOpen = YES;  

          }  

      #else  

          UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];  

          if (type != UIRemoteNotificationTypeNone) {  

              isOpen = YES;  

          }  

      #endif  

          if (returnBlock) {  

              returnBlock(isOpen);  

          }  

      }

      //====方法四

      + (void)isOpenMessageNotificationServiceWithBlock:(ReturnBlock)returnBlock  

      {  

      #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0  

          [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) {  

              if (returnBlock) {  

                  returnBlock(settings.authorizationStatus == UNAuthorizationStatusAuthorized);  

              }  

          }];  

      #elif __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0  

          returnBlock([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]);  

      #else  

          UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];  

          if (returnBlock) {  

              returnBlock(type != UIRemoteNotificationTypeNone);  

          }  

      #endif  

      }

    4. 4

      //4.

      NSContactsUsageDescription -> 通讯录

      NSMicrophoneUsageDescription -> 麦克风

  • 相关阅读:
    算法(第4版)-1.1.2 原始数据类型与表达式
    java值传递与引用传递实例
    (转载)理解Java中的引用传递和值传递
    (转载)深入Java关键字this的用法的总结
    如何判断数据库中是否存在某个表
    iforums之UEditor上传图片提示【未知错误】
    空指针和野指针
    self关键字
    自定义构造方法和description方法
    点语法
  • 原文地址:https://www.cnblogs.com/YangFuShun/p/6803115.html
Copyright © 2020-2023  润新知