iOS開(kāi)發(fā)中的這些權(quán)限,你搞懂了嗎?
寫(xiě)在前面
APP開(kāi)發(fā)避免不開(kāi)系統(tǒng)權(quán)限的問(wèn)題,如何在APP以更加友好的方式向用戶(hù)展示系統(tǒng)權(quán)限,似乎也是開(kāi)發(fā)過(guò)程中值得深思的一件事;
那如何提高APP獲取iOS系統(tǒng)權(quán)限的通過(guò)率呢?有以下幾種方式:
- 在用戶(hù)打開(kāi)APP時(shí)就向用戶(hù)請(qǐng)求權(quán)限;
- 告知用戶(hù)授權(quán)權(quán)限后能夠獲得好處之后,再向用戶(hù)請(qǐng)求權(quán)限;
- 在絕對(duì)必要的情況下才向用戶(hù)請(qǐng)求權(quán)限,例如:用戶(hù)訪問(wèn)照片庫(kù)時(shí)請(qǐng)求訪問(wèn)系統(tǒng)相冊(cè)權(quán)限;
- 在展示系統(tǒng)權(quán)限的對(duì)話框前,先向用戶(hù)顯示自定義的對(duì)話框,若用戶(hù)選擇不允許,默認(rèn)無(wú)操作,若用戶(hù)選擇允許,再展示系統(tǒng)對(duì)話框。
上述情況在開(kāi)發(fā)過(guò)程中是經(jīng)常遇到的,不同方式的選擇會(huì)影響最后用戶(hù)交互體驗(yàn)。這一點(diǎn)感悟正是源于上一周工作遇到的問(wèn)題:適配iOS10,如何獲取應(yīng)用聯(lián)網(wǎng)權(quán)限用以管理系統(tǒng)對(duì)話框的顯示管理。當(dāng)我把這個(gè)問(wèn)題解決后,感覺(jué)有必要將常用的iOS系統(tǒng)權(quán)限做一個(gè)總結(jié),以便后用。
權(quán)限分類(lèi)
- 聯(lián)網(wǎng)權(quán)限
- 相冊(cè)權(quán)限
- 相機(jī)、麥克風(fēng)權(quán)限
- 定位權(quán)限
- 推送權(quán)限
- 通訊錄權(quán)限
- 日歷、備忘錄權(quán)限
聯(lián)網(wǎng)權(quán)限
引入頭文件 @import CoreTelephony;
應(yīng)用啟動(dòng)后,檢測(cè)應(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;
- };
- };
查詢(xún)應(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;
- }
相冊(cè)權(quán)限--IOS 9.0之前
導(dǎo)入頭文件@import AssetsLibrary;
檢查是否有相冊(cè)權(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;
- }
相冊(cè)權(quán)限--IOS 8.0之后
導(dǎo)入頭文件@import Photos;
檢查是否有相冊(cè)權(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 . . .]獲取相冊(cè)權(quán)限
- [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
- if (status == PHAuthorizationStatusAuthorized) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
相機(jī)和麥克風(fēng)權(quán)限
導(dǎo)入頭文件@import AVFoundation;
檢查是否有相機(jī)或麥克風(fēng)權(quán)限
- AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];//相機(jī)權(quán)限
- AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];//麥克風(fēng)權(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;
- }
獲取相機(jī)或麥克風(fēng)權(quán)限
- [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {//相機(jī)權(quán)限
- if (granted) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
- [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {//麥克風(fēng)權(quán)限
- if (granted) {
- NSLog(@"Authorized");
- }else{
- NSLog(@"Denied or Restricted");
- }
- }];
定位權(quán)限
導(dǎo)入頭文件@import CoreLocation;
由于iOS8.0之后定位方法的改變,需要在info.plist中進(jìn)行配置;
檢查是否有定位權(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];//使用的時(shí)候獲取定位信息
在代理方法中查看權(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");
- }
- }];
最后一點(diǎn)
素有獲取權(quán)限的方法,多用于用戶(hù)第一次操作應(yīng)用,iOS 8.0之后,將這些設(shè)置都整合在一起,并且可以開(kāi)啟或關(guān)閉相應(yīng)的權(quán)限。所有的權(quán)限都可以通過(guò)下面的方法打開(kāi):
- [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
上述的權(quán)限多為經(jīng)常用到的權(quán)限,當(dāng)然不會(huì)很全面,大家如有需要其他的權(quán)限,可以在下方評(píng)論,我會(huì)及時(shí)加上去的。
希望這篇文章能夠給大家的開(kāi)發(fā)帶來(lái)一些便利。