개인정보 보안의 진심인 애플인 만큼, 앱에서 카메라,마이크,앨범 등을 사용할 때는 항상
사용자의 의사를 묻고 직접 권한 허용을 받아야 한다.
플로우는 사실상 같기 때문에 Objective-C 환경에서 카메라, 앨범 권한 요청에 대해서 다뤄보려고 한다.
1. InfoList 추가
InfoList에 권한을 추가해야 하는 요소를 추가하지 않으면, 크래시가 나기 때문에 먼저 추가해주자. 꼭!
Info 파일에 들어가서 Information Property List에 마우스를 가져가면 +버튼이 뜨는데, 해당 버튼을 통해 추가할 수 있다.
검색 기능도 제공되기 때문에 Privacy를 치면 아래 요소를 빠르게 찾을 수 있다.
우측 String칸에 원하는 문구를 작성하면,
'App'이(가) 카메라에 접근하려고 합니다.
-- 작성한 문구 --
허용 안 함 / 허용
와 같이 권한 허용 팝업에 문구가 표시된다.
2. 권한 허용 상태 확인
내부적으로 허용 상태를 변수로 관리할 수도 있지만, 기본 API를 통해 권한 허용 상태를 확인할 수 있다.
예시 코드는 뷰컨트롤러 단일 m 파일에서 작성하는 가정이며,
카메라 권한 요청을 위해서는 AVFoundation 헤더파일을 , 앨범 권한 요청을 위해서는 Photos 헤더파일을 임포트 해준다.
#import "ViewController.h"
//카메라
#import <AVFoundation/AVFoundation.h>
//앨범
#import <Photos/Photos.h>
카메라 권한 허용 상태
카메라 권한 허용 상태는 총 4가지 종류가 있기 때문에 switch문으로 분기처리 해주면 깔끔하다.
- (void)checkCameraPermission {
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
switch (status) {
case AVAuthorizationStatusAuthorized:
NSLog(@"카메라 권한 부여됨");
break;
case AVAuthorizationStatusDenied:
// 거부된 경우 설정으로 이동해 허용하도록 팝업 띄우기
[self showPermissionAlert];
case AVAuthorizationStatusRestricted:
// 권한이 제한되어있어 온전한 권한 요청이 필요한 경우
[self showPermissionAlert];
break;
case AVAuthorizationStatusNotDetermined:
// 허용/거부 결정을 하지 않은 경우
[self requestCameraPermission];
break;
}
}
앨범 권한 허용 상태
- (void) checkAlbumPermission {
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
switch (status) {
case PHAutorizationStatusNotDetermined:
[self requestAlbumPermission];
break;
case PHAutorizationStatusRestricted:
//시스템 등에 의해 제한된 경우. 직접 설정 불가능
break;
case PHAutorizationStatusDenied:
[self showPermissionAlert];
break;
case PHAutorizationStatusAuthorized:
NSLog(@"앨범 권한 허용됨");
break;
case PHAutorizationStatusLimited:
[self showPermissionAlert];
break;
}
}
3. 권한 요청 팝업
앱 초기 진입 등, 권한 요청을 위한 팝업 알럿을 띄워야 한다.
미리 지정해 놓은 안내문과 함께 해당 앱에서 어떤 권한을 요청하는지에 대한 정보가 제공되고
유저는 허용 안 함/ 허용 중 선택할 수 있다.
다만 여기서 권한 허용을 안 했을 경우, 이후에 다시 권한을 허용하려면 반드시 기본 설정 앱을 통해서 진행해야 한다.
앱 내부적으로 권한을 재허용 하는 것이 애플의 보안정책상 불가능 해서 그렇다고 한다.
따라서 아래 예시 코드에서는 권한 허용을 하지 않는 경우, 바로 설정 앱으로 이동할 수 있는 알럿을 띄우게 되어있다.
카메라 권한 요청
- (void)requestCameraPermission {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
dispatch_async(dispatch_get_main_queue(), ^{
if (!granted) {
[self showPermissionAlert];
}
});
}];
}
앨범 권한 요청
- (void)requestPhotoLibraryPermission {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
if (status != PHAuthorizationStatusAuthorized) {
[self showPermissionAlert];
}
});
}];
}
4. 설정으로 이동
다행히도 설정 앱으로 리디렉션 되는것은 쉽게 구현 가능하다.
- (void)showPermissionAlert {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"권한 요청" message:@"권한을 허용해야 앱을 사용할 수 있습니다. 설정으로 이동해 권한을 변경해 주세요." preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"설정으로 이동" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// 설정으로 이동
NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsURL options:@{} completionHandler:nil];
}]];
[self presentViewController:alertController animated:YES completion:nil];
}
위 메서드를 통해 유저가 설정 앱으로 이동하게 한 뒤 직접 사진과 카메라 등의 권한을 조정할 수 있도록 한다.
'UIKit > UIKit' 카테고리의 다른 글
Objective-C 암호화(AES/RSA), 해시(Hash) (0) | 2024.06.05 |
---|---|
Objective-C 생체 인증(Bio Authentication) (0) | 2024.06.04 |
Objective-C 코드 베이스 세팅 (0) | 2024.06.04 |
init(frame:) & init(coder:) (0) | 2023.04.11 |
DequeueReusableCell ?? 테이블뷰와 셀 (0) | 2023.02.28 |