成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS開發中的這些權限,你搞懂了嗎?

移動開發
APP開發避免不開系統權限的問題,如何在APP以更加友好的方式向用戶展示系統權限,似乎也是開發過程中值得深思的一件事;那如何提高APP獲取iOS系統權限的通過率呢?

寫在前面

APP開發避免不開系統權限的問題,如何在APP以更加友好的方式向用戶展示系統權限,似乎也是開發過程中值得深思的一件事;

iOS開發中的這些權限,你搞懂了嗎?

那如何提高APP獲取iOS系統權限的通過率呢?有以下幾種方式:

  • 在用戶打開APP時就向用戶請求權限;
  • 告知用戶授權權限后能夠獲得好處之后,再向用戶請求權限;
  • 在絕對必要的情況下才向用戶請求權限,例如:用戶訪問照片庫時請求訪問系統相冊權限;
  • 在展示系統權限的對話框前,先向用戶顯示自定義的對話框,若用戶選擇不允許,默認無操作,若用戶選擇允許,再展示系統對話框。

上述情況在開發過程中是經常遇到的,不同方式的選擇會影響最后用戶交互體驗。這一點感悟正是源于上一周工作遇到的問題:適配iOS10,如何獲取應用聯網權限用以管理系統對話框的顯示管理。當我把這個問題解決后,感覺有必要將常用的iOS系統權限做一個總結,以便后用。

權限分類

  • 聯網權限
  • 相冊權限
  • 相機、麥克風權限
  • 定位權限
  • 推送權限
  • 通訊錄權限
  • 日歷、備忘錄權限

聯網權限

引入頭文件 @import CoreTelephony;

應用啟動后,檢測應用中是否有聯網權限

  1. CTCellularData *cellularData = [[CTCellularData alloc]init]; 
  2. cellularData.cellularDataRestrictionDidUpdateNotifier =  ^(CTCellularDataRestrictedState state){ 
  3.   //獲取聯網狀態 
  4.   switch (state) { 
  5.       case kCTCellularDataRestricted: 
  6.           NSLog(@"Restricrted"); 
  7.           break; 
  8.       case kCTCellularDataNotRestricted: 
  9.           NSLog(@"Not Restricted"); 
  10.           break; 
  11.       case kCTCellularDataRestrictedStateUnknown: 
  12.           NSLog(@"Unknown"); 
  13.           break; 
  14.       default
  15.           break; 
  16.   }; 
  17. }; 

查詢應用是否有聯網功能

  1. CTCellularData *cellularData = [[CTCellularData alloc]init]; 
  2. CTCellularDataRestrictedState state = cellularData.restrictedState; 
  3.  switch (state) { 
  4.   case kCTCellularDataRestricted: 
  5.       NSLog(@"Restricrted"); 
  6.       break; 
  7.   case kCTCellularDataNotRestricted: 
  8.       NSLog(@"Not Restricted"); 
  9.       break; 
  10.   case kCTCellularDataRestrictedStateUnknown: 
  11.       NSLog(@"Unknown"); 
  12.       break; 
  13.   default
  14.       break; 

相冊權限--IOS 9.0之前

導入頭文件@import AssetsLibrary;

檢查是否有相冊權限

  1. ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; 
  2. switch (status) { 
  3.   case ALAuthorizationStatusAuthorized: 
  4.       NSLog(@"Authorized"); 
  5.       break; 
  6.   case ALAuthorizationStatusDenied: 
  7.       NSLog(@"Denied"); 
  8.       break; 
  9.   case ALAuthorizationStatusNotDetermined: 
  10.       NSLog(@"not Determined"); 
  11.       break; 
  12.   case ALAuthorizationStatusRestricted: 
  13.       NSLog(@"Restricted"); 
  14.       break; 
  15.  
  16.   default
  17.       break; 

相冊權限--IOS 8.0之后

導入頭文件@import Photos;

檢查是否有相冊權限

  1. PHAuthorizationStatus photoAuthorStatus = [PHPhotoLibrary authorizationStatus]; 
  2. switch (photoAuthorStatus) { 
  3.   case PHAuthorizationStatusAuthorized: 
  4.       NSLog(@"Authorized"); 
  5.       break; 
  6.   case PHAuthorizationStatusDenied: 
  7.       NSLog(@"Denied"); 
  8.       break; 
  9.   case PHAuthorizationStatusNotDetermined: 
  10.       NSLog(@"not Determined"); 
  11.       break; 
  12.   case PHAuthorizationStatusRestricted: 
  13.       NSLog(@"Restricted"); 
  14.       break; 
  15.   default
  16.       break; 

![Uploading 144446-b8aca7ba38c5f8c0_695906.png . . .]獲取相冊權限

  1. [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { 
  2.     if (status == PHAuthorizationStatusAuthorized) { 
  3.         NSLog(@"Authorized"); 
  4.     }else
  5.         NSLog(@"Denied or Restricted"); 
  6.     } 
  7.     }]; 

相機和麥克風權限

導入頭文件@import AVFoundation;

檢查是否有相機或麥克風權限

  1. AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];//相機權限 
  2. AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];//麥克風權限 
  3.  
  4. switch (AVstatus) { 
  5.   case AVAuthorizationStatusAuthorized: 
  6.       NSLog(@"Authorized"); 
  7.       break; 
  8.   case AVAuthorizationStatusDenied: 
  9.       NSLog(@"Denied"); 
  10.       break; 
  11.   case AVAuthorizationStatusNotDetermined: 
  12.       NSLog(@"not Determined"); 
  13.       break; 
  14.   case AVAuthorizationStatusRestricted: 
  15.       NSLog(@"Restricted"); 
  16.       break; 
  17.   default
  18.       break; 

獲取相機或麥克風權限

  1. [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {//相機權限 
  2.   if (granted) { 
  3.       NSLog(@"Authorized"); 
  4.   }else
  5.       NSLog(@"Denied or Restricted"); 
  6.   } 
  7. }]; 
  8.  
  9. [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {//麥克風權限 
  10.   if (granted) { 
  11.       NSLog(@"Authorized"); 
  12.   }else
  13.       NSLog(@"Denied or Restricted"); 
  14.   } 
  15. }]; 

定位權限

導入頭文件@import CoreLocation;

由于iOS8.0之后定位方法的改變,需要在info.plist中進行配置; 

iOS開發中的這些權限,你搞懂了嗎?

檢查是否有定位權限

  1. BOOL isLocation = [CLLocationManager locationServicesEnabled]; 
  2. if (!isLocation) { 
  3.   NSLog(@"not turn on the location"); 
  4. CLAuthorizationStatus CLstatus = [CLLocationManager authorizationStatus]; 
  5. switch (CLstatus) { 
  6.   case kCLAuthorizationStatusAuthorizedAlways: 
  7.       NSLog(@"Always Authorized"); 
  8.       break; 
  9.   case kCLAuthorizationStatusAuthorizedWhenInUse: 
  10.       NSLog(@"AuthorizedWhenInUse"); 
  11.       break; 
  12.   case kCLAuthorizationStatusDenied: 
  13.       NSLog(@"Denied"); 
  14.       break; 
  15.   case kCLAuthorizationStatusNotDetermined: 
  16.       NSLog(@"not Determined"); 
  17.       break; 
  18.   case kCLAuthorizationStatusRestricted: 
  19.       NSLog(@"Restricted"); 
  20.       break; 
  21.   default
  22.       break; 

獲取定位權限

  1. CLLocationManager *manager = [[CLLocationManager alloc] init]; 
  2. [manager requestAlwaysAuthorization];//一直獲取定位信息 
  3. [manager requestWhenInUseAuthorization];//使用的時候獲取定位信息 

在代理方法中查看權限是否改變

  1. - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{ 
  2.  switch (status) { 
  3.   case kCLAuthorizationStatusAuthorizedAlways: 
  4.       NSLog(@"Always Authorized"); 
  5.       break; 
  6.   case kCLAuthorizationStatusAuthorizedWhenInUse: 
  7.       NSLog(@"AuthorizedWhenInUse"); 
  8.       break; 
  9.   case kCLAuthorizationStatusDenied: 
  10.       NSLog(@"Denied"); 
  11.       break; 
  12.   case kCLAuthorizationStatusNotDetermined: 
  13.       NSLog(@"not Determined"); 
  14.       break; 
  15.   case kCLAuthorizationStatusRestricted: 
  16.       NSLog(@"Restricted"); 
  17.       break; 
  18.   default
  19.       break; 
  20.   } 
  21.  

推送權限

檢查是否有通訊權限

  1. UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings]; 
  2. switch (settings.types) { 
  3.   case UIUserNotificationTypeNone: 
  4.       NSLog(@"None"); 
  5.       break; 
  6.   case UIUserNotificationTypeAlert: 
  7.       NSLog(@"Alert Notification"); 
  8.       break; 
  9.   case UIUserNotificationTypeBadge: 
  10.       NSLog(@"Badge Notification"); 
  11.       break; 
  12.   case UIUserNotificationTypeSound: 
  13.       NSLog(@"sound Notification'"); 
  14.       break; 
  15.  
  16.   default
  17.       break; 

獲取推送權限

  1. UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil]; 
  2. [[UIApplication sharedApplication] registerUserNotificationSettings:setting]; 

通訊錄權限

 iOS9.0之前

導入頭文件 @import AddressBook;

檢查是否有通訊錄權限

  1. ABAuthorizationStatus ABstatus = ABAddressBookGetAuthorizationStatus(); 
  2. switch (ABstatus) { 
  3.   case kABAuthorizationStatusAuthorized: 
  4.       NSLog(@"Authorized"); 
  5.       break; 
  6.   case kABAuthorizationStatusDenied: 
  7.       NSLog(@"Denied'"); 
  8.       break; 
  9.   case kABAuthorizationStatusNotDetermined: 
  10.       NSLog(@"not Determined"); 
  11.       break; 
  12.   case kABAuthorizationStatusRestricted: 
  13.       NSLog(@"Restricted"); 
  14.       break; 
  15.   default
  16.       break; 

獲取通訊錄權限

  1. ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULLNULL); 
  2. ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
  3.   if (granted) { 
  4.       NSLog(@"Authorized"); 
  5.       CFRelease(addressBook); 
  6.   }else
  7.       NSLog(@"Denied or Restricted"); 
  8.   } 
  9. }); 

iOS9.0及以后

導入頭文件 @import Contacts;

檢查是否有通訊錄權限

  1. CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; 
  2.   switch (status) { 
  3.         case CNAuthorizationStatusAuthorized: 
  4.         { 
  5.             NSLog(@"Authorized:"); 
  6.         } 
  7.             break; 
  8.         case CNAuthorizationStatusDenied:{ 
  9.             NSLog(@"Denied"); 
  10.         } 
  11.             break; 
  12.         case CNAuthorizationStatusRestricted:{ 
  13.             NSLog(@"Restricted"); 
  14.         } 
  15.             break; 
  16.         case CNAuthorizationStatusNotDetermined:{ 
  17.              NSLog(@"NotDetermined"); 
  18.         } 
  19.             break; 
  20.  
  21.        } 

獲取通訊錄權限

  1. CNContactStore *contactStore = [[CNContactStore alloc] init]; 
  2.     [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { 
  3.         if (granted) { 
  4.  
  5.            NSLog(@"Authorized"); 
  6.  
  7.         }else
  8.  
  9.            NSLog(@"Denied or Restricted"); 
  10.         } 
  11.     }]; 

日歷、備忘錄權限

導入頭文件

檢查是否有日歷或者備忘錄權限

  1. typedef NS_ENUM(NSUInteger, EKEntityType) { 
  2.  EKEntityTypeEvent,//日歷 
  3.  EKEntityTypeReminder //備忘 
  4. }; 
  1. EKAuthorizationStatus EKstatus = [EKEventStore  authorizationStatusForEntityType:EKEntityTypeEvent]; 
  2. switch (EKstatus) { 
  3.   case EKAuthorizationStatusAuthorized: 
  4.       NSLog(@"Authorized"); 
  5.       break; 
  6.   case EKAuthorizationStatusDenied: 
  7.       NSLog(@"Denied'"); 
  8.       break; 
  9.   case EKAuthorizationStatusNotDetermined: 
  10.       NSLog(@"not Determined"); 
  11.       break; 
  12.   case EKAuthorizationStatusRestricted: 
  13.       NSLog(@"Restricted"); 
  14.       break; 
  15.   default
  16.       break; 

獲取日歷或備忘錄權限

  1. EKEventStore *store = [[EKEventStore alloc]init]; 
  2. [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) { 
  3.   if (granted) { 
  4.       NSLog(@"Authorized"); 
  5.   }else
  6.       NSLog(@"Denied or Restricted"); 
  7.   } 
  8. }]; 

 最后一點

素有獲取權限的方法,多用于用戶第一次操作應用,iOS 8.0之后,將這些設置都整合在一起,并且可以開啟或關閉相應的權限。所有的權限都可以通過下面的方法打開:

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

上述的權限多為經常用到的權限,當然不會很全面,大家如有需要其他的權限,可以在下方評論,我會及時加上去的。

希望這篇文章能夠給大家的開發帶來一些便利。

責任編輯:未麗燕 來源: 簡書
相關推薦

2024-08-12 15:23:43

LangChain

2019-08-28 08:57:05

2021-10-12 10:50:31

鴻蒙HarmonyOS應用

2020-04-14 08:46:47

Java對象編譯器

2021-10-10 20:36:49

Android Root權限

2021-01-29 17:07:26

排序算法數組

2023-06-16 14:10:00

TCPUDP網絡通信

2018-08-10 05:06:03

提速降費營運商漫游

2019-11-20 15:40:48

CPU軟件處理器

2022-05-06 09:21:21

TypeScriptinterfacetype

2024-04-07 08:23:01

JS隔離JavaScript

2011-06-14 12:56:55

SQL Server復災

2022-04-07 08:20:22

typeinterface前端

2022-06-07 08:14:35

PGPAGETUPLE

2022-11-28 07:10:57

2021-03-05 18:38:45

ESvue項目

2022-06-06 07:58:52

勒索軟件惡意軟件解密

2022-01-06 07:59:32

WebGPUOpenGL引擎

2020-06-23 10:28:30

軟件研發交付

2024-08-01 08:41:08

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲天堂一区二区 | 精品国产高清一区二区三区 | 国产亚洲一区二区三区在线观看 | 亚洲欧洲精品成人久久奇米网 | 欧美日韩精品 | 日韩免费在线 | 国产亚洲第一页 | 国产一区久久久 | 久久久这里都是精品 | 日韩欧美在 | 成人久久久 | 台湾av在线| 毛片网站在线观看 | 最新中文字幕 | 国产激情一区二区三区 | 亚洲欧美久久 | 99精彩视频 | 国产综合久久久久久鬼色 | 奇米影视77 | 请别相信他免费喜剧电影在线观看 | 337p日韩 | 亚洲国产欧美国产综合一区 | 日韩网站免费观看 | 欧美在线观看一区二区 | 久久国产一区二区三区 | 国产成人在线观看免费 | 国产精品美女久久久久久久久久久 | 国产欧美精品一区二区三区 | 97久久精品午夜一区二区 | aaa综合国产 | 蜜桃在线视频 | 中文字幕一区二区不卡 | 一区在线视频 | 欧美性吧 | 国产精品久久久久久久久久久免费看 | 可以在线看的黄色网址 | 亚洲第一福利网 | 久久综合一区 | 日韩1区2区| 日韩伦理一区二区 | 久久国产高清视频 |