TIL

[Sesac IOS] 30일차 TIL

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