티스토리 뷰

iOS

iOS 14+ ) Select Photos 권한 작업 (2)

Zedd0202 2020. 9. 20. 20:13
반응형

 

안녕하세요 :) Zedd입니다.

iOS 14+ ) Select Photos 권한 작업 (1)에서

여기까지 했습니다.

자 앱을 껐다 켜고, 다시 Add버튼을 눌러보겠습니다.

그럼 이미지를 더 선택할래? 아니면 지금 선택을 유지할래 라는 alert이 뜹니다.

(한국어로는  "더 많은 사진 선택" / "현재 선택 항목 유지")

더 많은 사진을 선택하겠다고 하면 다시 PHPicker를 열어줍니다.

 

⚠️

참고로 AddButton을 누를때 마다 저 alert이 뜨는게 아닙니다.

앱이 종료되고 첫!!! 실행!!!! 일 때 위 alert이 뜨게 됩니다.

⚠️

 

더 선택하고 Done을 누르겠습니다

하지만 지금까지의 코드로는 Done을 눌러도 CollectionView가 업데이트가 안됩니다.

이유는 다음과 같습니다.

1. 아예 앱을 처음 실행 && Add버튼 누름 ➞ 사진 권한 요청 alert이 뜸 ➞ 선택한 사진만 접근 권한 허용 ➞ PHPicker뜸 ➞ 사진 선택 ➞ PHPicker의 Done을 누름 ➞ requestPHPhotoLibraryAuthorization의 completion이 불림

2. 두번째 실행 && AddButton누름 ➞ 현재 상태가 limited로 이미 권한 설정이 끝난 상태 ➞ requestPHPhotoLibraryAuthorization에서 completion이 불림 ➞ 너 더 많은 사진 선택할래?의 변경사항이 반영되지 않음. 

@objc
func addButtonDidTap() {
    self.requestPHPhotoLibraryAuthorization {
        self.getCanAccessImages()
    }
}

func requestPHPhotoLibraryAuthorization(completion: @escaping () -> Void) {
    PHPhotoLibrary.requestAuthorization(for: .readWrite) { (status) in
        switch status {
        case .limited:
            completion()
        case .authorized:
            completion()
        default:
            break
        }
    }
}

이해가셨나요? 두번째 실행에서 내가 이미 limited상태이기 때문에 바로 completion이 불리게 되는거에요.

이 alert이 뜬 상황이면 completion이 전부 불린 상황이라는거죠. 

Done을 눌러봐야 반영이 안되는건 당연해요.

그럼 지금 필요한건 이거죠. 

 

Q : 아 내가 지금 접근 가능한 사진들을 변경했는데..이 변경사항을 감지했으면 좋겠다.

A : PHPhotoLibraryChangeObserver로 가능합니다.

class ViewController: UIViewController, PHPhotoLibraryChangeObserver {

	override func viewDidLoad() {
        super.viewDidLoad()
        ..
        PHPhotoLibrary.shared().register(self)
    }
    
    func photoLibraryDidChange(_ changeInstance: PHChange) {
        // code
    }
}

코드입니다. 

PHPhotoLibraryChangeObserver는 프로토콜이고,

photoLibraryDidChange라는 required method가 있습니다.

ViewController를 PHPhotoLibrary에 등록해주는것 잊지마세요!!!!

뭔 변경사항이 생기면 photoLibraryDidChange가 불리게 되는거죠. 

class ViewController: UIViewController, PHPhotoLibraryChangeObserver {

	func requestPHPhotoLibraryAuthorization(completion: @escaping () -> Void) {
        PHPhotoLibrary.requestAuthorization(for: .readWrite) { (status) in
            switch status {
            case .limited:
                PHPhotoLibrary.shared().register(self) ✅
                completion()
            case .authorized:
                completion()
            default:
                break
            }
        }
    }
    
    func photoLibraryDidChange(_ changeInstance: PHChange) {
        self.getCanAccessImages()
    }
}

이렇게 해주겠습니다.

(limited case안에 register를 해준 이유는..viewDidLoad에서 하면 바로 alert이 뜨더라구요.

그래서 걍 저기서 해줌)

이렇게 되게 됩니다.

 

⚠️ 주의 ⚠️

@objc
func addButtonDidTap() {
    self.requestPHPhotoLibraryAuthorization {
        self.getCanAccessImages() ✅
    }
}

func requestPHPhotoLibraryAuthorization(completion: @escaping () -> Void) {
    PHPhotoLibrary.requestAuthorization(for: .readWrite) { (status) in
        switch status {
        case .limited:
            completion()
        case .authorized:
            completion()
        default:
            break
        }
    }
}

func photoLibraryDidChange(_ changeInstance: PHChange) {
    self.getCanAccessImages() ✅
}

지금 getCanAccessImages메소드 호출을 auth확인하고 나서도 호출하고,

사진 더 선택할래?하고 불리는 photoLibraryDidChange에서도 해주고 있습니다.

여기서 착각하시면 안되는게...photoLibraryDidChange는 사진 더 선택할래?에서만 불리는게 아니라!!!!!!!!!!!!!!!!!

처음 앱 깔고 그냥 사진 선택 alert ➞ 사진 선택 ➞ photoLibraryDidChange이 불립니다. 

그럼 photoLibraryDidChange에서만 getCanAccessImages를 호출해주면 되는거 아니야..? 

그건 안됩니다..!! 더 많은 사진 선택 alert은 fetchAsset메소드로 인해 나타내지는 것 같아요..!!! 

이건 추측입니다ㅠ requestPHPhotoLibraryAuthorization안에서 getCanAccessImages를 호출안하면

alert이 뜨질 않아요..

 

Q : 이 alert이 뜨는게 싫다

A : info.plist에 가셔서 PHPhotoLibraryPreventAutomaticLimitedAccessAlert를 YES로 지정하면 됩니다.

 

Q : 내가 임의로 PHPicker를 띄우고 싶다

A : 

import PhotosUI

 @objc
 func addButtonDidTap() {
 	PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: self)
 }

이렇게 하시면 됩니다.

내가 선택한 사진들 다 체크표시 되어있고..똑같습니다. 

 

최종 코드는 github에 있으니 참고하세요.

 

Zedd0202/iOS14_Photos_limited_authorization

Contribute to Zedd0202/iOS14_Photos_limited_authorization development by creating an account on GitHub.

github.com

 

✅ 참고 ✅

이건 뭐 개발 관련 내용은 아닌데...선택한 사진 편집을 설정에서도 할 수 있습니다.

설정 > 사진 권한에 가서 내가 선택한 이미지를 편집할 수 있습니다.

Edit Selected Photos를 누르면

이렇게 PHPicker가 뜨고, 내가 이전에 선택한 이미지들이 선택된 상태로 나오게 됩니다. 

저는 좀 더 선택하고, 제 앱을 재실행하면 이렇게 내가 선택한 이미지들을 더 가져올 수 있게 됩니다. 

또는, 

아예 모든 사진에 대한 접근을 허용해버릴수도 있겠죠.

 

아시면 좋을 사항은, 

선택한 사진에만 접근 할 수 있도록 함 -> 설정에 가서 모든 사진에 대한 권한 허용함 -> 다시 선택한 사진에만 접근 할 수 있도록 함 

내가 이전에 선택한 사진들의 접근권한이 초기화되는건 아닌 것 같습니다.

All Photos에서 Selected Photos로 바꾼 뒤, Edit Selected Photos를 누르면, 내가 이전에 선택한 사진들이 나오게 됩니다.

그냥 알아두시라고,,

반응형