友好訪問許可權篇:訪問語音、相簿、通訊錄----iOS
我們經常使用到iOS訪問相簿、語音等一些許可權,當使用者使用到此功能時就給出彈出框,iOS預設第一次訪問時會自動去請求系統許可權。如果沒有其他互動貌似可以符合我們的要求。但當我們有互動,比如點選錄音我們自己有介面互動。
所以我們需要在點選時獲取使用者許可權狀態,然後再根據狀態值去判斷我們相應操作。是需要彈出使用者允許許可權,還是需要通知到設定中開啟許可權,還是已經允許直接給出我們程式碼互動邏輯。
1,在plist檔案設定許可權
Privacy - Microphone Usage Description:設定麥克風許可權
Privacy - Photo Library Additions Usage Description:設定儲存圖片到相簿許可權
Privacy - Photo Library Usage Description:設定訪問相簿許可權
Privacy - Camera Usage Description:開啟相機許可權
Privacy - Contacts Usage Description:設定通訊錄許可權
或者設定開啟plist——> Source Code新增
`<string>需要拍照上傳圖片資訊,是否允許開啟相機?</string>
<key>NSFaceIDUsageDescription</key>
<string>需要您的同意才能訪問Face ID</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>拍照會獲取您的地理位置按地理資訊分類照片</string>
<key>NSMicrophoneUsageDescription</key>
<string>請求訪問麥克風</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>儲存圖片</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要新增圖片,是否允許開啟相簿</string>
<key>NSContactsUsageDescription</key>
<string>訪問通訊錄</string>`
2,程式碼邏輯編寫。
獲取訪問相簿許可權匯入#import <Photos/Photos.h>
// 詢問 相簿許可權
- (void)getPhotoLibrary:(void(^)(BOOL))result {
/// 獲取當前的狀態
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized) {
result(YES);
return;
}
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
result(NO); //無許可權
return ;
}
if (status == PHAuthorizationStatusNotDetermined) {
[self getPhotoLibrary];
;
}
}
- (void)getPhotoLibrary{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
NSLog(@"%@",[NSThread currentThread]);
dispatch_async(dispatch_get_main_queue(), ^{
});
}];
}
- (void)goset{
NSString *message = @"無法訪問相簿,請在設定中開啟訪問相簿許可權";
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去設定", nil];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) { // 去設定介面,開啟相機訪問許可權
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}
訪問麥克風許可權,匯入#import<AVFoundation/AVFoundation.h>
- (void) checkAudioStatus{
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
switch (authStatus) {
case AVAuthorizationStatusNotDetermined:
[self getAVMediaTypeAudio];
break;
case AVAuthorizationStatusRestricted:
[self goset];
break;
case AVAuthorizationStatusDenied:
[self goset];
break;
case AVAuthorizationStatusAuthorized:
// 已授權做自己的事;
break;
default:
break;
}
}
- (void)getAVMediaTypeAudio{
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
dispatch_async(dispatch_get_main_queue(), ^{
});
}];
}
- (void)goset{
NSString *message = @"無法錄音,請在設定中開啟麥克風訪問許可權";
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去設定", nil];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) { // 去設定介面,開啟麥克風訪問許可權
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}
獲取通訊錄許可權:iOS9之後ContactsUI代替了AddressBookUI,Contacts代替了AddressBook。匯入#import <ContactsUI/ContactsUI.h>
#pragma mark 請求通訊錄許可權
- (void)requestAuthorizationForAddressBook{
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusNotDetermined) { //使用者沒有設定
// 獲取許可權
[self getAddressBook];
}
else if(status == CNAuthorizationStatusRestricted ||status == CNAuthorizationStatusDenied){//彈出提示
[self goset];
}
else if (status == CNAuthorizationStatusAuthorized){//已經授權
//做自己的事情
}
}
- (void)getAddressBook{
//請求通訊錄許可權
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError* _Nullable error) {
if (error) {
NSLog(@"授權失敗");
}else {
NSLog(@"成功授權");
}
}];
}
- (void)goset{
NSString *message = @"無法訪問通訊錄,請在設定中開啟通訊錄訪問許可權";
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去設定", nil];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) { // 去設定介面,開啟通訊錄訪問許可權
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}
其他許可權類似,就不一一寫出來了。如果大家有什麼更好的方式,歡迎留言,謝謝。
相關文章
- 採坑之Android手機訪問相簿許可權問題Android
- Java 訪問許可權控制(6)Java訪問許可權
- public, private, protected 訪問許可權訪問許可權
- mongoDB 3.0 安全許可權訪問MongoDB
- 17-成員訪問許可權訪問許可權
- 使用nginx控制ElasticSearch訪問許可權NginxElasticsearch訪問許可權
- kubernetes實戰篇之Dashboard的訪問許可權限制訪問許可權
- Ubuntu共享資料夾訪問許可權問題Ubuntu訪問許可權
- 005.OpenShift訪問控制-許可權-角色
- win10老跳出訪問許可權怎麼辦_win10訪問許可權怎麼關閉Win10訪問許可權
- 如何在 Linux 中配置 sudo 訪問許可權Linux訪問許可權
- win共享檔案沒有許可權訪問怎麼辦 win10共享檔案許可權訪問的方法Win10
- 論Java訪問許可權控制的重要性Java訪問許可權
- postgresql關於訪問檢視需要的許可權SQL
- Quarkus中基於角色的許可權訪問控制教程
- 淺析Windows的訪問許可權檢查機制Windows訪問許可權
- C++中封裝和繼承的訪問許可權C++封裝繼承訪問許可權
- Flask: WinError 10013 以一種訪問許可權不允許的方式做了一個訪問套接字的嘗試FlaskError訪問許可權
- ipv4和ipv6無網路訪問許可權 ipv4連線正常ipv6無網路訪問許可權訪問許可權
- Solidity語言學習筆記————21、函式的訪問許可權和可見性Solid筆記函式訪問許可權
- [BUG反饋]許可權管理 -> 訪問授權 點選後報錯
- ubuntu 開放root使用者的SSH訪問許可權Ubuntu訪問許可權
- Java入門筆記(六)——訪問許可權修飾符Java筆記訪問許可權
- java基礎(八)—–深入解析java四種訪問許可權Java訪問許可權
- java基礎(七) java四種訪問許可權深入解析Java訪問許可權
- 一文讀懂 TKE 及 Kubernetes 訪問許可權控制訪問許可權
- win10無internet訪問怎麼辦_win10無internet訪問許可權如何修復Win10訪問許可權
- win10ipv6無網路訪問許可權怎麼辦_w10ipv6無網路訪問許可權的解決步驟Win10訪問許可權
- win10區域網你沒有許可權訪問怎麼辦 win10訪問區域網提示沒有許可權如何解決Win10
- mysql-v8.x設定許可權可以遠端訪問MySql
- ClickHouse學習系列之六【訪問許可權和賬戶管理】訪問許可權
- Docker構建的tomcat工程上傳檔案,訪問報403許可權問題DockerTomcat
- win10系統共享資料夾無法訪問提示“你沒有許可權訪問”如何解決Win10
- 谷歌VirusTotal開源元件曝高危漏洞,可獲取內網訪問許可權谷歌Rust元件內網訪問許可權
- 跨源通訊、跨域訪問跨域
- 訪問許可權控制系統|全方位認識 mysql 系統庫訪問許可權MySql
- jCasbin: 強大的訪問控制、許可權管理框架,支援 ACL, RBAC, ABAC框架
- 釋出文章中的 EditorForAdmin外掛 訪問許可權如何設定訪問許可權