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)
    }
    1. 처음 앱 설치했을때 갤러리 접근 물어보기 (else if PHPhotoLibrary.authorizationStatus() == .notDetermined)
  • info.pilst 에서 key - value를 설정해줘함 -> 안하면 앱 등록할때 reject
    1. 갤러리 접근 허용했을 때 ( if PHPhotoLibrary.authorizationStatus() == .authorized || PHPhotoLibrary.authorizationStatus() == .limited )
    1. 갤러리 접근 허용 안했을 때 (else if PHPhotoLibrary.authorizationStatus() == .denied)
  • 중요한 점 : 3번 if else 문에서 클로저를 사용해서 다시 첫번째 if문을 돌리는데 클로저를 사용하면 메인 스레드가 아닌 다른 스레드로 if문을 돌리기 때문에 오류가난다. 그래서 DispatchQueue.main.async 를 사용해서 if 문을 실행해야한다

좋은 웹페이지 즐겨찾기