프라이버시는 애플에서 가장 강조하는 키워드 중 하나이기도 하며,
사용자의 입장에서도 앱을 사용함에 있어 자신의 개인정보가 보호되길 기대할 것이다.
그래서 위치기반 서비스가 있다면 사용자에게 위치 권한을 요청해야 하며,
카메라로 사진을 찍는 서비스가 있다고 하면 이때 역시 권한을 요청해야 할 것이다.
그런데, 앱을 개발하면서 의문이 든 부분이 있었다.
바로 사진 첨부 기능을 추가할 때 별도의 권한 요청이 필요 없었기 때문이다.
분명 사용자는 자신의 갤러리를 열어서, 여러 사진중에 선택을 할텐데
이때는 왜 갤러리 접근 권한을 요청하지 않는 것일까?
사진에 비공개 접근
프라이버시와 권한 요청에 대해 잘 모를때는 사진 첨부 기능을 위해 권한 요청을 해야 한다고 생각했다.
그리고 실제로 Info에서 다음과 같은 Privacy 항목도 있으니까 말이다.

그런데 조금 더 찾아보니 특정 iOS 버전 이후로는 읽기 권한에 대해서는 요청하지 않아도 된다는 말이 있었다!
그리고 실제로 앱을 사용할때도 다음과 같은 화면을 볼 수 있었을 것이다.


이 앱은 권한 요청을 하지 않은 앱이며, 사용자가 사진을 선택하려 했을 때 "사진에 비공개 접근" 이라는 문구가 떠있는 것을 볼 수 있었다.
그렇다면, 어떻게 이게 가능한 것일까?
PHPicker는 별도의 프로세스
iOS 14 이후로 이미지를 선택하는 새로운 방식이 등장했는데, 그게 PHPicker이다.
그리고 접근 권한에 대해 변경된 지점도 iOS14 시점인데, PHPicker의 등장과 관련이 있다고 볼 수 있다.
우리 앱에 갤러리 사진들이 뜨고, 선택한 사진이 앱에 보여지기 때문에 사용자가 보기에는 앱이 갤러리에 접근한다고 생각할 수 있다.
하지만, PHPicker가 동작하는 방식은 좀 다르다.
우리 앱의 프로세스가 있고, PHPicker는 별도의 프로세스로 동작한다.
즉, PHPicker는 out of process로 앱의 밖에서 동작한다고 생각하면 된다.
그림으로 살펴보면 다음과 같다.

그림에서 왼쪽은 우리의 앱, 그리고 오른쪽은 PHPicker의 프로세스이다.
두 프로세스는 XPC(Cross-Process Communication)라는 것으로만 소통하고,
앱은 NSItemProvider라는 배열 형태로 사용자가 선택한 이미지만 받게 된다.

이렇게 되면 우리의 앱은 사용자의 갤러리에 직접 접근하지 못하게 됨으로써, 권한요청 없이도 프라이버시 정책을 지킬 수 있게 된다.
PHPicker가 앱과 소통하는 방식
그렇다면 앱과 PHPicker는 어떤식으로 소통하는 걸까?
위에서도 설명했듯이, XPC라는 메커니즘으로만 소통하게 되는데 이에 대해 조금 더 알아보도록 하자.
https://developer.apple.com/documentation/xpc?utm_source=chatgpt.com
XPC | Apple Developer Documentation
Access a low-level interprocess communication mechanism.
developer.apple.com
공식 문서에 따르면, XPC는 서로 다른 프로세스 간 통신을 안전하게 수행하기 위한 Apple의 저수준 메커니즘으로,
앱의 안정성과 보안을 향상시키기 위해 특정 기능을 분리된 프로세스에서 수행하는 것을 목표로 하고 있다.
작동 방식은 메세지 전달 방식으로 프로세스간에 데이터를 주고 받는다.
여기서 메세지는 NSItemProvider라는 객체를 라고 보면 된다.
NSItemProvider는 한 프로세스에서 다른 프로세스로 데이터를 안전하게 전달하기 위한 컨테이너로, 실제 이미지 데이터가 아닌 이미지에 대한 "참조"와 같은 개념이다.
PHPicker는 선택된 각 사진에 대한 NSItemProvider 객체를 생성하고, 이 객체들을 배열로 묶어서 XPC를 통해 앱에 전달된다.
앱은 NSItemProvider 배열을 받고,
각 NSItemProvier에서 `loadObject(ofClass:)`라는 메서드를 사용해 실제 데이터를 비동기적으로 로드한다.

데이터를 비동기적으로 로드한다는 것은, NSItemProvider는 실제 이미지 데이터를 포함하지 않고,
앱이 요청할 때만 필요한 데이터를 로드하는 방식이라는 뜻이다.
PHPicker의 코드 흐름을 보면 다음과 같다.
let phpicker = PHPickerViewController(configuration: config)
phpicker.delegate = self
present(phpicker, animated: true)
// PHPickerViewControllerDelegate 메서드
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
// 여기서 results 배열의 각 항목이 NSItemProvider를 가지고 있음
picker.dismiss(animated: true)
// 선택된 각 항목에 대해
for result in results {
let itemProvider = result.itemProvider
// 이미지 데이터 로드 요청 (비동기)
if itemProvider.canLoadObject(ofClass: UIImage.self) {
itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
// 이미지 데이터가 이제 앱에 전달됨
if let image = image as? UIImage {
DispatchQueue.main.async {
// UI 업데이트 등의 작업
// self.selectedImage = image
}
}
}
}
}
}
이러한 구조로 PHPicker가 동작하기 때문에 추가 권한 요청 없이, 사용자가 선택한 사진에 대한 처리를 할 수 있게 된다.
물론, 단순 읽기가 아닌 어떤 사진을 갤러리에 저장하는 등의 쓰기 권한에 대해서는 권한 요청이 필요하며,
읽기 중에서도 사진의 메타데이터 중에 상세한 데이터를 가져오려고 할때는 권한이 필요할 수도 있다.
* 참고자료
https://developer.apple.com/videos/play/wwdc2020/10652/?time=90
Meet the new Photos picker - WWDC20 - Videos - Apple Developer
Let people select photos and videos to use in your app without requiring full Photo Library access. Discover how the PHPicker API for iOS...
developer.apple.com
https://developer.apple.com/documentation/xpc?utm_source=chatgpt.com
XPC | Apple Developer Documentation
Access a low-level interprocess communication mechanism.
developer.apple.com
iOS Swift: PHPickerViewController Implementation, Real-life Insights on Advantages and…
If you need to select multiple images from your photo gallery, you have the option to either design a custom picker or utilize…
medium.com
https://robusttechhouse.com/swift-phpicker-best-way-to-access-photo-and-video-data-from-photos/
SWIFT: PHPicker - Best way to access photo and video data from Photos - RobustTechHouse - Mobile App Development Singapore
SWIFT: PHPicker - Best way to access photo and video data from Photos - RobustTechHouse - Mobile App Development Singapore
robusttechhouse.com
https://mackuba.eu/2020/07/07/photo-library-changes-ios-14/?utm_source=chatgpt.com
Photo library changes in iOS 14
I’m the kind of person who cares a lot about their digital privacy. It makes me very uncomfortable when I see ads on Facebook for something I opened on another site a moment ago, and I generally don’t like it when companies are learning more about m
mackuba.eu
https://jokerpt.medium.com/using-phpickerviewcontroller-in-ios-apps-f7ddd68214ee
Using PHPickerViewController in iOS Apps
In WWDC 2020 Apple introduced PHPickerViewController a new API which allow the developers to present an user interface through which users…
jokerpt.medium.com
https://zeddios.tistory.com/1403
[iOS] PHPicker 권한 정리
옛날에 PHPicker관련해서 쓴 것들 왜이렇게 헷갈리지.. # 권한 필요없음 기본적으로 사진을 단순 Read하기 위해서는 사진 접근 권한이 필요없음 (= PHPicker를 띄우기 위해서는 권한이 따로 필요없음) P
zeddios.tistory.com
'iOS > Swift' 카테고리의 다른 글
| [iOS/Swift] 새로 등장한 접근제어자, package (0) | 2025.04.12 |
|---|---|
| [iOS/Swift] Mock과 Stup은 다르다고? - Test Double (0) | 2025.04.03 |
| [iOS/Swift] Swift의 UnitTest 살펴보기 (0) | 2025.03.31 |
| [iOS/Swift] 컴파일러 최적화 관점에서 본 Opaque Type (0) | 2025.03.28 |
| [iOS/Swift] Kingfisher를 쓰지 않고 이미지 캐싱 구현하기 - NSCache (0) | 2025.03.25 |