Firebase Storage에 이미지를 업로드하는 샘플을 만들어 보았다!

추가



샘플 프로젝트를 BitBucket에 올리고 있기 때문에 좋다면보십시오.
또한 Firebase에서 이미 프로젝트를 삭제했기 때문에 작동하지 않습니다.
자신의 것으로 바꾸고 나서 실험 등 부디
h tps : // / t t c c t. 오 rg / n s d n b / 푹신 푹신한 s 훼손 mp ぇ / src

환경


  • OSX 10.11.6
  • Xcode 8
  • CocoaPods 0.39.0
  • iOS 10.0.1 (iPhone5)

  • 준비


  • Xcode의 새로운 프로젝트 생성 및 Firebase 콘솔에서 앱 등록
  • Firebase 프로젝트 적용

  • 위가 끝난 전제로

    그건 그렇고, Podfile은

    Podfile
    use_frameworks!
    
    target 'Sample' do
        pod 'Firebase'
        pod 'Firebase/Storage'
    end
    

    Firebase Storage 설정





    우선은 룰로부터 설정합니다. 기본 설정이라면 인증을 하고 있는 사용자만 파일 업로드를 할 수 있는 설정인 것 같습니다.
    이번에는 나 나름대로 적당하게 설정한 규칙을 둡니다.

    StorageRule
    service firebase.storage {
      match /b/<YOUR-GS-URL>.appspot.com/o {
        match /{allPaths=**} {
          allow read:if request.auth != null;
          allow write;
        }
      }
    }
    

    또한 규칙 작성에 도움이 된 사이트는 다음과 같습니다. 감사! !
    htps : // g 납땜 ps. 오, ぇ. 코m/후우루m/#! 토피 c / 푹신한 lk / WCShG 2

    의미로서는 read에는 인증이 있다. write 누구나 할 수 있습니다! 라고 말한 느낌.
    이번은 업로드만이므로 write 는 인증 없이 OK로 했습니다.
    또한 다음과 같이 인증 없이 누구나 읽고 쓸 수 있습니다.

    StorageRule
    service firebase.storage {
      match /b/<YOUR-GS-URL>.appspot.com/o {
        match /{allPaths=**} {
          allow read, write
        }
      }
    }
    

    구현





    화면 자체는 이런 느낌의 버튼이 있을 뿐입니다.

    이번에는 카메라 롤에서 이미지를 선택하여 업로드해 봅니다.
    iOS10에서 구현했기 때문에 Info.plist에 카메라 롤 사용 허가를 요구하는 것을 설정했습니다.
    Privacy - Photo Library Usage Description를 추가하고 같은 것을 추가하십시오!



    실제로 카메라 롤에 액세스할 때 이런 식으로 경고가 표시됩니다!

    실제로 사용한 소스 코드는 다음과 같습니다.

    ViewController.swift
    import UIKit
    import Firebase
    import FirebaseStorage
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let ud = UserDefaults.standard
            ud.set(0, forKey: "count")
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        @IBAction func selectImageWithLibrary(_ sender: AnyObject) {
            pickImageFromLibrary()
        }
    
        func countPhoto() -> String {
            let ud = UserDefaults.standard
            let count = ud.object(forKey: "count") as! Int
            ud.set(count + 1, forKey: "count")
            return String(count)
        }
    }
    
    
    // MARK: UINavigationControllerDelegate
    extension ViewController: UINavigationControllerDelegate {
        func pickImageFromLibrary() {
            if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
                let controller = UIImagePickerController()
                controller.delegate = self
                controller.sourceType = UIImagePickerControllerSourceType.photoLibrary
    
                present(controller, animated: true, completion: nil)
            }
        }
    }
    
    // MARK: UIImagePickerControllerDelegate
    extension ViewController: UIImagePickerControllerDelegate {
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo
            info: [String : Any]) {
            let storage = FIRStorage.storage()
            let storageRef = storage.reference(forURL: "gs://<YOUR-GS-APP>.appspot.com")
    
            if let data = UIImagePNGRepresentation(info[UIImagePickerControllerOriginalImage] as! UIImage) {
                let reference = storageRef.child("image/" + NSUUID().uuidString + "/" + countPhoto() + ".jpg")
                reference.put(data, metadata: nil, completion: { metaData, error in
                    print(metaData)
                    print(error)
                })
                dismiss(animated: true, completion: nil)
            }
        }
    }
    

    흐름


  • UserDefaults에 0를 추가했습니다. (시작시 매번 호출됩니다 ... 이것은 각자 수정 부탁드립니다)
  • 업로드 버튼을 누릅니다.
  • 액세스 권한 경고가 표시됩니다. (OK이었던 전제)
  • 사진 라이브러리 (카메라 롤)에서 원하는 이미지를 선택합니다.
  • UIImagePickerControllerDelegate에 의해 Firebase Storage에 업로드 할 준비를합니다.
  • UserDefaults에서 파일 업로드 횟수를 확인하고 UUID를 폴더 구성으로 업로드합니다.

  • 완전한 것으로 하고 싶다면 UserDefaults 대신 Keychain를 사용하여 계산을하는 것이 좋다고 생각합니다.

    결과





    현재 디렉토리 아래 image/<UUID>/[0-9].jpg의 형태로 저장할 수있었습니다!

    마지막으로



    Firebase Storage의 업로드 용량이 약간 잊어버렸습니다만(누군가 말해 주세요), 이것을 사용하면 간단한 공유 앱이라든지 만들 수 있을 것 같네요!

    좋은 웹페이지 즐겨찾기