iOS Swift/개발 이모저모

[권한]앨범 접근 권한 여부 확인하고 바로 후처리

호두빵 2022. 12. 22. 16:42

  @objc func pickImage(){
        if albumAccess(){
            chooseAlbumMethod()
        } else {
            let status = PHPhotoLibrary.authorizationStatus()
            if status == .notDetermined {
                PHPhotoLibrary.requestAuthorization{status in
                    switch status {
                    case .authorized, .limited :
                        print("album access allowed")
                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){
                            self.chooseAlbumMethod()
                        }
                    case .denied, .restricted :
                        print("album access not allowed")
                    case .notDetermined :
                        print("album access not determined")
                    @unknown default:
                        print("albmum access default")
                    }
                }
            } else if status == .denied {
                goToSettingsAlert(title: "ALBUM_RESTRICTED".localized(), message: "ALBUM_RESTRICTED_MSG".localized())
            }
        }
    }
    
    func albumAccess() -> Bool{
        let status = PHPhotoLibrary.authorizationStatus()
        if status == PHAuthorizationStatus.authorized {
            return true
        } else {
            return false
        }
    }

별로 어렵지 않다고 생각하고 대수롭지 않게 여겼으나 제가 한 가지 간과한 부분이 있었습니다. 저의 시나리오라면, 사용자가 앱에서 처음으로 프로필 사진을 바꾸려고 했을때 그 때 최초로 앨범 사용 권한을 줄것인지를 물어볼것입니다. 안타깝게도 사용자가 no를 했습니다. 그러나 괜찮습니다. 저는 그 후로 끈질기게 계속 설정에서 권한 안 줄거냐고 alert창을 띄울것이니까요... 문제는 사용자가 권한을 주고 나서도 설정에서 권한 주지 않을래? alert창이 계속 뜬다는 것이였습니다. (이상한 코드 때문에...) 난 분명히 허락했는데 계속 허락해달라고 하면 기분이 좋진 않겠죠.... 그래서 위와 같이 코드를 조금 바꿔봤습니다. 사용자가 프로필 편집을 시작하기 전에 먼저 albumAccess를 통해 authorizationStatus값을 받아옵니다. 여기서는 매우 단순하게 authorized 상태이면 true, 아니면 false입니다. 여기서 true값을 전달한 경우에는  예상했던 것처럼 앨범에서 이미지를 선택하는 뷰컨트롤러로 빠르게 넘어갑니다.

 

만약 false값이라면 어떻게 진행이 될까요? 저는 위에서 authorized가 아닌 경우에는 모조리 false 처리를 했습니다. 그말인 즉슨 아직 권한을 줄지 말지 모르는...이 기능을 처음 쓰는 사용자의 경우에도 false값을 날려버리는 것이죠. 그렇다면 그들에게 선택의 기회를 어떻게 줘야할까요? 다행히도 .authorized와 .denied의 이분법적인 세계가 아니였습니다. .undetermined인 경우에는 다시 한 번 권한을 주시겠습니까? 물어보고 진행을 할 수 있겠습니다. 만약 이전에 사용자가 거부를 한 상태라면 .denied로 분기되어서 설정에 가서 권한을 허용해주겠어요? ^^ 하고 다시 친절하게 물어보는 alert창을 띄우게 되겠죠. 사실 적어놓고 나니까 별 것 아닌 코드인데 이런 저런 경우의 수를 생각하다보니 한 시간 정도 시간을 잡아먹었기에 블로그에 기록을 남겨봅니다.