iOS開發(fā)-隱私權(quán)限

背景

iOS的安全機(jī)制——沙盒限制了應(yīng)用程序執(zhí)行各種操作的權(quán)限。沙盒實(shí)際就是程序的系統(tǒng)文件目錄,非代碼文件都在此保存梁剔,例如圖片驾诈、圖標(biāo)、視頻蒋川、plist文件、文本文件,每個(gè)iOS程序只能訪問(wèn)自己沙盒中的東西跟啤,訪問(wèn)其他沙盒需要權(quán)限,它相對(duì)封閉唉锌、獨(dú)立隅肥,使得iOS環(huán)境較為穩(wěn)定。
iOS系統(tǒng)自iOS7.0之后袄简,不同階段的系統(tǒng)版本的權(quán)限特征或多或少都有所差異腥放。若軟件沒(méi)有做好權(quán)限相應(yīng)的限制適配,在提交APP Store審核時(shí)會(huì)被拒絕上線绿语。例如在iOS10系統(tǒng)中秃症,如果沒(méi)有根據(jù)更新的權(quán)限要求在info.plist中進(jìn)行聲明而訪問(wèn)了隱私數(shù)據(jù),在Xcode8中打開編譯的話吕粹,會(huì)發(fā)生crash.

權(quán)限機(jī)制

Android系統(tǒng)對(duì)權(quán)限的隱私危害性進(jìn)行三級(jí)劃分种柑,分為普通權(quán)限、特殊權(quán)限匹耕、危險(xiǎn)權(quán)限聚请。而iOS系統(tǒng)沒(méi)有這些分類,基本采用第一次使用某功能就請(qǐng)求權(quán)限泌神,之后除非在隱私中關(guān)閉該應(yīng)用的該權(quán)限良漱,否則該程序?qū)⒁恢睋碛性摍?quán)限舞虱。

基礎(chǔ)知識(shí)

iOS13.1.1所有的權(quán)限:
IMG_0035.PNG

參照此圖,iOS應(yīng)用申請(qǐng)的主要權(quán)限有:

  1. 定位服務(wù)
  2. 通訊錄
  3. 日歷
  4. 提醒事項(xiàng)
  5. 照片
  6. 藍(lán)牙
  7. 麥克風(fēng)
  8. 語(yǔ)音識(shí)別(iOS10)
  9. 相機(jī)
  10. 健康(iOS8.0)
  11. Home kit(iOS8.0)
  12. 媒體與Apple Music(iOS9.0)
  13. 文件與文件夾(iOS12.0)
  14. 運(yùn)動(dòng)與健身

權(quán)限的狀態(tài):

  1. 用戶從未進(jìn)行過(guò)授權(quán)等處理母市,首次訪問(wèn)相應(yīng)內(nèi)容會(huì)提示用戶進(jìn)行授權(quán)
  2. 已授權(quán)
  3. 拒絕
  4. 應(yīng)用沒(méi)有相關(guān)權(quán)限矾兜,且當(dāng)前用戶無(wú)法改變這個(gè)權(quán)限,比如:家長(zhǎng)控制
  5. 硬件等不支持

操作:

  1. 檢查授權(quán)狀態(tài)
  2. 請(qǐng)求授權(quán)
    1577678898637_F7D7C36F-D8FE-42D3-BA2F-2107C8D03515.png

具體代碼:

  1. 定位服務(wù)
    1. 獲取狀態(tài)

       BOOL enable = [CLLocationManager locationServicesEnabled];//是否可用
       NSInteger state = [CLLocationManager authorizationStatus];//授權(quán)狀態(tài)
      
    2. 申請(qǐng)權(quán)限

       self.locationManager = [[CLLocationManager alloc] init];
       self.locationManager.delegate = self;
       [self.locationManager requestAlwaysAuthorization];
       [self.locationManager requestWhenInUseAuthorization];
      
  2. 通訊錄
    1. 獲取狀態(tài)

       CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
      
    2. 申請(qǐng)權(quán)限

       CNContactStore *contactStore = [[CNContactStore alloc] init];
       [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
       }];
      
  3. 日歷
    1. 獲取狀態(tài)

       EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
      
    2. 申請(qǐng)權(quán)限

       EKEventStore *store = [[EKEventStore alloc] init];
       [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
       }];
      
  4. 提醒事項(xiàng)
    1. 獲取狀態(tài)

       EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
      
    2. 申請(qǐng)權(quán)限

       EKEventStore *store = [[EKEventStore alloc] init];
       [store requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError * _Nullable error) {
       }];
      
  5. 照片
    1. 獲取狀態(tài)

       if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {    
           if (_isiOS8_Or_Later_) {
               PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
           } else {
               // iOS7 - iOS8
               ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
           }
       } else {
           NSLog(@"相冊(cè)不可用患久!");
       }
      
    2. 申請(qǐng)權(quán)限

       if (_isiOS8_Or_Later_) {
           [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
           }];
       } else {
           ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
           [assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
           } failureBlock:^(NSError *error) {
           }];
       }
      
  6. 藍(lán)牙
    1. 獲取狀態(tài)

       self.cbCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
       #pragma mark - CBCentralManagerDelegate
       - (void)centralManagerDidUpdateState:(CBCentralManager *)central{
           CBManagerState state = central.state;
           }
       }
      
    2. 申請(qǐng)權(quán)限

  7. 麥克風(fēng)
    1. 獲取狀態(tài)

       AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
      
    2. 申請(qǐng)權(quán)限

       [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
       }];
      
  8. 語(yǔ)音識(shí)別
    1. 獲取狀態(tài)

       SFSpeechRecognizerAuthorizationStatus status = [SFSpeechRecognizer authorizationStatus];
      
    2. 申請(qǐng)權(quán)限

       [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
       }];
      
  9. 相機(jī)
    1. 獲取狀態(tài)

       if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
           AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
       }
      
    2. 申請(qǐng)權(quán)限

       [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
       }];
      
  10. 健康
    1. 獲取狀態(tài)

       if ([HKHealthStore isHealthDataAvailable]) {
           self.healthStore = [[HKHealthStore alloc] init];
           // 以心率 HKQuantityTypeIdentifierHeartRate 為例子
           HKQuantityType *heartRateType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
           HKAuthorizationStatus status = [self.healthStore authorizationStatusForType:heartRateType];
       }else{
           NSLog(@"unavailable");
           // Health data is not avaliable on all device.
       }
      
    2. 申請(qǐng)權(quán)限

       [self.healthStore requestAuthorizationToShareTypes:typeSet readTypes:typeSet completion:^(BOOL success, NSError * _Nullable error) {
       }];
      
  11. Home Kit
    1. 獲取狀態(tài)

       self.homeManager = [[HMHomeManager alloc] init];
       self.homeManager.delegate = self;
      
       #pragma mark - HMHomeManagerDelegate
       - (void)homeManagerDidUpdateHomes:(HMHomeManager *)manager{
           if (manager.homes.count > 0) {
           }
       }
      
    2. 申請(qǐng)權(quán)限

       [manager addHomeWithName:@"Test Home" completionHandler:^(HMHome * _Nullable home, NSError * _Nullable error) {
       }];
      
  12. 媒體與Apple Music(ios(9.3))
    1. 獲取狀態(tài)

       SKCloudServiceAuthorizationStatus status = [SKCloudServiceController authorizationStatus];
      
    2. 申請(qǐng)權(quán)限

       [SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) {
       }];
      
  13. 文件與文件夾
    1. 拷貝模式:將文檔拷貝到自己項(xiàng)目中

       //打開項(xiàng)目中的info.plist椅寺,添加“Document Types”鍵值
       - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
       }
      
    2. 存儲(chǔ)模式:將文檔存儲(chǔ)到“文件”中

       //打開項(xiàng)目中的info.plist,添加“Supports Document Browser”鍵值
       UIDocumentPickerViewController * controller = [[UIDocumentPickerViewController alloc]initWithDocumentTypes:[@""] inMode:UIDocumentPickerModeOpen];
       controller.delegate = self;
       [self presentViewController:controller animated:YES completion:nil];
      
  14. 運(yùn)動(dòng)與健身
    1. 獲取狀態(tài)

       if( [CMMotionActivityManager isActivityAvailable]){
           CMAuthorizationStatus status = [CMMotionActivityManager authorizationStatus];
       }
      
    2. 申請(qǐng)權(quán)限

       self.cmManager = [[CMMotionActivityManager alloc] init];
       self.motionActivityQueue = [[NSOperationQueue alloc] init];
       [self.cmManager startActivityUpdatesToQueue:self.motionActivityQueue withHandler:^(CMMotionActivity *activity) {
       }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒋失,一起剝皮案震驚了整個(gè)濱河市返帕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篙挽,老刑警劉巖荆萤,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铣卡,居然都是意外死亡链韭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門煮落,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敞峭,“玉大人,你說(shuō)我怎么就攤上這事蝉仇⌒铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵轿衔,是天一觀的道長(zhǎng)沉迹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)呀枢,這世上最難降的妖魔是什么胚股? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮裙秋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缨伊。我一直安慰自己摘刑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布刻坊。 她就那樣靜靜地躺著枷恕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谭胚。 梳的紋絲不亂的頭發(fā)上徐块,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天未玻,我揣著相機(jī)與錄音,去河邊找鬼胡控。 笑死扳剿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昼激。 我是一名探鬼主播庇绽,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼橙困!你這毒婦竟也來(lái)了瞧掺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凡傅,失蹤者是張志新(化名)和其女友劉穎辟狈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夏跷,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼转,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拓春。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片释簿。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖硼莽,靈堂內(nèi)的尸體忽然破棺而出庶溶,到底是詐尸還是另有隱情,我是刑警寧澤懂鸵,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布偏螺,位于F島的核電站,受9級(jí)特大地震影響匆光,放射性物質(zhì)發(fā)生泄漏套像。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一终息、第九天 我趴在偏房一處隱蔽的房頂上張望夺巩。 院中可真熱鬧,春花似錦周崭、人聲如沸柳譬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)美澳。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間制跟,已是汗流浹背舅桩。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雨膨,地道東北人擂涛。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哥放,于是被迫代替她去往敵國(guó)和親歼指。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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