- 갤러리 띄우기
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 문을 실행해야한다
'앱 > iOS(Swift)' 카테고리의 다른 글
[Swift] ViewController 가져오는법 (0) | 2022.01.13 |
---|---|
[Swift] SceneDelegate 를 이용한 Window statusBar 접근법 (0) | 2022.01.13 |
[Swift] CoreData CRUD (0) | 2022.01.13 |
[Swift] 데이터 ViewController간 넘겨주는방법 (0) | 2022.01.13 |
[CS] struct, class, enum (0) | 2022.01.13 |
댓글