iOS

[iOS] PHPicker 권한 정리

Zedd0202 2023. 12. 12. 12:12
반응형

옛날에 PHPicker관련해서 쓴 것들 왜이렇게 헷갈리지.. 

 

# 권한 필요없음

기본적으로 사진을 단순 Read하기 위해서는 사진 접근 권한이 필요없음 (= PHPicker를 띄우기 위해서는 권한이 따로 필요없음) 

PHPicker를 띄우면 왼쪽 그림처럼 안내 텍스트가 보일거고,

설정에 가면 오른족 그림처럼 비공개로 접근으로 뜰 것이다. 

 

이 앱은 사용자의 사진 보관함을 표시할 수 있지만,

오직 사용자가 선택한 항목에만 접근할 수 있습니다.


그러니까.. PHPicker를 띄웠으면 모든 사진/비디오 같은것들이 나올텐데, 이런것들에 앱(코드로)이 접근 못하고

내가 선택하고 추가한 것들에만 접근 할 수 있다는 뜻

 

암튼 이 PHPicker를 띄우고, PHPicker가 모든 Asset들을 보여주는것에 대해서는 따로 권한이 필요없다.

PHPicker에서 선택한 Asset에 대해서 접근할때도 권한 필요없음.

⚠️ 주의 : 여기서 말하는 Asset은 PHAsset이 아님!!

PHPicker에서 선택한 결과. 즉 PHPickerResult를 PHAsset으로 변환시키고 싶으면 권한이 필요함.

loadObject나 loadDataRepresentation같은것들로 접근하는 것만 가능하다. 

 

 

# 언제 권한이 필요하냐?

코드 내에서 사진첩에 있는 사진을 읽어오고 싶을 때 (PHPicker 안통하고),

사진을 추가/편집하고 싶을 때 권한이 필요하다. 

 

1. NSPhotoLibraryUsageDescription 권한 요청 메시지 추가 

2. 아래 코드를 이용하여 권한을 요청

참고) 이렇게 명시적으로 권한 요청 안해도..

let albums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil)

 뭐 이런 코드만 있어도 알아서 권한을 요청하는것을 확인했다. 

하지만 권한체크는 앞에서 꼭 해주자 

 

3. 아래와 같이 권한 요청 프롬프트가 뜬다.

오 원래 이렇게 자세하게 안나왔던 것 같은데;; 아무튼 17.1.2 인데 이렇게 나오네요.

 

# 접근 제한을 눌렀을 때

메시지가 살짝 바뀌는데,

~앱은 사용자가 선택한 항목에만 접근할 수 있습니다.

해당 앱이 사용자의 보관함에 추가하는 것은 가능합니다.

 

1. ~앱은 사용자가 선택한 항목에만 접근할 수 있습니다.

설정에 가보면 

이렇게 되어있는 것을 볼 수 있는데,

현재는 선택된 사진이 하나도 없는 상태이고,

선택된 사진 편집을 눌러서 사진들을 선택하고 해당 사진들에게만 접근 권한을 추가할 수 있다.

사진을 선택해서 완료를 누르면 저렇게 N개의 항목이 선택되었다고 나오게 된다. 

이 상태에서 앱으로 돌아가 PHPicker를 열면

이런식으로 모든 사진이 나오게 되는데..

여기서 내가 선택한 항목만 나오는거 아니었어?! 하고 헷갈릴 수 있는데, 여기서 나오는거는 다 나오되

let options = PHFetchOptions()
let albums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil)

albums.enumerateObjects { (collection, _, _) in
    let assets = self.fetchAssets(in: collection)
    ~~~
}

이런식으로 코드에서 사진첩에 접근할 때 해당 선택된 항목에만 접근할 수 있다는 것이다. 

현재 나는 이미지 1개를 접근할 수 있도록 해두었으니 

Asset들을 쫙 훑었을 때 1개만 나오는 것이다.

그리고 저 1개의 Asset을 화면에 표시하면

아까 내가 선택한 고양이가 잘 나오는 것을 볼 수 있다. 

 

2. 해당 앱이 사용자의 보관함에 추가하는 것은 가능합니다.

제한된 접근을 눌렀어도 이미지를 추가하는 것은 가능하다. 

UIImageWriteToSavedPhotosAlbum 으로 간단히 테스트해봤는데, 문제없이 추가되는 것을 확인했다. 

 

여기서 헷갈리면 안되는게

1. 코드내에서 선택된 Asset에 접근이 가능

2. PHPicker를 열었음 ➡️ 모든 Asset들이 다 나올거임 ➡️ 내가 특정 Asset을 선택함(그게 앞에서 선택한 Asset이 아닐 수 있음) ➡️ 추가 ➡️ 방금 추가한 Asset들에도 접근이 가능 

하다. 

그냥 PHPicker를 열어서 이미지를 선택하면, 권한과 상관없이 해당 Asset에 접근할 수 있다고 이해하면 가장 쉬울 것 같다. 

 

 

# 전체 접근 허용

말 그대로 모든 Asset에 대해 접근을 허용하겠다는 뜻이다. 

전체 접근을 허용하면, 코드에서 사진 보관함에 접근하여 모든 Asset들을 가져올 수 있다. 

물론 추가도 가능

 

# 허용 안함 

요것도 말그대로 허용을 아예 안하겠다는 것.

Q : 접근 제한에서 사진 아무것도 선택 안한거랑 허용안함이 뭐가다름?

접근 제한에서 아무것도 선택 안했을 때는 앨범에는 접근이 가능하다. 다만 Asset이 없다고 나올뿐.. 

허용 안함 상태에서는 앨범에도 접근이 불가하다. (아예 앨범 갯수가 0으로 나옴) 

 

허용 안함 상태에서도 헷갈리면 안되는게

PHPicker를 직접 열어서 선택한 것들에는 접근이 가능하다. 코드내에서 접근이 안될뿐.. 

 

Q : 허용안함 상태에서 이미지 추가 가능?

A : 당연히 불가! 

 


 

오랜만에 보니까 이게 권한이 필요했었나.. 싶어서 헷갈려가지고 ㅠ 정리

반응형