APP開發(fā)避免不開系統(tǒng)權(quán)限的問題函荣,如何在APP以更加友好的方式向用戶展示系統(tǒng)權(quán)限豁翎,似乎也是開發(fā)過程中值得深思的一件事吱窝;
那如何提高APP獲取iOS系統(tǒng)權(quán)限的通過率呢锁蠕?有以下幾種方式:1.在用戶打開APP時就向用戶請求權(quán)限;2.告知用戶授權(quán)權(quán)限后能夠獲得好處之后蒿辙,再向用戶請求權(quán)限拇泛;3.在絕對必要的情況下才向用戶請求權(quán)限,例如:用戶訪問照片庫時請求訪問系統(tǒng)相冊權(quán)限思灌;4.在展示系統(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)限
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)限
導(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");
}
});
日歷玩祟、備忘錄權(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");
}
}];