Începeți cu stocarea Firebase pentru iOS

Introducere 

Dincolo de posibilitatea ca dezvoltatorii iOS să stocheze cu ușurință date pe cloud, precum și să autentifice utilizatorii prin SDK-urile lor robuste, Firebase oferă de asemenea o soluție convenabilă de stocare pentru mass-media. Firebase Storage permite dezvoltatorilor să stocheze și să recupereze fișiere audio, imagine și video în cloud. Astfel, Firebase Storage expune un set de SDK-uri pentru a oferi dezvoltatorilor posibilitatea de a-și gestiona proprietățile de conținut generate de utilizatori alături de produsul său frate, baza de date Firebase Realtime, care stochează conținutul textului utilizatorului. 

Cu toate acestea, stocarea Firebase este mai mult decât un container de stocare pentru materiale media bogate. Asistă dezvoltatorii oferind sincronizarea offline pentru utilizatori și dispozitivele lor, așteptând și reluând imagini și clipuri video atunci când utilizatorul se stinge și se întoarce online. Acest lucru funcționează similar cu modul în care Firebase Realtime Database orchestrează sincronizarea datelor utilizatorilor către back-end.

Acest tutorial continuă de la tutorialul nostru de pornire cu Firebase Authentication pentru iOS, unde ne-am uitat cum să gestionăm, să stocăm și să lucrăm cu utilizatorii din Firebase.

Obiectivele acestui tutorial

Acest tutorial vă va expune la SDK-urile de stocare Firebase, pentru a vă ajuta să gestionați materialele media ale aplicației - cum ar fi fișiere imagine, audio și video - stocându-le de la distanță în cloud și recuperând-le în întreaga aplicație. În acest tutorial, veți învăța cum să:

  • configurați aplicația pentru stocarea Firebase
  • creați și lucrați cu referințe de stocare 
  • încărcați fișiere media pe spațiul de stocare Firebase
  • descărcați suportul de stocare din Firebase Storage

Cunoașterea presupusă

Acest tutorial presupune că ați avut o anumită expunere la Firebase, și un fundal în curs de dezvoltare cu Swift și Xcode. De asemenea, este important să fi trecut mai întâi prin intermediul Instrucțiunii noastre de pornire cu Firebase Authentication pentru tutorialul iOS, deoarece va trebui să vă autentificați utilizatorii înainte de a accesa o mare parte din funcționalitatea Firebase Storage,.

Ce este stocarea Firebase??

În calitate de dezvoltator, puteți utiliza baza de date Firebase Realtime pentru a accesa și a interacționa cu o găleată de stocare Firebase în mod fără server, fără a fi necesară crearea și găzduirea propriilor servere. Firebase Storage folosește caching-ul local pe dispozitive pentru a stoca activele atunci când este offline și pentru a-și servi activele atunci când utilizatorul se întoarce online, datele locale fiind sincronizate automat.

Dezvoltatorii nu mai trebuie să se ocupe de complexitatea sincronizării datelor și a conținutului prin intermediul bibliotecilor de rețea standard de iOS ale Apple și să se confrunte cu mai multe scenarii care pot cauza întreruperi ale transferului.

De fapt, produsele Firebase recunosc faptul că utilizatorii de telefoane mobile din lumea reală se confruntă cu perspective de întreruperi sau de situații de semnal slab. Posibilitatea de a sincroniza datele pe dispozitiv pentru transferul ulterior face ca utilizatorii să beneficieze de o experiență mult mai bună, în timp ce economisesc foarte mult lucrurile.

De asemenea, securitatea este de o importanță deosebită pentru Firebase Storage, așa cum se întâmplă și cu restul suitei de produse Firebase. Aceasta înseamnă că dezvoltatorii pot restricționa accesul la elementele de stocare prin autentificarea utilizatorilor utilizând Firebase Authentication, care este construit pe lângă un model de securitate imperativ care permite controlul accesului la căi, fișiere și metadate pe bază de roluri.

În cele din urmă, aplicațiile găzduite pe spațiul de stocare Firebase beneficiază de o infrastructură Google care scade în funcție de baza de utilizatori. Vom explora unele dintre aceste concepte mai târziu în tutorial, dar pentru început, hai să trecem prin configurarea aplicației dvs. pentru a lucra cu Firebase. Apoi vom arunca o privire la indicatorii de referință pentru depozitare.

Configurați Proiectul

Dacă ați lucrat anterior cu Firebase, multe dintre acestea ar trebui să vă fie cunoscute. În caz contrar, va trebui să creați un cont în Firebase și urmați instrucțiunile din Configurați Proiectul secțiune a articolului Începeți cu autentificarea Firebase pentru iOS. 

Puteți descărca codul sursă complet pentru acest proiect introducând următoarele în terminal:

$ git clone [email protected]: tutsplus / get-started-with-firebase-storage-pentru-ios.git

Pentru stocare, va trebui să adăugăm Firebase / Depozitare la Podfile, după cum se arată mai jos:

pod "Firebase / Core" pod "Firebase / Depozitare"

Salvați și introduceți următoarele în terminalul dvs. pentru a crea casetele:

pod instalare

În cadrul AppDelegate  aplicare: didFinishLaunchingWithOptions: , este prezentă următoarea linie:

FirebaseApp.configure ()

Asigurați-vă că ați configurat proiectul corect prin Consola Firebase, așa cum este descris în Configurați Proiectul din secțiunea Începeți cu autentificarea Firebase pentru tutorialul iOS. 

Odată ce mediul dvs. este gata, putem trece la vizualizarea referințelor de stocare, începând cu modul de creare a unui indicator de referință. 

Crearea și lucrul cu referințe de stocare

Folosind spațiul de stocare Firebase, puteți interacționa cu propria găleată de cloud, care reprezintă un sistem de fișiere al imaginilor și videoclipurilor stocate. Utilizați ceea ce se numește o referință de stocare la o anumită cale sau fișier într-o cale, în cadrul sistemului de fișiere la care accesați aplicația, astfel încât să puteți interacționa cu aceasta prin transferarea datelor. 

Având un pointer la o cale sau un fișier din cale vă permite să încărcați, să descărcați, să actualizați sau să ștergeți calea respectivă. Pentru a crea o referință, creați doar o instanță de Storage.storage (), după cum urmează:

let store = Storage.storage () permite storeRef = store.reference () 

Aveți acum o referință la rădăcina ierarhiei sistemului dvs. de fișiere și puteți seta structura pentru găleata așa cum doriți, de exemplu, prin crearea unei structuri de directoare. 

Pentru a accesa fișierele și căile în găleata dvs., apelați copil() , după cum urmează:

permiteți userProfilesRef = storeRef.child ("images / profiles") ... lasă logoRef = storeRef.child ("images / logo.png")

Referințele sunt o scurtă descriere a căii Firebase complete la fișierul dvs. prin intermediul găleții dvs., în loc să introduceți întreaga cale URL a găurilor de firebase. Pe lângă copil() , puteți naviga, de asemenea, în ierarhia dvs. utilizând rădăcină() și mamă() metode și puteți să legeți aceste metode, după cum veți vedea mai jos:

permiteți userProfilesRef = logoRef.parent () ?. copil ("profile")

După cum vedeți, vom obține aceleași rezultate pentru userProfilesRef așa cum am avut în blocul precedent de cod. Cea mai bună referire la referințe este că acestea sunt extrem de ușoare, astfel încât să puteți avea cât mai multe referințe în instanța aplicației decât doriți, fără a afecta performanța aplicației dvs.. 

Acum, că înțelegeți aspectele fundamentale ale colaborării cu referințele de stocare Firebase, să trecem mai departe la încărcarea și descărcarea fișierelor din cupă. 

Încărcarea mediilor în spațiul de stocare Firebase

Cea mai simplă modalitate de a încărca un fișier este să treci într-un NSData reprezentarea conținutului său în memorie:

(date, metadate: nil) (metadate, eroare) în guard guarded metadata = metadate else print ("Eroare a apărut: \ (eroare)" ) return print ("URL-ul de descărcare pentru profil este \ (metadata.downloadURL)")

Puteți gestiona încărcările în desfășurare, controlând momentul în care începeți, întrerupeți, reluați și anulați încărcările. De asemenea, puteți asculta evenimentele ulterioare care sunt declanșate, care sunt:

  • pauză
  • relua
  • Anulare

Referindu - se la uploadUserProfileTask am folosit mai devreme, vă puteți controla încărcările folosind următoarele metode:

uploadUserProfileTask.pause () uploadUserProfileTask.resume () uploadUserProfileTask.cancel ()

De asemenea, puteți monitoriza un transfer în curs prin simpla setare a unui observator la obiectul instanței de activitate:

permiteți progressObserver = uploadUserProfileTask.observe (.progress) instant snapshot.progress! .completedUnitCount) / Double (snapshot.progress! .totalUnitCount) print (procentComplete)

Să vedem cum v-ați apropia de descărcarea de imagini sau de videoclipuri din spațiul de stocare. 

Descărcarea suporturilor de stocare din Firebase

Pentru a putea descărca și prezenta imaginile dvs., porniți după cum ați făcut cu încărcarea și declarați un indicator de referință pe calea desemnată. Începeți apoi descărcarea utilizând funcția de închidere dataWithMaxSize: finalizare::

logoRef.getData (maxSize: 1 * 1024 * 1024) date, eroare în cazul în care eroarea eroare = eroare print ("Eroare \ (eroare)") else let logoImage = UIImage

Dacă utilizați FirebaseUI, puteți pur și simplu să aveți FirebaseUI să gestionați descărcarea, stocarea și afișarea imaginilor pentru dvs. într-un mod chiar mai simplu:

... self.imageView.sd_setImage (cu: logoRef, placeholderImage: placeholderImage) 

Pentru informații despre implementarea FirebaseUI, consultați documentația FirebaseUI. 

Gestionarea descărcărilor funcționează în mod similar cu gestionarea și controlul încărcărilor. Iată un exemplu: 

Descarcati fisierul downloadTask.pause () // Continuati descarcarea downloadTask.resume () // Anulati download-ul downloadTask.cancel () ()

De asemenea, puteți desemna un observator ca și noi pentru încărcări, pentru a urmări progresul transferului de descărcări în timp real:

permiteți progressObserverDownload = downloadTask.observe (.progress) instantaneu în% percentComplete = 100.0 * dublu (snapshot.progress! .completedUnitCount) / dublu (snapshot.progress! .totalUnitCount) print (procentComplete)

Înarmat cu o imagine de ansamblu asupra modului de lucru cu referințe și despre modul de încărcare și descărcare a materialelor din galeata dvs., sunteți gata să examinați cum să implementați spațiul de stocare Firebase pentru proiectele noastre: FirebaseDo.

Proiectul FirebaseDo Sample

Ar fi trebuit să fi clonat aplicația FirebaseDo până acum, deci mergeți mai departe și construiți și executați proiectul. Veți vedea că tot ceea ce face este autentificarea utilizatorilor, utilizând telefonul sau e-mailul:

Scopul nostru este de a îmbunătăți progresiv funcționalitatea aplicației, astfel încât, odată ce utilizatorii să se autentifice cu succes, vor putea încărca o fotografie de profil. Cea mai mare parte a muncii noastre va fi în HomeViewController și Storyboard-ul asociat. Să ne adresăm HomeViewController fișierul primul. 

HomeViewController

Înainte de a intra în metodele acestui controler, va trebui să adăugăm UIImagePickerControllerDelegate protocol pentru clasa noastră, astfel încât să putem lucra cu metodele delegaților. De asemenea, va trebui să adăugăm o instanță de selectare, astfel încât utilizatorii să poată alege o fotografie din biblioteca lor.

clasă HomeViewController: UIViewController, FUIAuthDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegați @IBOutlet slab var myImageView: UIImageView! permiteți picker = UIImagePickerController () ... fileprivate (set) var auth: Auth? fileprivate (set) var authUI: FUIAuth? // setați numai intern, dar obțineți extern fileprivate (set) var authStateListenerHandle: AuthStateDidChangeListenerHandle?

Adăugați următoarele la sfârșitul secțiunii viewDidLoad () metodă:

self.picker.delegate = auto.refreshProfileImage ()

Vom implementa refreshProfileImage () , care va fi apelată pentru a descărca imaginea pe care am afișat-o în ViewController. Vom afirma mai întâi că utilizatorul este într-adevăr autentificat, înainte de a crea o referință care va prelua imaginea de profil a utilizatorului din /images/user_id/profile_photo.jpg drum în interiorul nostru găleată. În cele din urmă, vom actualiza vizualizarea imaginilor cu imaginea preluată.

func refreshProfileImage () if let user = Auth.auth (). curentUser let store = Storage.storage () let storeRef = store.reference () ) date_report (maxSize: 1 * 1024 * 1024) date, eroare în cazul în care eroarea = eroare print ("eroare: \ (error.localizedDescription)") else let image = UIImage self.myImageView.image = imagine altceva print ("Ar trebui să fii autentificat") self.loginAction (expeditor: self) return

Apoi, vom crea un @IBAction pentru butonul de bibliotecă foto la care ne vom conecta în scurt timp din storyboard-ul nostru:

@IBAction func libraryAction (_ expeditor: Oricare) self.picker.allowsEditing = false self.picker.sourceType = .photoLibrary self.picker.mediaTypes = UIImagePickerController.availableMediaTypes (pentru: .photoLibrary)! autopresent (selector, animat: adevărat, finalizare: print ("salvare mâner"))

În cele din urmă, adăugăm două metode delegate pentru noi UIImagePickerController, să se ocupe atunci când utilizatorul anulează UIImagePicker, precum și manipularea imaginii selectate: 

 func_pickerControllerDidCancel (_ selecter: UIImagePickerController) refuză (animat: adevărat, completare: nil) func imagePickerController (selector: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: lasă profileImageFromPicker = info [UIImagePickerControllerOriginalImage] ca! UIImage permite metadata = StorageMetadata () metadata.contentType = "imagine / jpeg" lasă imageData: Data = UIImageJPEGRepresentation (profileImageFromPicker, 0.5)! let store = Storage.storage () let user = Auth.auth (). curentUser dacă permite utilizatorului = user let storeRef = store.reference () child ("images / \ (user.uid) /profile_photo.jpg" ASProgressHud.showHUDAddedTo (auto.view, animat: true, type: .default) permite _ = storeRef.putData (imageData, metadata: metadata) (metadate, eroare) în ASProgressHud.hideHUDForView (self.view, animated: true) lasă _ = metadate altceva print ("a apărut eroare: \ (error.debugDescription)") return self.myImageView.image = profileImageFromPicker

După ce utilizatorul selectează o imagine, refuzăm selectorul, dar păstrăm o referință la imaginea selectată. Apoi, creăm un StorageMetadata () astfel încât să putem spune Firebase că vom încărca un fișier JPEG. 

Așa cum am făcut în refreshProfileImage () , vom afirma că utilizatorul este autentificat și apoi creați o referință la calea imaginilor în care dorim să stocăm profilul utilizatorului. Utilizarea putData () , încărcăm în mod asincron imaginea noastră în locația desemnată a găleții, înainte de a seta vederea noastră de imagini la imaginea nou selectată. 

Înainte de a putea să construim și să executăm aplicația noastră, va trebui să adăugăm controalele potrivite în tabloul de bord.

storyboard

În cadrul tabloului de bord principal, adăugați o imagine de vizualizare cu o imagine de tip placeholder care va reprezenta profilul curent al utilizatorului și trageți apoi pentru a asocia imaginea de imagine cu cea pe care am declarat-o @IBOutlet în a noastră HomeViewController clasă. Apoi, adăugați o bară de instrumente cu un buton pe care îl veți folosi ca un @IBAction pentru a apela libraryAction () metoda pe care am creat-o mai devreme în HomeViewController

Storyboard-ul dvs. ar trebui să semene acum cu următoarele:

În lipsa oricăror erori, puteți continua să construiți și să difuzați din nou aplicația dvs. și să vă autentificați fie prin crearea unui nou utilizator, fie prin utilizarea setului de acreditări al unui utilizator existent. 

Veți fi prezentat apoi cu HomeViewController, unde veți selecta + pentru a adăuga o imagine din biblioteca de fotografii a dispozitivului sau a simulatorului. Odată ce ați ales o fotografie, aceasta va fi încărcată în galeria Firebase. Puteți confirma că a încărcat cu succes accesând Depozitare la Consola Firebase, după cum se arată mai jos:

Dacă opriți și re-executați aplicația în Xcode, ar trebui să vedeți că imaginea pe care ați încărcat-o ultima oară reapare, confirmând în continuare că am încărcat și descărcat cu succes folosind Firebase Storage. 

Concluzie

Acest tutorial a demonstrat cum este ușor să adăugați stocarea și gestionarea activelor asincrone la o aplicație Firebase existentă cu doar câteva rânduri de cod. Aceasta vă oferă o modalitate convenabilă de a gestiona proprietățile aplicației dvs., permițându-vă să gestionați elegant și convenabil sincronizarea offline. 

Firebase Storage este o alegere evidentă pentru dezvoltatorii iOS care se află deja în cadrul ecosistemului Firebase. Oferă dezvoltatorilor securitatea unui model de securitate imperativ furnizat de Firebase Authentication, precum și capacitatea oferită de baza de date Firebase Realtime. 

În timp ce sunteți aici, verificați câteva dintre celelalte postări ale noastre privind dezvoltarea aplicațiilor iOS!

Cod