Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ios
- collectionview
- clean architecture
- 애니메이션
- 스위프트
- uitableview
- ribs
- uiscrollview
- map
- Human interface guide
- Protocol
- combine
- RxCocoa
- swiftUI
- Xcode
- 리팩토링
- SWIFT
- tableView
- Observable
- swift documentation
- UICollectionView
- 클린 코드
- MVVM
- UITextView
- 리펙토링
- HIG
- rxswift
- Clean Code
- 리펙터링
- Refactoring
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Firebase Storage 이미지, 사진, 파일, 동영상 저장소 사용 방법 (FirebaseAuth, FirebaseFirestore) 본문
iOS 응용 (swift)
[iOS - swift] Firebase Storage 이미지, 사진, 파일, 동영상 저장소 사용 방법 (FirebaseAuth, FirebaseFirestore)
jake-kim 2021. 11. 20. 13:37Firebase 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 사용
- 이미지를 storage에 등록하고 따로 url을 요청하여 얻으면, 이 url을 firestore에 기록해놓아야 다음에 firestore를 조회하고 url을 얻어내어 이 url을 가지고 storage에서 조회하는 방식
- Firestore 사용 방법 참고: https://ios-development.tistory.com/771
- Firebase + Storage 사용 방법 참고: https://ios-development.tistory.com/763
* 참고
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] 1. Timer 구현하기 - UIDatePicker 개념, Timer()로 구현 방법 (0) | 2021.11.23 |
---|---|
[iOS - swift] Firebase Firestore 개념, 실시간 데이터 사용 방법 (2) | 2021.11.22 |
[iOS - swift] Firebase Auth 이메일로 로그인하기 (이메일 링크 인증, dynamic link, 동적 링크, Deep Link, 딥링크) (0) | 2021.11.19 |
[iOS - swift] 로그인 화면 전환 설계 방법 (자동 로그인, autoSignIn, Firebase Auth 로그인) (0) | 2021.11.18 |
[iOS - swift] AVFoundation, 음악 재생, MP3 (0) | 2021.11.17 |
Comments