티스토리 뷰
안녕하세요 :) 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에 있으니 참고하세요.
✅ 참고 ✅
이건 뭐 개발 관련 내용은 아닌데...선택한 사진 편집을 설정에서도 할 수 있습니다.
설정 > 사진 권한에 가서 내가 선택한 이미지를 편집할 수 있습니다.
Edit Selected Photos를 누르면
이렇게 PHPicker가 뜨고, 내가 이전에 선택한 이미지들이 선택된 상태로 나오게 됩니다.
저는 좀 더 선택하고, 제 앱을 재실행하면 이렇게 내가 선택한 이미지들을 더 가져올 수 있게 됩니다.
또는,
아예 모든 사진에 대한 접근을 허용해버릴수도 있겠죠.
아시면 좋을 사항은,
선택한 사진에만 접근 할 수 있도록 함 -> 설정에 가서 모든 사진에 대한 권한 허용함 -> 다시 선택한 사진에만 접근 할 수 있도록 함
내가 이전에 선택한 사진들의 접근권한이 초기화되는건 아닌 것 같습니다.
All Photos에서 Selected Photos로 바꾼 뒤, Edit Selected Photos를 누르면, 내가 이전에 선택한 사진들이 나오게 됩니다.
그냥 알아두시라고,,
'iOS' 카테고리의 다른 글
ARKit ) ARSession / ARConfiguration (0) | 2020.09.23 |
---|---|
iOS ) 현재 IP 주소 가져오기. (2) | 2020.09.22 |
iOS 14+ ) Select Photos 권한 작업 (1) (6) | 2020.09.20 |
iOS ) PHImageManager의 requestImage가 두번 호출되는 이슈. (0) | 2020.09.20 |
Configuring the Back Button (3) | 2020.09.13 |
- swift3
- swift delegate
- UIBezierPath
- SwiftUI
- ios 13
- Combine
- fastlane
- IOS
- np-complete
- np-hard
- swift array
- github
- swift tutorial
- 피아노
- Accessibility
- WWDC
- actor
- 스위프트 문법
- Git
- 회고
- Xcode
- iOS delegate
- Swift
- swift sort
- FLUTTER
- 스위프트
- WidgetKit
- WKWebView
- swift 공부
- 제이슨 파싱
- Total
- Today
- Yesterday