clyne의 개발 기록
[Swift] 카메라/사진 권한 요청 본문
안녕하세요.
iOS 개발자 CNOO 입니다.
오늘은 Swift에서 카메라 접근, 사진 접근 권한을 얻는 방법에 대해서 알아보려고 합니다.
1. 사진 접근 권한
기기에 있는 사진을 가지고 온다거나 할 때는 사진 권한이 필요합니다.
최종적으로는 presentImagePicker 라는 함수를 호출하는것이 목표입니다.
관련 코드는 다음과 같습니다.
private func selectImage() {
if #available(iOS 14, *) {
PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
if status == .authorized || status == .limited {
self.presentImagePicker()
} else {
self.getPermission()
}
}
} else {
PHPhotoLibrary.requestAuthorization { status in
if status == .authorized {
self.presentImagePicker()
} else {
self.getPermission()
}
}
}
}
이미지를 선택하러 갈 때, 권한 여부를 먼저 체크합니다.
iOS 14는 개별 사진에 대한 권한 또는 모든 사진에 대한 권한을 얻어올 수 있는데요.
이에따라 iOS14 이상인지에 따라 분기처리합니다.
하위 코드는 권한을 얻지 못했을 때 입니다.
private func getPermission() {
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
showUnAuthorizedAlert()
return
}
showAlert("사진에 접근할 수 있도록 권한을 허용해주세요.", btn2: "설정") {
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
if !success {
self.showUnAuthorizedAlert()
}
})
} else {
self.showUnAuthorizedAlert()
}
}
}
showAlert 함수는 제가 따로 UIAlertController를 띄워주는 함수를 커스텀 한 것입니다. 원하시는대로 교체해서 넣어주시면 됩니다.
환경설정 창으로 바로 이동시켜주는 코드가 들어있고, 환경설정에서도 직접 설정하지 않는다면, 권한이 없다는 showUnAuthorizedAlert()라는 함수를 호출합니다.
private func showUnAuthorizedAlert() {
// showAlert("사진에 접근할 수 있는 권한이 없습니다.\n(설정경로: 설정 > 렛터디 > 사진)", .INFO)
}
위 함수는 상황에 맞게 잘 구현해주시면 되겠습니다!
렛터디의 경우는 UIAlertController를 띄워주고 끝내도록 구현했습니다.
2. 카메라 접근 권한
기기에서 카메라에 접근하기 위해서도 권한이 필요합니다.
기본적인 로직은 사진 접근 권한과 다르지 않습니다.
코드를 살펴보도록 하겠습니다.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized: // 카메라 접근이 이미 허용되어있음.
self.setupCaptureSession()
case .notDetermined: // 카메라 접근 요청. (처음)
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
self.setupCaptureSession()
DispatchQueue.main.async {
self.setupCameraOrientation()
}
} else {
self.getManualPermission()
}
}
case .denied: // 카메라 접근을 이전에 거절하였음.
getManualPermission()
default: // case .restricted: // 제어단말 등 각종 제한 때문에 사용자가 카메라 접근할 수 없음.
showUnAuthorizedAlert()
}
}
주석으로 작성해놓은 것을 보시면 아시겠지만, iOS에서는 맨 처음 권한을 물어보고 (notDetermined), 그 이후에는 authorized쪽 또는 .denied 쪽으로 흘러들어갑니다.
결국엔 setupCaptureSession() 메서드를 호출해서 카메라를 실행시키는 것이 목적입니다.
( 카메라를 실행시키는 것은 다음 포스팅에서 다루도록 하겠습니다)
그 외에 권한 관련된 추가 함수들은 다음 코드를 보시면 됩니다.
private func getManualPermission() {
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
showUnAuthorizedAlert()
return
}
showAlert("카메라에 접근할 수 있도록 권한을 허용해주세요.", btn2: "설정") {
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
if !success {
self.showUnAuthorizedAlert()
}
})
} else {
self.showUnAuthorizedAlert()
}
}
}
private func showUnAuthorizedAlert() {
showAlert("카메라에 접근할 수 있는 권한이 없습니다.\n(설정경로: 설정 > 렛터디 > 카메라 접근 ON)", .INFO) {
self.dismiss(animated: true)
}
}
사용자가 직접 수동으로 설정할 수 있도록 안내하는 메서드입니다.
위에서 보신 사진처럼, 환경설정 화면으로 자동 이동시켜주고, 이동할 수 없는 상황에서는 안내문구를 그려주는 것으로 마무리 하였습니다.
'iOS > Swift' 카테고리의 다른 글
[Swift] 특정 모서리만 코너 Round주기 (corner, border) (0) | 2021.04.30 |
---|---|
[Swift] 간단하게 nil을 필터링! CompactMap! (0) | 2021.04.29 |
[AVFoundation] 손전등 Torch (Flash) 사용법 (0) | 2021.04.28 |
[AVFoundation] Camera프리뷰 및 사진찍기 (기본 예제) (0) | 2021.04.27 |
[Swift] WebKit 사용법에 대하여(JS interface Native call) (0) | 2021.04.13 |