iOS開發(fā)中的這些權(quán)限,你搞懂了嗎?
寫在前面
APP開發(fā)避免不開系統(tǒng)權(quán)限的問題,如何在APP以更加友好的方式向用戶展示系統(tǒng)權(quán)限,似乎也是開發(fā)過程中值得深思的一件事;
那如何提高APP獲取iOS系統(tǒng)權(quán)限的通過率呢?有以下幾種方式:
- 在用戶打開APP時就向用戶請求權(quán)限;
- 告知用戶授權(quán)權(quán)限后能夠獲得好處之后,再向用戶請求權(quán)限;
- 在絕對必要的情況下才向用戶請求權(quán)限,例如:用戶訪問照片庫時請求訪問系統(tǒng)相冊權(quán)限;
- 在展示系統(tǒng)權(quán)限的對話框前,先向用戶顯示自定義的對話框,若用戶選擇不允許,默認無操作,若用戶選擇允許,再展示系統(tǒng)對話框。
上述情況在開發(fā)過程中是經(jīng)常遇到的,不同方式的選擇會影響最后用戶交互體驗。這一點感悟正是源于上一周工作遇到的問題:適配iOS10,如何獲取應(yīng)用聯(lián)網(wǎng)權(quán)限用以管理系統(tǒng)對話框的顯示管理。當我把這個問題解決后,感覺有必要將常用的iOS系統(tǒng)權(quán)限做一個總結(jié),以便后用。
權(quán)限分類
- 聯(lián)網(wǎng)權(quán)限
- 相冊權(quán)限
- 相機、麥克風權(quán)限
- 定位權(quán)限
- 推送權(quán)限
- 通訊錄權(quán)限
- 日歷、備忘錄權(quán)限
聯(lián)網(wǎng)權(quán)限
引入頭文件 @import CoreTelephony;
應(yīng)用啟動后,檢測應(yīng)用中是否有聯(lián)網(wǎng)權(quán)限
- CTCellularData *cellularData = [[CTCellularData alloc]init];
- cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state){
- //獲取聯(lián)網(wǎng)狀態(tài)
- switch (state) {
- case kCTCellularDataRestricted:
- NSLog(@"Restricrted");
- break;
- case kCTCellularDataNotRestricted:
- NSLog(@"Not Restricted");
- break;
- case kCTCellularDataRestrictedStateUnknown:
- NSLog(@"Unknown");
- break;
- default:
- break;
- };
- };
查詢應(yīng)用是否有聯(lián)網(wǎng)功能
- CTCellularData *cellularData = [[CTCellularData alloc]init];
- CTCellularDataRestrictedState state = cellularData.restrictedState;
- switch (state) {
- case kCTCellularDataRestricted:
- NSLog(@"Restricrted");
- break;
- case kCTCellularDataNotRestricted:
- NSLog(@"Not Restricted");
- break;
- case kCTCellularDataRestrictedStateUnknown:
- NSLog(@"Unknown");
- break;
- default:
- break;
- }
相冊權(quán)限--IOS 9.0之前
導(dǎo)入頭文件@import AssetsLibrary;
檢查是否有相冊權(quán)限
- ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
- switch (status) {
- case ALAuthorizationStatusAuthorized:
- NSLog(@"Authorized");
- break;
- case ALAuthorizationStatusDenied:
- NSLog(@"Denied");
- break;
- case ALAuthorizationStatusNotDetermined:
- NSLog(@"not Determined");
- break;
- case ALAuthorizationStatusRestricted:
- NSLog(@"Restricted");
- break;
- default:
- break;
- }
相冊權(quán)限--IOS 8.0之后
導(dǎo)入頭文件@import Photos;
檢查是否有相冊權(quán)限
- PHAuthorizationStatus photoAuthorStatus = [PHPhotoLibrary authorizationStatus];
- switch (photoAuthorStatus) {
- case PHAuthorizationStatusAuthorized:
- NSLog(@"Authorized");
- break;
- case PHAuthorizationStatusDenied:
- NSLog(@"Denied");
- break;
- case PHAuthorizationStatusNotDetermined:
- NSLog(@"not Determined");
- break;
- case PHAuthorizationStatusRestricted:
- NSLog(@"Restricted");
- break;
- default:
- break;
- }
![Uploading 144446-b8aca7ba38c5f8c0_695906.png . . .]獲取相冊權(quán)限
- [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
- if (status == PHAuthorizationStatusAuthorized) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
相機和麥克風權(quán)限
導(dǎo)入頭文件@import AVFoundation;
檢查是否有相機或麥克風權(quán)限
- AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];//相機權(quán)限
- AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];//麥克風權(quán)限
- switch (AVstatus) {
- case AVAuthorizationStatusAuthorized:
- NSLog(@"Authorized");
- break;
- case AVAuthorizationStatusDenied:
- NSLog(@"Denied");
- break;
- case AVAuthorizationStatusNotDetermined:
- NSLog(@"not Determined");
- break;
- case AVAuthorizationStatusRestricted:
- NSLog(@"Restricted");
- break;
- default:
- break;
- }
獲取相機或麥克風權(quán)限
- [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {//相機權(quán)限
- if (granted) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
- [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {//麥克風權(quán)限
- if (granted) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
定位權(quán)限
導(dǎo)入頭文件@import CoreLocation;
由于iOS8.0之后定位方法的改變,需要在info.plist中進行配置;
檢查是否有定位權(quán)限
- BOOL isLocation = [CLLocationManager locationServicesEnabled];
- if (!isLocation) {
- NSLog(@"not turn on the location");
- }
- CLAuthorizationStatus CLstatus = [CLLocationManager authorizationStatus];
- switch (CLstatus) {
- case kCLAuthorizationStatusAuthorizedAlways:
- NSLog(@"Always Authorized");
- break;
- case kCLAuthorizationStatusAuthorizedWhenInUse:
- NSLog(@"AuthorizedWhenInUse");
- break;
- case kCLAuthorizationStatusDenied:
- NSLog(@"Denied");
- break;
- case kCLAuthorizationStatusNotDetermined:
- NSLog(@"not Determined");
- break;
- case kCLAuthorizationStatusRestricted:
- NSLog(@"Restricted");
- break;
- default:
- break;
- }
獲取定位權(quán)限
- CLLocationManager *manager = [[CLLocationManager alloc] init];
- [manager requestAlwaysAuthorization];//一直獲取定位信息
- [manager requestWhenInUseAuthorization];//使用的時候獲取定位信息
在代理方法中查看權(quán)限是否改變
- - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
- switch (status) {
- case kCLAuthorizationStatusAuthorizedAlways:
- NSLog(@"Always Authorized");
- break;
- case kCLAuthorizationStatusAuthorizedWhenInUse:
- NSLog(@"AuthorizedWhenInUse");
- break;
- case kCLAuthorizationStatusDenied:
- NSLog(@"Denied");
- break;
- case kCLAuthorizationStatusNotDetermined:
- NSLog(@"not Determined");
- break;
- case kCLAuthorizationStatusRestricted:
- NSLog(@"Restricted");
- break;
- default:
- break;
- }
- }
推送權(quán)限
檢查是否有通訊權(quán)限
- UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
- switch (settings.types) {
- case UIUserNotificationTypeNone:
- NSLog(@"None");
- break;
- case UIUserNotificationTypeAlert:
- NSLog(@"Alert Notification");
- break;
- case UIUserNotificationTypeBadge:
- NSLog(@"Badge Notification");
- break;
- case UIUserNotificationTypeSound:
- NSLog(@"sound Notification'");
- break;
- default:
- break;
- }
獲取推送權(quán)限
- UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
- [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
通訊錄權(quán)限
iOS9.0之前
導(dǎo)入頭文件 @import AddressBook;
檢查是否有通訊錄權(quán)限
- ABAuthorizationStatus ABstatus = ABAddressBookGetAuthorizationStatus();
- switch (ABstatus) {
- case kABAuthorizationStatusAuthorized:
- NSLog(@"Authorized");
- break;
- case kABAuthorizationStatusDenied:
- NSLog(@"Denied'");
- break;
- case kABAuthorizationStatusNotDetermined:
- NSLog(@"not Determined");
- break;
- case kABAuthorizationStatusRestricted:
- NSLog(@"Restricted");
- break;
- default:
- break;
- }
獲取通訊錄權(quán)限
- ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
- ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
- if (granted) {
- NSLog(@"Authorized");
- CFRelease(addressBook);
- }else{
- NSLog(@"Denied or Restricted");
- }
- });
iOS9.0及以后
導(dǎo)入頭文件 @import Contacts;
檢查是否有通訊錄權(quán)限
- CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
- switch (status) {
- case CNAuthorizationStatusAuthorized:
- {
- NSLog(@"Authorized:");
- }
- break;
- case CNAuthorizationStatusDenied:{
- NSLog(@"Denied");
- }
- break;
- case CNAuthorizationStatusRestricted:{
- NSLog(@"Restricted");
- }
- break;
- case CNAuthorizationStatusNotDetermined:{
- NSLog(@"NotDetermined");
- }
- break;
- }
獲取通訊錄權(quán)限
- CNContactStore *contactStore = [[CNContactStore alloc] init];
- [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
- if (granted) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
日歷、備忘錄權(quán)限
導(dǎo)入頭文件
檢查是否有日歷或者備忘錄權(quán)限
- typedef NS_ENUM(NSUInteger, EKEntityType) {
- EKEntityTypeEvent,//日歷
- EKEntityTypeReminder //備忘
- };
- EKAuthorizationStatus EKstatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
- switch (EKstatus) {
- case EKAuthorizationStatusAuthorized:
- NSLog(@"Authorized");
- break;
- case EKAuthorizationStatusDenied:
- NSLog(@"Denied'");
- break;
- case EKAuthorizationStatusNotDetermined:
- NSLog(@"not Determined");
- break;
- case EKAuthorizationStatusRestricted:
- NSLog(@"Restricted");
- break;
- default:
- break;
- }
獲取日歷或備忘錄權(quán)限
- EKEventStore *store = [[EKEventStore alloc]init];
- [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
- if (granted) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
最后一點
素有獲取權(quán)限的方法,多用于用戶第一次操作應(yīng)用,iOS 8.0之后,將這些設(shè)置都整合在一起,并且可以開啟或關(guān)閉相應(yīng)的權(quán)限。所有的權(quán)限都可以通過下面的方法打開:
- [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
上述的權(quán)限多為經(jīng)常用到的權(quán)限,當然不會很全面,大家如有需要其他的權(quán)限,可以在下方評論,我會及時加上去的。
希望這篇文章能夠給大家的開發(fā)帶來一些便利。