手机通讯录权限:

/**
  *  检测权限并作响应的操作
  */
 - (void)checkAuthorizationStatus:(UISwitch *)sender {
     
     switch (ABAddressBookGetAuthorizationStatus()) {
             
         case kABAuthorizationStatusAuthorized: //存在权限
             //获取通讯录
             self.phonesAry = [self obtainContacts:self.addressBook];
             if (_setAddBookBlock) {
                 _setAddBookBlock(sender.isOn ? 0 : 1, _phonesAry);
             }
             break;
             
         case kABAuthorizationStatusNotDetermined: //权限未知
             //请求权限
             [self requestAuthorizationStatus:sender];
             break;
             
         case kABAuthorizationStatusDenied: //如果没有权限  需要提示
         case kABAuthorizationStatusRestricted:
             //弹窗提醒
         {
             
             NSString *appName = kApp_Display_Name;
             
             UIAlertView *alertview = [[UIAlertView alloc]initWithTitle:[NSString stringWithFormat:@"%@没有获取手机通讯录的权限",appName] message:[NSString stringWithFormat:@"请在“[设置]-[隐私]-[通讯录]”里允许%@使用",appName] delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
             
             [alertview show];
             
             //重置开关
             dispatch_async(dispatch_get_main_queue(), ^{
                 
                 [sender setOn:NO];
                 
                 
             });
             
         }
             break;
             
         default:
             break;
     }
 }
 /**
  *  请求通讯录的权限
  */
 - (void)requestAuthorizationStatus:(UISwitch *)sender {
     
     WeakSelf(self);
     
     ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error) {
         
         //权限得到允许
         if (granted == true) {

             dispatch_async(dispatch_get_main_queue(), ^{
                 
                 [sender setOn:YES];
                 weakSelf.phonesAry = [weakSelf obtainContacts:weakSelf.addressBook];
                 if (weakSelf.setAddBookBlock) {
                     weakSelf.setAddBookBlock(sender.isOn ? 0 : 1, weakSelf.phonesAry);
                 }
                 
             });
             
         } else {            //不允许
             dispatch_async(dispatch_get_main_queue(), ^{
                 
                 [sender setOn:NO];
                 
             });
             
         }
         
         
         
     });
 }/**
  *  获取通讯录中的联系人
  */
 - (NSMutableArray *)obtainContacts:(ABAddressBookRef)addressBook {
     
     //按照添加时间请求所有的联系人
     CFArrayRef contants = ABAddressBookCopyArrayOfAllPeople(addressBook);
     
     //存放所有联系人电话号码的数组
     NSMutableArray *allNumArray = [NSMutableArray arrayWithCapacity:0];
     
     //遍历获取所有的数据
     for (NSInteger i = 0; i < CFArrayGetCount(contants); i++) {
         //获得People对象
         ABRecordRef recordRef = CFArrayGetValueAtIndex(contants, i);
         
         NSArray *contact = [self contactPhonePropertyWithRecordRef:recordRef];
         
         //添加对象
         [allNumArray addObjectsFromArray:contact];
     }
     
     //释放资源
     CFRelease(contants);
     
     return allNumArray;
     
 }

 //获取单个联系人的电话号码数组
 - (NSArray *)contactPhonePropertyWithRecordRef:(ABRecordRef)recordRef {
     //外传数组
     NSMutableArray *phones = [NSMutableArray arrayWithCapacity:0];
     
     //获得电话号码的多值对象
     ABMultiValueRef values = ABRecordCopyValue(recordRef, kABPersonPhoneProperty);
     
     for (NSInteger i = 0; i < ABMultiValueGetCount(values); i++) {
         
         //电话号码
         NSString *phoneNumber = (__bridge NSString *)ABMultiValueCopyValueAtIndex(values, i);
         
         //添加数据
         [phones addObject:phoneNumber];
         
     }
     
     //释放资源
     CFRelease(values);
     
     return [NSArray arrayWithArray:phones];
 }
相机权限: 
 //检查相机权限
 - (void)checkVideoStatus {
     
     AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
     switch (authStatus) {
         case AVAuthorizationStatusNotDetermined:
             //没有询问是否开启相机
             
             break;
         case AVAuthorizationStatusRestricted:
             //未授权,家长限制
             
             break;
         case AVAuthorizationStatusDenied:
             //未授权
             
             break;
         case AVAuthorizationStatusAuthorized:
             //玩家授权
             
             break;
         default:
             break;
     }
 }

 //授权相机
 - (void)videoAuthAction {
     [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
         if (granted) {
             //相机准许
             
         } else {
             //相机不准许
             
         }
     }];
 }
麦克风权限:
//检查麦克风权限
 - (void)checkAudioStatus {
     AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
     switch (authStatus) {
         case AVAuthorizationStatusNotDetermined:
             //没有询问是否开启麦克风
             
             break;
         case AVAuthorizationStatusRestricted:
             //未授权,家长限制
             
             break;
         case AVAuthorizationStatusDenied:
             //玩家未授权
             
             break;
         case AVAuthorizationStatusAuthorized:
             //玩家授权
             
             break;
         default:
             break;
     }
 }

 //授权麦克风
 - (void)audioAuthAction {
     
     [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
         
         if (granted) {
             //麦克风准许
             
         } else {
             //麦克风不准许
             
         }
     }];
 }
照片权限:
 

 //检查照片权限 

 - (void) checkPhotoStauts{ 

     PHAuthorizationStatus photoAuthorStatus = [PHPhotoLibrary authorizationStatus]; 

     switch (photoAuthorStatus) { 

         case PHAuthorizationStatusAuthorized: 

              

             break; 

         case PHAuthorizationStatusDenied: 

              

             break; 

         case PHAuthorizationStatusNotDetermined: 

              

             break; 

         case PHAuthorizationStatusRestricted: 

              

             break; 

         default: 

             break; 

     } 

 } 


 //授权照片 

 - (void)phontLibraryAction{ 

     [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { 

          

         dispatch_async(dispatch_get_main_queue(), ^{ 

              

             if (status == PHAuthorizationStatusAuthorized) { 

                  

                 //照片允许 

                  

             } else { 

                  

                 [[[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%@没有使用照片的权限",kApp_Display_Name] message:[NSString stringWithFormat:@"请在“[设置]-[隐私]-[照片]”里允许%@使用",kApp_Display_Name] delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil] show]; 

                  

             } 

              

         }); 


          

     }]; 

}


定位权限:



 
  
 //实例化 
 
 + (instancetype)shareInstance { 
 
     static dispatch_once_t onceToken; 
 
     dispatch_once(&onceToken, ^{ 
 
         _instance = [[LocationManager alloc] init]; 
 
     }); 
 
     return _instance; 
 
 } 
 

 - (instancetype)init { 
 
     if (self = [super init]) { 
 
         //定位管理器 
 
         _locationManager = [CLLocationManager new]; 
 
         _geocoder        = [CLGeocoder new]; 
 

     } 
 
      
 
     return self; 
 
 } 
 

 //设置定位管理 
 
 - (void)setLocationManager { 
 
      
 
     if (![CLLocationManager locationServicesEnabled]) { 
 
         DLog(@"定位信息没有开启"); 
 
     }; 
 
      
 
     if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { 
 
          
 
         if ([DeviceInfo getCurrentDeviceVersion] >= 8) { 
 
             [_locationManager requestWhenInUseAuthorization];//?只在前台开启定位 
 
             //[_locationManager requestAlwaysAuthorization];//?在后台也可定位 
 
         } 
 
         // 5.iOS9新特性:将允许出现这种场景:同一app中多个location manager:一些只能在前台定位,另一些可在后台定位(并可随时禁止其后台定位)。 
 
 //            if ([DeviceInfo getCurrentDeviceVersion] >= 9) { 
 
 //                _locationManager.allowsBackgroundLocationUpdates = YES; 
 
 //            } 
 

     } else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) { 
 
         //设置代理 
 
         _locationManager.delegate = self; 
 
         //设置定位精度 
 
         _locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
 
         //定位频率,每隔多少米定位一次 
 
         CLLocationDistance distance      = 100;//百米定位一次 
 
         _locationManager.distanceFilter  = distance; 
 
          
 
         //启动跟踪定位 
 
         [_locationManager startUpdatingLocation]; 
 
     } 
 
 } 
 

 #pragma mark - CoreLocation 代理 
 
 #pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定位到相应位置) 
 
 //可以通过模拟器设置一个虚拟位置,否则在模拟器中无法调用此方法 
 
 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
 
     CLLocation *location = [locations firstObject];//取出第一个位置 
 
     CLLocationCoordinate2D coordinate = location.coordinate;//位置坐标 
 
      
 
     _longitude = [NSString stringWithFormat:@"%f",coordinate.longitude]; 
 
     _latitude  = [NSString stringWithFormat:@"%f",coordinate.latitude]; 
 
      
 
     [self getAddressByLatitude:coordinate.latitude longitude:coordinate.longitude]; 
 
      
 
     if (_sendPointBlock) { 
 
         _sendPointBlock(_latitude,_longitude); 
 
     } 
 
      
 
 //    [[iToast makeText:@"正在定位....."] show]; 
 
     //31.20476569,+121.62868477 
 
 //    [self getAddressByLatitude:coordinate.longitude longitude:coordinate.latitude]; 
 
     //如果不需要实时定位,使用完即使关闭定位服务 
 
    [_locationManager stopUpdatingLocation]; 
 
 } 
 
 #pragma mark 根据地名确定地理坐标 
 
 - (void)getCoordinateByAddress:(NSString *)address{ 
 
     //地理编码 
 
     [_geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) { 
 
         //取得第一个地标,地标中存储了详细的地址信息,注意:一个地名可能搜索出多个地址 
 
 //        CLPlacemark *placemark=[placemarks firstObject]; 
 
 //         
 
 //        CLLocation *location=placemark.location;//位置 
 
 //        CLRegion *region=placemark.region;//区域 
 
 //        NSDictionary *addressDic= placemark.addressDictionary;//详细地址信息字典,包含以下部分信息 
 
         //NSString *name=placemark.name;//地名 
 
         //NSString *thoroughfare=placemark.thoroughfare;//街道 
 
         //NSString *subThoroughfare=placemark.subThoroughfare; //街道相关信息,例如门牌等 
 
         //NSString *locality=placemark.locality; // 城市 
 
         //NSString *subLocality=placemark.subLocality; // 城市相关信息,例如标志性建筑 
 
         //NSString *administrativeArea=placemark.administrativeArea; // 州 
 
         //NSString *subAdministrativeArea=placemark.subAdministrativeArea; //其他行政区域信息 
 
         //NSString *postalCode=placemark.postalCode; //邮编 
 
         //NSString *ISOcountryCode=placemark.ISOcountryCode; //国家编码 
 
         //NSString *country=placemark.country; //国家 
 
         //NSString *inlandWater=placemark.inlandWater; //水源、湖泊 
 
         //NSString *ocean=placemark.ocean; // 海洋 
 
         //NSArray *areasOfInterest=placemark.areasOfInterest; //关联的或利益相关的地标 
 
         //NSLog(@"位置:%@,区域:%@,详细信息:%@",location,region,addressDic); 
 
     }]; 
 
 } 
 

 #pragma mark 根据坐标取得地名 
 
 -(void)getAddressByLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude { 
 
     //反地理编码 
 
     CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude]; 
 
      
 
     [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { 
 
         CLPlacemark *placemark = [placemarks firstObject]; 
 

         _name         = placemark.name;//名称 
 
         _locality     = placemark.locality;//城市名 
 
         _area         = placemark.subLocality;//区 
 
         _thoroughfare = placemark.thoroughfare;//街道 
 

         dispatch_async(dispatch_get_main_queue(), ^{ 
 

             if (_addressBlock) { 
 
                 _addressBlock(_locality,_area); 
 
             } 
 
              
 
         }); 
 
 //        [[iToast makeText:_name] show]; 
 
 //        [[iToast makeText:_locality] show]; 
 
 //        [[iToast makeText:[NSString stringWithFormat:@"%@",error]] show] ; 
 
          
 
     }]; 
 
 }