30일차 수업 내용을 정리한 글입니다.
Learned
미디어 선택 UI
1) UIImagePickerController (iOS 14 이전)
- 사진 및 동영상 촬영, 유저의 갤러리에서 미디어를 선택하기 위해 제공되는 컨트롤러
- UINavigationController를 상속받고 있음.
- 컨트롤러의 소스 타입에 따라 컨트롤러의 역할과 모습이 다르다.
- UIImagePickerController.SourceType
- .camera : 사진 및 동영상 촬영
- .photoLibrary, .savedPhotoAlbum : 갤러리에서 미디어 선택
isSourceTypeAvailable(_:) 를 통해 디바이스에서 선택한 소스를 사용 가능한지 확인할 수 있다.
- iOS 14 이상 버전부터 갤러리에서 미디어를 선택하는 컨트롤러로
PHPickerViewController 사용을 권장함.
2) PHPickerViewController (iOS 14 이후)
- UIViewController를 상속받고 있으며 UIImagePickerController의 미디어 선택 기능에
다중 선택, 미디어 필터, 라이브 포토의 기능이 추가됨. - 앱 프로세스와 별개로 실행되기 때문에 앱에서 라이브러리 접근 요청을 할 필요가 없음.
extension ViewController: PHPickerViewControllerDelegate {
// 선택한 이미지를 뷰에 보여주는 코드
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
self.dismiss(animated: true)
let itemProvider = results.first?.itemProvider
if let _ = itemProvider?.canLoadObject(ofClass: UIImage.self) {
itemProvider?.loadObject(ofClass: UIImage.self) { image, error in
if let image = image as? UIImage {
DispatchQueue.main.async {
self.imageView.image = image
}
}
}
}
}
}
서버로 파일 전송하기 (HTTP)
1) 개요
- 이미지나 동영상같은 바이너리 파일은 네트워크로 전송될 때 텍스트 형태로 인코딩됨.
- 인코딩된 파일을 HTTP 바디에 포함하여 서버로 전송하는데 이때 사용되는 포맷이 MIME임.
2) Content-Type
- 전송되는 파일의 타입을 HTTP 헤더에 포함시켜 명시하기 위해 사용함.
- Content-Type 헤더에 파일의 타입을 설정할 때 MIME 타입을 사용함.
- 만약 jpg 이미지 파일을 전송한다면 "Content-Type: image/jpg" 로 헤더에 명시함.
- 여러 파일을 서버로 전송하는 경우 단일 타입으로 명시하기 어렵기 때문에
multipart/form-data 로 타입을 설정함.
3) MIME (Multipurpose Internet Mail Extension)
- 본래 SMTP 프로토콜로 이메일을 전송할 때 사용하는 포맷이지만
HTTP 프로토콜의 기본 구성 요소이다. - HTTP 메시지에서 Content-Type을 명시할 때 MIME 타입을 사용함.
- 서버에 파일을 업로드할 때 MIME 타입을 명시해주는 것이 좋음.
- MIME에 포함된 개별 타입들
text | 텍스트를 포함하는 모든 문서를 나타내며 이론상으로는 인간이 읽을 수 있어야 합니다 | text/plain, text/html, text/css, text/javascript |
image | 모든 종류의 이미지를 나타냅니다. (animated gif처럼) 애니메이션되는 이미지가 이미지 타입에 포함되긴 하지만, 비디오는 포함되지 않습니다. | image/gif, image/png, image/jpeg, image/bmp, image/webp |
audio | 모든 종류의 오디오 파일들을 나타냅니다. | audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav |
video | 모든 종류의 비디오 파일들을 나타냅니다. | video/webm, video/ogg |
application | 모든 종류의 이진 데이터를 나타냅니다. | application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf |
mutipart 타입
멀티파트 타입은 몇 개의 다른 개별 MIME 타입을 가지는 파트들이 합성된 문서를 나타낼 때 사용한다.
HTTP 메시지에서 개별적인 각 파트는 자체적으로 HTTP 헤더를 가지며 boundary로 구분된다.
Content-Type: multipart/form-data; boundary=aBoundaryString
(other headers associated with the multipart document as a whole)
--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"
기타
- UIImagePickerController와 비슷한 기능을 하는 라이브러리
YPImagePicker, TLPhotoPicker 등 - 프로젝트에 포함된 라이브러리에서 접근할 수 있는 모든 사용자의 민감한 정보에 대해
privacy 접근 권한 요청을 해야함. (라이브러리의 기능을 쓰지 않더라도) - 카메라, 앨범 등 privacy에 대한 접근은 실제로 앱이 사용할 때 요청하는 것이 바람직함.
이상입니다.
'TIL' 카테고리의 다른 글
[Sesac IOS] 32일차 TIL (0) | 2022.08.18 |
---|---|
[Sesac IOS] 31일차 TIL (0) | 2022.08.17 |
[Sesac IOS] 29일차 TIL (0) | 2022.08.12 |
[Sesac IOS] 28일차 TIL (0) | 2022.08.11 |
[Sesac IOS] 26~27일차 TIL (0) | 2022.08.09 |