Swift 앱에서 갤러리 띄우기 PHPickerViewController, 권한 물어보기, 권한 설정으로 가기(alert 닫기, 설정으로 이동)
- 갤러리 띄우기
import PhotosUI
// .authorized: 승인됐다, .denied: 거부, .limited: 선택한 몇개, .notDetermined: 아예 물어보지 않은 상태, .restructed: 특정한 상황이 생겨서 권한이 없어진 상태
if PHPhotoLibrary.authorizationStatus() == .authorized || PHPhotoLibrary.authorizationStatus() == .limited {
//1. 허용된 상태
DispatchQueue.main.async {
self.showGallery()
}
}else if PHPhotoLibrary.authorizationStatus() == .denied{
//2. 허용안된 상태
DispatchQueue.main.async {
self.showAuthorizationAlert()
}
} else if PHPhotoLibrary.authorizationStatus() == .notDetermined{
//3. notdetermined: 물어보지 않은 상태
//info.plist에서 설정
PHPhotoLibrary.requestAuthorization { status in
//클로저 상태안에서 호출하면 쓰레드가 하나 생기는데 이쓰레드에서 checkPermission 호출하면 오류가 난다 그래서 dispatchqueue.main.async로 해야된다
self.checkPermission()
}
}
}
//1. 갤러리 띄우기
func showGallery(){
//shared(): 싱글톤
let library = PHPhotoLibrary.shared()
var configuration = PHPickerConfiguration(photoLibrary: library)
//0: 무제한
configuration.selectionLimit = 10
var picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
present(picker, animated: true, completion: nil)
}
//2. denied시 alert 띄우고 어플 설정으로 이동
func showAuthorizationAlert() {
//허용안된 상태
//alert 띄우기
let alert = UIAlertController(title: "포토라이브러리 접근 권한을 활성화해주세요.", message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "닫기", style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: "설정으로 가기", style: .default, handler: { action in
//갤러리 접근 권한이 없으면 내 앱에대한 설정으로 이동 코드
guard let url = URL(string: UIApplication.openSettingsURLString) else {
return
}
//열릴수 있나
if UIApplication.shared.canOpenURL(url){
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}))
self.present(alert, animated: true, completion: nil)
}
- 처음 앱 설치했을때 갤러리 접근 물어보기 (else if PHPhotoLibrary.authorizationStatus() == .notDetermined)
- 처음 앱 설치했을때 갤러리 접근 물어보기 (else if PHPhotoLibrary.authorizationStatus() == .notDetermined)
- info.pilst 에서 key - value를 설정해줘함 -> 안하면 앱 등록할때 reject
- 갤러리 접근 허용했을 때 ( if PHPhotoLibrary.authorizationStatus() == .authorized || PHPhotoLibrary.authorizationStatus() == .limited )
- 갤러리 접근 허용했을 때 ( if PHPhotoLibrary.authorizationStatus() == .authorized || PHPhotoLibrary.authorizationStatus() == .limited )
- 갤러리 접근 허용 안했을 때 (else if PHPhotoLibrary.authorizationStatus() == .denied)
- 갤러리 접근 허용 안했을 때 (else if PHPhotoLibrary.authorizationStatus() == .denied)
- 중요한 점 : 3번 if else 문에서 클로저를 사용해서 다시 첫번째 if문을 돌리는데 클로저를 사용하면 메인 스레드가 아닌 다른 스레드로 if문을 돌리기 때문에 오류가난다. 그래서 DispatchQueue.main.async 를 사용해서 if 문을 실행해야한다
Author And Source
이 문제에 관하여(Swift 앱에서 갤러리 띄우기 PHPickerViewController, 권한 물어보기, 권한 설정으로 가기(alert 닫기, 설정으로 이동)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimjk3381/Swift-앱에서-갤러리-띄우기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)