Utover at iOS-utviklere enkelt lagrer data på skyen, samt å godkjenne brukere gjennom sine robuste SDK, gir Firebase også en praktisk lagringsløsning for media. Firebase Storage lar utviklere lagre og hente lyd-, bilde- og videofiler på skyen. Det vil si at Firebase Storage utsett et sett med SDKer for å gi utviklere muligheten til å administrere sine brukergenererte innholdsaktiver sammen med sitt søskenprodukt, Firebase Realtime Database, som lagrer brukertekstinnhold.
Firebase Storage er imidlertid mer enn bare en lagringsbeholder for rike medier. Det hjelper utviklere ved å tilby offline synkronisering for brukere og deres enheter, kjøre og gjenoppta bilder og videoer når brukeren går av og tilbake på nettet. Dette fungerer på samme måte som hvordan Firebase Realtime Database orkestrer synkronisering av brukerdata til backend.
Denne opplæringen fortsetter fra vår tidligere veiledning om Komme i gang med brannbaseautentisering for iOS, hvor vi så på hvordan du skal administrere, lagre og jobbe med brukere i Firebase.
Denne opplæringen vil avsløre deg i Firebase Storage SDK, for å hjelpe deg med å administrere appens medieverdier, for eksempel bilde-, lyd- og videofiler, lagre dem eksternt på skyen, og hente dem i hele appen din. I denne opplæringen lærer du hvordan du:
Denne opplæringen antar at du har hatt noen eksponering for Firebase, og en bakgrunn som utvikler seg med Swift og Xcode. Det er også viktig at du har gått gjennom vår Kom godt i gang med brannbaseautentisering for iOS-opplæringen først, da du må godkjenne brukerne dine før du får tilgang til mye av brannbaseopplagringsfunksjonaliteten, inkludert aktivitetsbaner.
Som utvikler kan du bruke Firebase Realtime Database til å få tilgang til og samhandle med Firebase Storage-bøtten din på serverless måte uten å måtte opprette og hoste dine egne servere. Firebase Storage lager bruk av lokal på-enhet caching for å lagre eiendeler når du er offline, og servere eiendeler når brukeren kommer tilbake online, med de lokale dataene automatisk synkronisert.
Utviklere trenger ikke lenger å håndtere kompleksiteten ved å synkronisere data og innhold gjennom Apples standard iOS-nettverksbiblioteker, og måtte håndtere flere scenarier som kan forårsake overføringsavbrudd.
Faktisk anerkjenner Firebase-produktene at mobiloperatører i verden står overfor utsikter for avbrudd eller lavsignal situasjoner. Å kunne synkronisere data på enheten for senere overføring gir en mye bedre brukeropplevelse, samtidig som utviklerne får mye arbeid.
Sikkerhet er også viktig med Firebase Storage, som det er med resten av Firebase-pakken med produkter. Dette innebærer at utviklere kan begrense tilgangen til lagringsobjekter ved å godkjenne brukere ved å bruke Firebase Authentication, som er bygget utover en imperativ sikkerhetsmodell som tillater kontroll over tilgang til baner, filer og metadata på en roll-to-roll basis.
Til slutt kan apper som er vert for Firebase Storage, ha nytte av en Google-infrastruktur som skalerer som brukerbasen vokser. Vi vil utforske noen av disse konseptene senere i opplæringen, men til å begynne med, la oss gå gjennom å sette opp appen din for å jobbe med Firebase. Så tar vi en titt på lagringsreferansepekere.
Hvis du har jobbet med Firebase før, bør mye av dette være kjent for deg. Ellers må du opprette en konto i Firebase, og følg instruksjonene i Sett opp prosjektet Del av artikkelen Komme i gang med Firebase-godkjenning for IOS.
Du kan laste ned den komplette kildekoden for dette prosjektet ved å skrive inn følgende i terminal:
$ git klone [email protected]: tutsplus / get-started-with-firebase-storage-for-ios.git
For Lagring, må vi legge til Fire / Garasje
til vår Podfile, som vist nedenfor:
pod 'Firebase / Core' pod 'Firebase / Storage'
Lagre og skriv deretter inn følgende i terminalen din for å bygge bøkene:
pod installasjon
Innenfor AppDelegate applikasjons: didFinishLaunchingWithOptions:
metode, er følgende linje til stede:
FirebaseApp.configure ()
Kontroller at du også har konfigurert prosjektet ditt via Firebase Console på riktig måte, som beskrevet i Sett opp prosjektet Del av Komme i gang med brannbaseautentisering for iOS-opplæringen.
Når miljøet ditt er klart, kan vi fortsette å se på lagringsreferanser, og begynne med hvordan du lager en referansepeker.
Ved å bruke Firebase Storage kan du samhandle med din egen skybøtte, som representerer et filsystem av dine lagrede bilder og videoer. Du bruker det som kalles en lagringsreferanse til en bestemt sti eller fil i en bane, i filsystemet som du deretter gir appen din tilgang til, slik at du kan samhandle med den ved å overføre data.
Å ha en peker til en sti eller fil i banen lar deg laste opp, laste ned, oppdatere eller slette den banen. For å opprette en referanse, oppretter du bare en forekomst av Storage.storage ()
, som følger:
la butikken = Storage.storage () la storeRef = store.reference ()
Du har nå en referanse til roten til filsystemhierarkiet, og du kan angi strukturen for bøtte din som du ønsker, for eksempel ved å lage en mappestruktur.
For å få tilgang til filer og stier i skuffen, ring barn()
metode, som følger:
la userProfilesRef = storeRef.child ("bilder / profiler") ... la logoRef = storeRef.child ("images / logo.png")
Referanser er en stenografi for den komplette Firebase-banen til filen din via bøtte, i stedet for å legge inn hele Firebase Bucket URL-banen. Ved siden av barn()
Metode, du kan også navigere ditt hierarki ved hjelp av rot()
og ordnede ()
metoder, og du kan kjede disse metodene, som du vil se nedenfor:
la userProfilesRef = logoRef.parent () ?. child ("profiler")
Som du kan se, ville vi få de samme resultatene for userProfilesRef
som vi hadde i den forrige koden. Det gode med referanser er at de er ekstremt lette, slik at du kan få så mange referanser i app-instansen som du ønsker, uten å påvirke ytelsen til appen din.
Nå som du forstår de grunnleggende aspektene ved å arbeide med Firebase Storage referanser, la oss fortsette å laste opp og laste ned filer fra skuffen din.
Den enkleste måten å laste opp en fil på er å passere i en NSData
representasjon av innholdet i minnet:
la opplastingUserProfileTask = userProfilesRef.child ("\ (userID) .png"). putData (data, metadata: null) (metadata, feil) i vakt la metadata = metadata ellers print ("Feil oppstod: \ (feil)" ) return print ("download url for profil er \ (metadata.downloadURL)")
Du kan administrere dine opplastinger pågår, ved å kontrollere når du skal begynne, pause, gjenoppta og avbryte opplastingene dine. Du kan også lytte til de påfølgende hendelsene som utløses, som er:
Henvisning til uploadUserProfileTask
vi brukte tidligere, kan du kontrollere opplastingene dine ved hjelp av følgende metoder:
uploadUserProfileTask.pause () uploadUserProfileTask.resume () uploadUserProfileTask.cancel ()
Du kan også overvåke en overføring pågår ved ganske enkelt å sette en observatør til oppgavetilstandsobjektet:
la progressObserver = uploadUserProfileTask.observe (.progress) øyeblikksbilde i la prosentComplete = 100.0 * Dobbel (snapshot.progress! .completedUnitCount) / Dobbel (snapshot.progress! .totalUnitCount) print (percentComplete)
La oss se hvordan du nærmer deg nedlasting av bilder eller videoer fra lagringsbøtten.
For å kunne laste ned og presentere bildene dine, starter du som du gjorde med opplasting, og erklært en referansepekeren til den angitte banen. Start deretter nedlastingen ved hjelp av lukkingsfunksjonen dataWithMaxSize: ferdigstillelse:
:
logoRef.getData (maxSize: 1 * 1024 * 1024) data, feil i hvis la feil = feil print ("Feil \ (feil)" else let logoImage = UIImage (data: data!)
Hvis du bruker FirebaseUI, kan du bare FirebaseUI administrere nedlastingen, caching og visning av bilder på en enda enklere måte:
... self.imageView.sd_setImage (med: logoRef, placeholderImage: placeholderImage)
For informasjon om implementering av FirebaseUI, se FirebaseUI-dokumentasjonen.
Håndtering av nedlastinger fungerer på samme måte som å administrere og kontrollere opplastinger. Her er et eksempel:
la downloadTask = storageRef.child ("images / logo.jpg"). skriv (toFile: localFile) // Pause nedlastingen downloadTask.pause () // Fortsett nedlastingen downloadTask.resume () // Avbryt nedlastingsnedlastingenTask.cancel ()
Du kan også utpeke en observatør som vi gjorde for opplastinger, for å spore fremdriften av overføringsoverføringen i sanntid:
la progressObserverDownload = downloadTask.observe (.progress) øyeblikksbilde i la prosentComplete = 100.0 * Dobbel (snapshot.progress! .completedUnitCount) / Dobbel (snapshot.progress! .totalUnitCount) print (percentComplete)
Bevæpnet med en oversikt over hvordan man arbeider med referanser og hvordan du laster opp og laster ned eiendeler fra skuffen, er du nå klar til å ta en titt på hvordan å implementere Firebase Storage for vårt utvalgsprosjekt: FirebaseDo.
Du burde ha klonket FirebaseDo-appen nå, så fortsett å bygge og kjøre prosjektet. Du vil se at alt det gjør, er å autentisere brukere, ved hjelp av enten telefon eller e-post:
Målet vårt er å øke gradvis på appens funksjonalitet, slik at når brukerne autentiserer, vil de kunne laste opp et profilbilde. Det meste av vårt arbeid vil være i HomeViewController
og dets tilknyttede historiebrikke. La oss ta kontakt med HomeViewController
filen først.
Før vi hopper inn i metodene til denne kontrolleren, må vi legge til UIImagePickerControllerDelegate
protokoll til vår klasse slik at vi kan jobbe med sine delegerte metoder. Vi må også legge til en plukkfelt, slik at brukerne våre kan velge et bilde fra biblioteket.
klasse HomeViewController: UIViewController, FUIAuthDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate @IBOutlet weak var myImageView: UIImageView! la plukkeren = UIImagePickerController () ... fileprivate (sett) var auth: Auth? fileprivate (set) var authUI: FUIAuth? // Bare sett internt, men få eksternt fileprivat (sett) var authStateListenerHandle: AuthStateDidChangeListenerHandle?
Legg til følgende mot slutten av viewDidLoad ()
metode:
self.picker.delegate = self self.refreshProfileImage ()
Vi skal implementere refreshProfileImage ()
metode som kalles for å laste ned bildet vi har vist i vår ViewController. Vi skal først hevde at brukeren faktisk er autentisert, før du oppretter en referanse som vil hente brukerens profilbilde fra /images/user_id/profile_photo.jpg bane i bøtte. Til slutt oppdaterer vi bildevisningen med bildet hentet.
func refreshProfileImage () hvis la bruker = Auth.auth (). currentUser let store = Storage.storage () la storeRef = store.reference (). barn ("images / \ (user.uid) /profile_photo.jpg" ) storeRef.getData (maxSize: 1 * 1024 * 1024) data, feil i hvis la feil = feil print ("error: \ (error.localizedDescription)" else let image = UIImage (data: data!) self.myImageView.image = image else print ("Du skal være logget inn") self.loginAction (sender: selv) returnere
Deretter oppretter vi en @IBAction
metode for fotobiblioteksknappen som vi snart vil koble til fra vår storyboard:
@IBAction func libraryAction (_ sender: Any) self.picker.allowsEditing = false self.picker.sourceType = .photoLibrary self.picker.mediaTypes = UIImagePickerController.availableMediaTypes (for: .photoLibrary)! self.present (picker, animert: true, completion: print ("håndtere lagring"))
Til slutt legger vi til to delegeringsmetoder for vår UIImagePickerController
, å håndtere når brukeren kansellerer UIImagePicker
, i tillegg til å håndtere det valgte bildet:
func imagePickerControllerDidCancel (_ picker: UIImagePickerController) dismiss (animert: true, completion: nil) func imagePickerController (_ plukker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) self.dismiss (animert: true, completion: null) la profilImageFromPicker = info [UIImagePickerControllerOriginalImage] som! Ullmage la metadata = StorageMetadata () metadata.contentType = "image / jpeg" la imageData: Data = UIImageJPEGRepresentation (profileImageFromPicker, 0.5)! la butikken = Storage.storage () la bruker = Auth.auth (). currentUser hvis la bruker = bruker let storeRef = store.reference (). child ("images / \ (user.uid) /profile_photo.jpg") ASProgressHud.showHUDAddedTo (self.view, animated: true, type: .default) la _ = storeRef.putData (imageData, metadata: metadata) (metadata, feil) i ASProgressHud.hideHUDForView (self.view, animated: true) guard la _ = metadata annet print ("feil oppstod: \ (error.debugDescription)") return self.myImageView.image = profileImageFromPicker
Når brukeren velger et bilde, avviser vi plukkeren, men beholder en referanse til det valgte bildet. Deretter oppretter vi en StorageMetadata ()
eksempel slik at vi kan fortelle Firebase vi skal laste opp en JPEG-fil.
Som vi gjorde i refreshProfileImage ()
Metode, vi skal påstå at brukeren er autentisert, og deretter opprette en referanse til bildestien hvor vi vil lagre brukerens profil. Bruker putData ()
Metode, da uploader vi asynkront vårt bilde til den angitte bøtteplasseringen, før du stiller bildevisningen til det nylig valgte bildet.
Før vi kan bygge og kjøre appen vår, må vi legge til de riktige kontrollene i vår storyboard.
I hovedfortegnelsen legger du til en bildevisning med et plassholderbilde som vil representere brukerens nåværende profil, og deretter dra for å knytte bildevisningen med den vi har erklært som en @IBOutlet
i vår HomeViewController
klasse. Deretter legger du til en verktøylinje med en knapp som du vil bruke som en @IBAction
å ringe libraryAction ()
metode vi opprettet tidligere i HomeViewController
.
Din Storyboard skal nå ligne følgende:
Uten noen feil kan du fortsette å bygge og kjøre appen din igjen, og godkjenne ved å enten opprette en ny bruker eller bruke en eksisterende brukeres sett med legitimasjonsbeskrivelser.
Du vil da bli presentert med HomeViewController
, hvor du vil velge + knappen for å legge til et bilde fra enheten eller simulatorens fotobibliotek. Når du har valgt et bilde, laster det opp til Firebase-bøtte. Du kan bekrefte at den har blitt lastet opp ved å gå til Oppbevaring fanen i Firebase Console, som vist nedenfor:
Hvis du stopper og gjenoppretter appen i Xcode, bør du også se bildet du sist lastet opp igjen, og bekrefter at vi har lastet opp og lastet ned ved hjelp av Firebase Storage.
Denne opplæringen viste hvordan det er lett å legge til asynkron tilgangsoppbevaring og -administrasjon til en eksisterende Firebase-app med bare noen få linjer med kode. Dette gir deg en praktisk måte å administrere appens ressurser på, samtidig som du kan håndtere offline synkronisering elegant og bekvemt.
Firebase Storage er et åpenbart valg for iOS-utviklere som allerede er innenfor Firebase-økosystemet. Det gir utviklere sikkerheten til en viktig sikkerhetsmodell som leveres av Firebase Authentication, samt muligheten som tilbys av Firebase Realtime Database.
Mens du er her, sjekk ut noen av våre andre innlegg på IOS app utvikling!