iOS中的用戶權(quán)限

在人們越來越注意隱私的今天箫柳,用戶的app的權(quán)限的下放也越來越謹(jǐn)慎。

得到權(quán)限的過程啥供,一般分為兩種:1. 一次獲取要用的所有權(quán)限悯恍; 2.用什么功能獲取什么權(quán)限。當(dāng)然兩種方式各有有缺點(diǎn)伙狐,方法一涮毫,用戶體驗(yàn)好,但是用戶可能不完全明白權(quán)限的用途贷屎。方法二罢防,也是現(xiàn)在大部分app的做法,使用過程中不斷的彈框獲取提示獲取權(quán)限豫尽,不過這樣用戶也明白權(quán)限的用途篙梢。

下面列舉一下主要的權(quán)限獲取和檢驗(yàn)方法(iOS8以后的版本為例):

  1. 相冊
//頭文件   iOS8以后版本可用PhotoKit
#import <Photos/Photos.h>

檢查是否有相冊權(quán)限

PHAuthorizationStatus photoAuthStatus = [PHPhotoLibrary authorizationStatus];
        switch (photoAuthStatus) {
            case PHAuthorizationStatusNotDetermined:
                NSLog(@"未詢問用戶是否授權(quán)");
                break;
            case PHAuthorizationStatusRestricted:
                NSLog(@"未授權(quán),例如家長控制");
                break;
            case PHAuthorizationStatusDenied:
                NSLog(@"未授權(quán)美旧,用戶拒絕造成的");
                break;
            case PHAuthorizationStatusAuthorized:
                NSLog(@"同意授權(quán)相冊");
                break;
            default:
                break;
        }

獲取相冊權(quán)限

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            if (status == PHAuthorizationStatusAuthorized) {
                NSLog(@"用戶同意授權(quán)相冊");
            }else {
                NSLog(@"用戶拒絕授權(quán)相冊");
            }      
        }];
  1. 相機(jī)和麥克風(fēng)
//頭文件   
#import <AVFoundation/AVFoundation.h>

檢查是否有相機(jī)權(quán)限或者麥克風(fēng)權(quán)限

AVF_EXPORT NSString *const AVMediaTypeVideo                 NS_AVAILABLE(10_7, 4_0); //相機(jī)
AVF_EXPORT NSString *const AVMediaTypeAudio                 NS_AVAILABLE(10_7, 4_0);//麥克風(fēng)
AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
        switch (videoAuthStatus) {
            case AVAuthorizationStatusNotDetermined:
                NSLog(@"未詢問用戶是否授權(quán)");
                break;
            case AVAuthorizationStatusRestricted:
                NSLog(@"未授權(quán)渤滞,例如家長控制");
                break;
            case AVAuthorizationStatusDenied:
                NSLog(@"未授權(quán),用戶拒絕造成的");
                break;
            case AVAuthorizationStatusAuthorized:
                NSLog(@"同意授權(quán)相機(jī)");
                break;
            default:
                break;
        }

獲取相機(jī)權(quán)限或者麥克風(fēng)權(quán)限

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
            if (granted){
                NSLog(@"用戶同意授權(quán)相機(jī)");
            }else {
                NSLog(@"用戶拒絕授權(quán)相機(jī)");
            }
            
        }];
  1. 推送

檢查是否有推送權(quán)限

UIUserNotificationSettings *notificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
        switch (notificationSettings.types) {
            case UIUserNotificationTypeNone:
                NSLog(@"沒有推送權(quán)限");
                break;
            case UIUserNotificationTypeBadge:
                NSLog(@"帶角標(biāo)的推送");
                break;
            case UIUserNotificationTypeSound:
                NSLog(@"帶聲音的推送");
                break;
            case UIUserNotificationTypeAlert:
                NSLog(@"帶通知的推送");
                break;
            default:
                break;
        }

獲取推送權(quán)限

UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound  categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
  1. 通訊錄
//頭文件     iOS9之后蘋果推薦使用<Contacts/Contacts.h>
#import <AddressBook/AddressBook.h>

檢查是否有通訊錄權(quán)限

ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();
        switch (authorizationStatus) {
            case  kABAuthorizationStatusNotDetermined:
                NSLog(@"未詢問用戶是否授權(quán)");
                break;
            case kABAuthorizationStatusRestricted:
                NSLog(@"未授權(quán)榴嗅,例如家長控制");
                break;
            case kABAuthorizationStatusDenied:
                NSLog(@"未授權(quán)妄呕,用戶拒絕造成的");
                break;
            case kABAuthorizationStatusAuthorized:
                NSLog(@"同意授權(quán)通訊錄");
                break;
            default:
                break;
        }

獲取通訊錄權(quán)限

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
              if (granted) {
                NSLog(@"用戶同意授權(quán)通訊錄");
                CFRelease(addressBook);
            } else {
                NSLog(@"用戶拒絕授權(quán)通訊錄");
            }
        });
  1. 日歷和備忘錄
//頭文件   
#import <EventKit/EventKit.h>

檢查是否有日歷權(quán)限或者備忘錄權(quán)限

typedef NS_ENUM(NSUInteger, EKEntityType) {
    EKEntityTypeEvent,//日歷
    EKEntityTypeReminder//備忘錄
};
EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
        switch (status) {
            case  EKAuthorizationStatusNotDetermined:
                NSLog(@"未詢問用戶是否授權(quán)");
                break;
            case EKAuthorizationStatusRestricted:
                NSLog(@"未授權(quán),例如家長控制");
                break;
            case EKAuthorizationStatusDenied:
                NSLog(@"未授權(quán)嗽测,用戶拒絕造成的");
                break;
            case EKAuthorizationStatusAuthorized:
                NSLog(@"同意授權(quán)日歷");
                break;
            default:
                break;
        }

獲取日歷權(quán)限或者備忘錄權(quán)限

        EKEventStore *eventStore = [[EKEventStore alloc] init];
        
        [eventStore requestAccessToEntityType:EKEntityTypeEvent
                                   completion:^(BOOL granted, NSError *error) {
                                       if (error) {
                                           NSLog(@"日歷出現(xiàn)了錯(cuò)誤");
                                           return;
                                       }
                                       if (granted) {
                                           NSLog(@"用戶同意授權(quán)日歷");
                                       } else {
                                           NSLog(@"用戶拒絕授權(quán)日歷");
                                       }
                                       
                                   }];
  1. 定位
//頭文件
#import <CoreLocation/CoreLocation.h>

由于iOS8之后定位方法的改變绪励,需要現(xiàn)在info.plist中進(jìn)行配置

info.png

檢查是否有定位權(quán)限

        BOOL isLocation = [CLLocationManager locationServicesEnabled];  //是否開啟定位服務(wù)
        if (!isLocation) {
            NSLog(@"用戶未開啟定位");
            return ;
        }
        CLAuthorizationStatus locationStatus = [CLLocationManager authorizationStatus];
        switch (locationStatus) {
            case kCLAuthorizationStatusNotDetermined:
                NSLog(@"未詢問用戶是否授權(quán)");
                break;
            case kCLAuthorizationStatusRestricted:
                NSLog(@"未授權(quán),例如家長控制");
                break;
            case kCLAuthorizationStatusDenied:
                NSLog(@"未授權(quán)唠粥,用戶拒絕造成的");
                break;
            case kCLAuthorizationStatusAuthorizedAlways:
                NSLog(@"同意授權(quán)一直獲取定位信息");
                break;
            case kCLAuthorizationStatusAuthorizedWhenInUse:
                NSLog(@"同意授權(quán)在使用時(shí)獲取定位信息");
                break;
                
            default:
                break;
        }

獲取定位權(quán)限

      CLLocationManager *manager = [[CLLocationManager alloc] init];
      [manager requestAlwaysAuthorization];//一直獲取定位信息
      [manager requestWhenInUseAuthorization];//使用時(shí)獲取定位信息

定位中還有一個(gè)代理方法疏魏,可以查看權(quán)限改變

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
            NSLog(@"未詢問用戶是否授權(quán)");
            break;
        case kCLAuthorizationStatusRestricted:
            NSLog(@"未授權(quán),例如家長控制");
            break;
        case kCLAuthorizationStatusDenied:
            NSLog(@"未授權(quán)晤愧,用戶拒絕造成的");
            break;
        case kCLAuthorizationStatusAuthorizedAlways:
            NSLog(@"同意授權(quán)一直獲取定位信息");
            break;
        case kCLAuthorizationStatusAuthorizedWhenInUse:
            NSLog(@"同意授權(quán)在使用時(shí)獲取定位信息");
            break;
            
        default:
            break;
    }
}

所有獲取權(quán)限的方法用戶進(jìn)行了第一次操作之后大莫,都會(huì)沒有用了,iOS8之后蘋果把這些設(shè)置都整合在了一起官份,通過下面這個(gè)方法則可以打開只厘。

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

最后這是一個(gè)非常優(yōu)秀的權(quán)限管理庫PermissionScope
本文的Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烙丛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子羔味,更是在濱河造成了極大的恐慌河咽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赋元,死亡現(xiàn)場離奇詭異忘蟹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)搁凸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門寒瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坪仇,你說我怎么就攤上這事杂腰。” “怎么了椅文?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵喂很,是天一觀的道長。 經(jīng)常有香客問我皆刺,道長少辣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任羡蛾,我火速辦了婚禮漓帅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痴怨。我一直安慰自己忙干,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布浪藻。 她就那樣靜靜地躺著捐迫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爱葵。 梳的紋絲不亂的頭發(fā)上施戴,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音萌丈,去河邊找鬼赞哗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辆雾,可吹牛的內(nèi)容都是我干的肪笋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涂乌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起英岭,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤湾盒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诅妹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罚勾,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年吭狡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尖殃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡划煮,死狀恐怖送丰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弛秋,我是刑警寧澤器躏,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蟹略,受9級(jí)特大地震影響登失,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挖炬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一揽浙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧意敛,春花似錦馅巷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碴倾,卻和暖如春逗噩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跌榔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工异雁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人僧须。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓纲刀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親担平。 傳聞我的和親對(duì)象是個(gè)殘疾皇子示绊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容