ios 判斷使用者是否開啟許可權---並跳轉設

ciscopuke發表於2021-09-09

1、相簿相機
2、通知
3、通訊錄
4、定位

1.  判斷 訪問相簿 或 相機 許可權是否開啟

//在info.plist 裡面設定

Privacy - Camera Usage Description      App需要您的同意,才能訪問相
Privacy - Photo Library Usage Description   App需要您的同意,才能訪問相簿

科普:

相簿

//相簿許可權判斷 需要引入框架

#import   //相簿

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 #import 

判斷是否開啟相機許可權 的4中狀態

typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {  

//1. 表明使用者尚未選擇關於客戶端是否可以訪問硬體   
  AVAuthorizationStatusNotDetermined = 0,  

//2. 客戶端未被授權訪問硬體的媒體型別。使用者不能改變客戶機的狀態,可能由於活躍的限制,如家長控制  
  AVAuthorizationStatusRestricted,  

//3. 明確拒絕使用者訪問硬體支援的媒體型別的客戶
   AVAuthorizationStatusDenied, 

//4. 客戶端授權訪問硬體支援的媒體型別
   AVAuthorizationStatusAuthorized } NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
=================使用====================
//選擇從相簿獲取圖片//判斷狀態  如果已經授權 則從相簿選取相片 
         如果沒有授權  則跳轉到授權設定介面//選擇從相機獲取圖片//判斷狀態  如果已經授權 則開啟攝像頭 
         如果沒有授權  則跳轉到授權設定介面//引入下面的框架//相簿許可權判斷 需要引入框架#import   //相簿//相簿許可權判斷 需要引入框架#import #import //【注意】  控制器要遵循的協議相簿  
         
 //自定義的列舉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];
    }

2 、定位

=======檢測是否開啟定位======
在info.plist 裡面配置

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

引入框架

 #import   //定位遵循協議 
typedef NS_ENUM(int, CLAuthorizationStatus) {        //定位服務授權狀態是使用者沒有決定是否使用定位服務
        kCLAuthorizationStatusNotDetermined = 0,        //定位服務授權狀態是受限制的。可能是由於活動限制定位服務,使用者不能改變。這個狀態可能不是使用者拒絕的定位服務
        kCLAuthorizationStatusRestricted,        //定位服務授權狀態已經被使用者明確禁止,或者在設定裡的定位服務中關閉
        kCLAuthorizationStatusDenied,       //定位服務授權狀態已經被使用者允許在任何狀態下獲取位置資訊。包括監測區域、訪問區域、或者在有顯著的位置變化的時候
        kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(10_12, 8_0),       //定位服務授權狀態僅被允許在使用應用程式的時候
        kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),

};

【注意】

    //1.
    //判斷定位是否開啟是判斷的整個手機系統的定位是否開啟,並不是針對這一應用
    [CLLocationManager locationServicesEnabled]    //跳轉到  整個手機系統的“定位”設定介面
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"]];    //2.
    //跳轉至 系統的許可權設定介面
    NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:settingsURL];

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

引入框架 

#import   //定位遵循協議 //當前狀態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 *)locations {    //

    [locationManager stopUpdatingLocation];    CLLocation *currentLocation = [locations lastObject];    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];    //反編碼

    [geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray * _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 //====方法一+ (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、通訊錄

NSContactsUsageDescription

--->通訊錄

5、麥克風

NSMicrophoneUsageDescription -> 麥克風



作者:子瘋zp
連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2804673/,如需轉載,請註明出處,否則將追究法律責任。

相關文章