Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Firebase Storage 이미지, 사진, 파일, 동영상 저장소 사용 방법 (FirebaseAuth, FirebaseFirestore) 본문

iOS 응용 (swift)

[iOS - swift] Firebase Storage 이미지, 사진, 파일, 동영상 저장소 사용 방법 (FirebaseAuth, FirebaseFirestore)

jake-kim 2021. 11. 20. 13:37

Firebase Storage

  • FTP서버와 같은 Firebase에서 제공하는 저장소
  • 문서, 사진, 이미지, 파일, 동영상 저장 업로드, 다운로드 가능

FirebaseStorage 세팅

  • Firebase Console에서 앱 등록 후 GoogleService-Info.plist 다운로드

  • Project에 포함

  • Firebase Console > Storage > `시작하기` 버튼 탭

  • 디폴트로 두고 다음, 완료 선택
    • 보안 규칙은 인증된 사용자만 쓰기가 가능 하도록 하는 보안 규칙으로 자동 설정

  • 인증규칙은 Storage - Rules 탭에서 수정 가능

  • 보안 규칙 수정 방법
    • 인증이 없어도 쓰기가 가능하도록 설정
allow read, wirte

iOS  앱에 Firebase Storage 적용

  • SPM을 이용하여 sdk 다운
    • Firebase SDK 다운 링크
https://github.com/firebase/firebase-ios-sdk.git
  • package 
    • FirebaseAuth
    • FirebaseStorage
    • FirebaseFirestore - Storage에 데이터를 업로드하고 url을 얻을 수 있는데, 이 url을 가지고 해당 데이터를 다시 다운받을때 사용
    • FirebaseStorageSwift

  • AppController를 만들어서 이곳에서 화면전환 하도록 설정
    • AppController로 로그인 플로우 만드는 방법과 firebase anonymous 로그인 설정은 로그인 화면 전환 설계 방법 참고
    • 아래 로그인 완료된 UI까지 준비

이미지를 Storage에 저장, 로드 원리

  • 저장
    • Storage에 imageName과 imageData를 파라미터로 넘겨서 저장 요청
    • 저장 요청이 끝나면 해당 파일에 관한 url 요청
    • (이 url은 이미지를 다운받을 수 있는 링크이므로, 사용하는 쪽에서 이 링크를 firestore에 기록)
  • 로드
    • url을 가지고 storage에 로드 요청을 하면 이미지 데이터 획득 가능

import UIKit
import FirebaseStorage
import Firebase

class FirebaseStorageManager {
    static func uploadImage(image: UIImage, pathRoot: String, completion: @escaping (URL?) -> Void) {
        guard let imageData = image.jpegData(compressionQuality: 0.4) else { return }
        let metaData = StorageMetadata()
        metaData.contentType = "image/jpeg"
        
        let imageName = UUID().uuidString + String(Date().timeIntervalSince1970)
        
        let firebaseReference = Storage.storage().reference().child("\(imageName)")
        firebaseReference.putData(imageData, metadata: metaData) { metaData, error in
            firebaseReference.downloadURL { url, _ in
                completion(url)
            }
        }
    }
    
    static func downloadImage(urlString: String, completion: @escaping (UIImage?) -> Void) {
        let storageReference = Storage.storage().reference(forURL: urlString)
        let megaByte = Int64(1 * 1024 * 1024)
        
        storageReference.getData(maxSize: megaByte) { data, error in
            guard let imageData = data else {
                completion(nil)
                return
            }
            completion(UIImage(data: imageData))
        }
    }
}

 

  • 사용하는 쪽
    • UIImagePickerController에서 이미지 획득 > uploadImage 호출
    • 이미지 로드 버튼 클릭 > downloadImage 호출
// 이미지를 선택 > 이미지 업로드

extension HomeVC: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        guard let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage,
              let user = Auth.auth().currentUser else { return }
        
        FirebaseStorageManager.uploadImage(image: selectedImage, pathRoot: user.uid) { url in
            if let url = url {
                UserDefaults.standard.set(url.absoluteString, forKey: "myImageUrl")
                self.title = "이미지 업로드 완료"
            }
        }
        
        picker.dismiss(animated: true)
    }
}
// 이미지 다운 버튼 클릭 > downloadImage 호출

@objc private func didTapLoadImageFromFirebaseButton() {
    guard let urlString = UserDefaults.standard.string(forKey: "myImageUrl") else { return }
    
    FirebaseStorageManager.downloadImage(urlString: urlString) { [weak self] image in
        self?.downloadImageView.image = image
    }
}
  • Storage에서 업로드 확인
    • 주의할점: Firebase의 Project가 여러개인 경우, 최초로 사용한 Storage만 사용할 수 있으므로 새로운 프로젝트에서 Storage 다시 사용 시 Permission Denied 400 error 발생하는것을 주의

* 전체 소스 코드: https://github.com/JK0369/ExFirebaseStorage

cf) Firestore와 Storage 사용

* 참고

- https://firebase.google.com/docs/storage/ios/start?hl=ko

Comments