En introduksjon til on-demand ressurser på iOS og tvOS

Introduksjon

Ved siden av iOS 9 og watchOS 2 introduserte Apple ressurser på forespørsel, en ny API for å levere innhold til applikasjonene dine, samtidig som det reduserer mengden plass applikasjonen tar opp på brukerens enhet. Med ressurser på forespørsel kan du merke bestemte eiendeler i søknaden din, få dem vert på Apples servere, slik at brukerne kan laste dem ned når det trengs. I denne opplæringen skal jeg vise deg grunnleggende av ressursbehov ved å lage et grunnleggende bildevisningsprogram.

Forutsetninger

Denne opplæringen krever at du kjører Xcode 7+ og er kjent med iOS-utviklingen. Du må også laste ned startprosjektet GitHub.

1. On-Demand Resources

fordeler

On-demand ressurser ble introdusert i iOS 9 og watchOS 2 for hovedformålet med å redusere mengden plass individuelle apper tar opp på en enhet. En annen viktig fordel ved ressursbehov er at appen din kan lastes ned og åpnes av brukerne mye raskere.

On-demand ressurser jobber ved å tildele unike tags til ressurser i Xcode for å lage det som kalles en aktivpakke. Disse pakkene kan inkludere alt fra aktiv kataloger (bilder, SpriteKit teksturer, data, etc.) eller til og med bare andre filer, for eksempel OpenGL og Metal shaders, samt SpriteKit og SceneKit scener og partikkelsystemer.

Når du sender appen din til App Store, lastes disse ressursene også opp og er vert der for å kunne lastes ned når som helst. Hvis du vil laste ned aktivitetspakker ved kjøretid i en app, bruker du bare taggen for hver pakke du tildelte i Xcode.

kategorier

De to viktigste aspektene av en app som bruker ressurser på forespørsel, er app pakke, som er full av kjørbar kode for appen din og viktige ressurser, for eksempel brukergrensesnittikoner, og aktivitetspakker.

For disse aktivitetspakker er det tre hovedkategorier som du kan organisere i Xcode:

  • Første installasjon: Dette er for innhold som er nødvendig for at appen din skal kjøre for første gang, men den kan slettes senere. Dette kan inkludere de første nivåene i et spill, som ikke lenger er nødvendig når spilleren går langt nok inn i spillet.
  • forhåndshentede: Denne kategorien inneholder innhold som du vil laste ned umiddelbart etter at appen din er ferdig med å installere. Denne typen innhold anbefales for ressurser som ikke kreves for at appen skal fungere etter installasjon, men det er nødvendig for en bedre brukeropplevelse. Et godt eksempel er opplæringsprogrammer for et spill.
  • På etterspørsel: Denne kategorien er rettet mot innhold du trenger senere, og appen din kan fungere uten. Når du arbeider med ressurser på forespørsel, er dette den vanligste typen kategori du vil bruke.

grenser

Apper som er bygget med støtte for on-demand-ressurser, må også holde seg til følgende grenser med hensyn til filstørrelse:

  • 2GB for iOS app pakke
  • 2GB for jegnitial installasjon tags
  • 2GB for forhåndshentede tags
  • 2GB for ressurser i bruk. Dette er bare viktig når søknaden din kjører og bruker ressurser på forespørsel.
  • 512MB for hver enkelt aktivpakke. Ingen enkelt tag kan inneholde mer enn denne mengden data. Hvis du går over denne grensen, vil Xcode gi deg en advarsel og tillate deg fortsatt å teste og utvikle appen din. Eventuelle innsending forsøk på App Store, vil imidlertid mislykkes.
  • 20GB for alle ressursene som hostes av Apple. Dette er den totale mengden ressurser som appen din muligens kan laste ned til enhver tid. Mens kun 2 GB kan brukes til enhver tid, kan en brukerens enhet ha nok lagringsplass, opptil 20 GB av ressursene dine kan lastes ned og gjøres tilgjengelig for appen når som helst.

App snitting

Vær oppmerksom på at 20 GB totalt ikke tar hensyn til app snitting mens alle de andre totalene gjør. Hva er app-snitting? Appskive er en annen funksjon som ble introdusert i IOS 9 for å redusere størrelsen på applikasjoner. Det gjør dette ved bare å se på ressursene som er spesifikke for enheten som appen blir installert på. Hvis for eksempel produktkataloger brukes riktig, må en app som er installert på en iPhone 6 Plus eller 6s Plus bare laste ned 3x-skalaen og ikke bekymre seg om 1x og 2x skalaene. For ressurser på forespørsel, er 20 GB av de totale ressursene du kan laste opp til App Store-serverne, det totale beløpet på tvers alle enhetstyper. Alle de andre grensene er for hver bestemt enhet som appen din blir installert på.

Slette On-Demand Resources

Når det gjelder dataslettering (rensing), vil aktivitetspakker som appen din har lastet ned, bare fjernes når enheten din app er installert på, går tom for ledig plass. Når dette skjer, vil ressurssystemet på forespørsel se på alle appene på enheten, og ved valg av en vil det sees på bevaringsegenskapene til hver aktivpakke, så vel som når den sist ble brukt. En viktig ting å merke seg er at aktivitetspakker for appen din aldri blir renset mens appen din kjører.

2. Tilordne og organisere etiketter

Åpne startprosjektet i Xcode og kjøre appen i iOS-simulatoren. For øyeblikket inneholder denne grunnleggende appen en samling bilder hver med en kombinasjon av en av tre farger (rød, grønn eller blå) og en av fire former (sirkel, firkant, stjerne eller sekskant). Når appen kjører, navigerer du til Farger> Rød og du vil se et enkelt rødt sirkelbilde som vises på skjermen.

I denne appen skal vi sette opp totalt syv aktivitetspakker, en for hver farge og en for hver form. En annen stor funksjon av ressursbehov er at en enkelt ressurs kan tilordnes mer enn én kode. Den røde sirkelen kan for eksempel være en del av begge rød aktivpakke og Sirkel aktivpakke.

API-en for ressursbehov er også smart nok til ikke å laste ned eller kopiere den samme ressursen to ganger. Med andre ord, hvis en søknad allerede hadde lastet ned rød aktivpakke og deretter ønsket å laste inn Sirkel aktivpakke, ville det røde sirkelbildet ikke lastes ned igjen.

I Xcode, åpne Assets.xcassets. Du bør se alle tolv bilder som vist nedenfor.

Deretter velger du Blå torget bilde sett og åpne Attributtsinspektør til høyre.

Du vil se at Attributtsinspektør inkluderer en ny On Demand Resource Tags seksjonen, hvor du tildeler koder til hver ressurs. For det blå firkantede bildet sett, skriv inn Blå og TorgetOn Demand Resource Tags felt. Dette betyr at bildesettet nå har to koder tildelt det.

Legg merke til at startprosjektet allerede inneholder ressursetiketter for ni av de tolv bildesettene. Dette forklarer hvorfor Xcode gir autofullføringsalternativer for deg når du skrev inn disse kodene.

Når du har fullført tilordne tagger for Blå torget bilde sett, legg til de riktige kodene til begge Grønn Hexagon og Red Circle bildesett som vist nedenfor.

Med ressurskoder på forespørsel riktig satt opp, åpne for Prosjektnavigator til venstre. Åpne Ressursetiketter kategorien øverst og velg forhåndshentede filter øverst.

Du kan nå se hvor stor hver aktivitetspakke er og nøyaktig hvilke ressurser som er i hver enkelt. De Alle filter viser deg hver av ressursene på forespørsel. De forhåndshentede filter viser ressursene på forespørsel per kategori, og det lar deg flytte ressurser fra en kategori til en annen:

  • Innledende installeringsmerker
  • Prefetched Tag Order
  • Last ned kun på forespørsel

Disse seksjonene speiler de tre kategoriene av aktivpakker som jeg skisserte tidligere. En viktig ting å merke seg er at aktivpakkene du legger inn i Prefetched Tag Order delen begynner å laste ned i den rekkefølgen de vises i.

Med tagger tilordnet hvert bildesett, er det på tide å begynne å få tilgang til ressursene i prosjektet.

3. Få tilgang til ressurser på etterspørsel

Å få tilgang til aktivitetspakker som er vert på App Store-serverne, håndteres av den nye NSBundleResourceRequest klasse. En forekomst av denne klassen er opprettet med et sett med koder du vil bruke. Det forteller systemet om bruken av de tilhørende aktivpakker. Deallokering av disse NSBundleResourceRequest Objekter er den beste og enkleste måten å fortelle operativsystemet når du ikke lenger bruker en bestemt aktivitetspakke. Dette er viktig, slik at du ikke overskrider 2 GB grensen for ressurser som er i bruk.

I prosjektet ditt, åpne DetailViewController.swift og legg til følgende eiendom til DetailViewController klasse.

var forespørsel: NSBundleResourceRequest!

Neste, erstatt din viewDidAppear (_ :) metode med følgende:

overstyr func viewDidAppear (animert: Bool) super.viewDidAppear (animert) request = NSBundleResourceRequest (tags: [tagToLoad]) request.beginAccessingResourcesWithCompletionHandler (feil: NSError?) -> Gyldig inn // Kalt på bakgrunnstråd hvis feil == nil NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Ugyldig i self.displayImages ())

Med denne koden, initialiserer du først be om eiendom med et sett som inneholder en enkelt kode. Settet av koder du gir til denne initialisatoren inneholder strengverdier. I dette tilfellet bruker vi tagToLoad eiendom, som er angitt av forrige visningskontrollere i programmet.

Deretter begynner vi å laste ned aktivitetspakker for de angitte kodene ved å ringe beginAccessingResourcesWithCompletionHandler (_ :). Denne metoden vil få tilgang til alle ressurser med de angitte kodene og vil automatisk starte en nedlasting om nødvendig. Når du har tilgang til ressursene på denne måten, er all din andre kode for å laste disse ressursene i appen din den samme.

Merk at hvis du bare vil ha tilgang til ressurser som allerede er lastet ned, uten å laste inn innhold, kan du bruke conditionallyBeginAccessingResourcesWithCompletionHandler (_ :) metode.

Som vist i koden ovenfor, er en viktig ting å huske om denne ferdigstillingsbehandleren at den kalles på en bakgrunnstråd. Dette betyr at eventuelle brukergrensesnittoppdateringer du vil gjøre ved ferdigstillelse, må utføres på hovedtråden.

Bygg og kjør appen din på nytt, og velg en farge eller form som skal vises i appen. Du bør se alle tre fargede bilder for en bestemt form eller alle fire former for en bestemt farge.

Det er så enkelt det er å bruke on-demand ressurser. Du har nå implementert ressurser på forespørsel i en applikasjon.

En viktig feilsøkingsfunksjon tilgjengelig i Xcode 7 er muligheten til å se hvilke aktivitetspakker du har lastet ned og hvilke som er i bruk. For å se dette, naviger til Debug Navigator med appen din kjører og velg Disk. Du vil se en skjerm som ligner den som vises nedenfor. On Demand Resources er delen vi er interessert i.

Som et eksempel, la oss nå endre nedlastingsprioriteten, slik at noen ressurser alltid lastes ned umiddelbart. Samtidig vil vi endre bevaringsprioriteter for aktivpakker slik at Hexagon og Stjerne aktivpakkene renses før Sirkel og Torget aktivitetspakker. Oppdater implementeringen av viewDidAppear (_ :) metode som vist nedenfor.

overstyre func viewDidAppear (animert: Bool) super.viewDidAppear (animert) request = NSBundleResourceRequest (tags: [tagToLoad]) request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent NSBundle.mainBundle (). setPreservationPriority (1.0, forTags: ["Circle", "Square" ]) NSBundle.mainBundle (). SetPreservationPriority (0.5, forTags: ["Hexagon", "Star"]) request.beginAccessingResourcesWithCompletionHandler (feil: NSError?) -> Gyldig inn // Kalt på bakgrunnstråd hvis feil == nil  NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Ugyldig i self.displayImages ())

Etter at du har initialisert forespørselen, setter vi inn loadingPriority eiendom til NSBundleResourceRequestLoadingPriorityUrgent. Alternativt kan du tildele et hvilket som helst nummer mellom 0.0 og 1.0 til denne egenskapen for å diktere lasteprioriteten i appen din.

Fordelen ved å bruke denne konstanten er at den automatisk gir forespørselen den høyeste prioriteringen, men det ignorerer også den aktuelle CPU-aktiviteten. I enkelte situasjoner, hvis enhetens CPU blir brukt tungt, kan nedlastingen av en aktivpakke bli forsinket.

Deretter setter vi bevaringsprioriteten for alle fire formetiketter. Dette gjøres ved å ringe setPreservationPriority (_: forTags :) Metode programmets hovedpakke. Vi har nå sikret at hvis ressurssystemet på forespørsel trenger å rense noen eiendeler fra vår app, Hexagon og Stjerne aktivpakkene blir slettet først.

4. Best Practices

Nå som du vet hvordan du implementerer on-demand-ressurser i et iOS-program, vil jeg kort fortalt om noen få gode fremgangsmåter å huske på.

Hold individuelle etiketter så små som mulige

I tillegg til å redusere nedlastingstider og gjøre ressursene mer tilgjengelige, forhindrer systemet at det blir overopprensing av hver enkelt aktivitetspakke så liten som mulig. Dette er når ressurssystemet på forespørsel trenger å frigjøre en viss plass og til slutt frigjør mye mer enn nødvendig.

For eksempel, hvis systemet trengte å frigjøre 50 MB plass og, basert på de tidligere nevnte forholdene, bestemte seg for at en 400 MB aktivpakke fra appen din var den mest hensiktsmessige til å bli slettet, ville systemet overopprense 350 MB. Dette betyr at hvis appen din har mistet flere data enn nødvendig, må den laste ned alle ressursene knyttet til den aktuelle taggen igjen. Den anbefalte størrelsen for individuelle koder er omtrent 64 MB.

Last ned tagger på forhånd

Hvis appen din har en svært forutsigbar brukerinteraksjon, er det best å begynne å laste ned ressurser før de faktisk trengs. Dette er å forbedre brukerens opplevelse da de ikke trenger å stirre på en lastingsskjerm mens appen laster ned innhold.

Spill er et vanlig eksempel. Hvis spilleren nettopp har fullført nivå 5, er det en god idé å begynne å laste ned nivå 7 mens hun spiller nivå 6.

Stopp tilgang til ressurser riktig

Når du er ferdig med å bruke en bestemt aktivitetspakke, må du sørge for at din NSBundleResourceRequest objektet er tildelt eller du ringer til endAccessingResources metode på den.

Ikke bare vil dette unngå at søknaden din rammer 2 GB-grensen for ressursbruk, det vil også hjelpe ressurssystemet for etterspørsel å vite når appen din bruker disse ressursene, noe som betyr at det bedre kan bestemme hva du skal rense hvis mer plass er behov for.

5. On-Demand Resources for tvOS

Jeg skrev nylig om tvOS utvikling og i den opplæringen nevnte jeg begrensningene til tvOS applikasjoner. Maksimumstørrelsen for en apppakke er 200 MB, så det anbefales at du bruker ressursene på forespørsel i tvOS apps når det er mulig.

På grunn av likhetene til tvOS og iOS er APIene og lagringsgrensene (unntatt app-bunten) for ressursbehov de samme. Når du jobber med ressursbehov på tvOS, er det imidlertid også viktig å huske at alle eiendeler, for eksempel bilder, har en enkelt 1x-skalaversjon, slik at størrelsen på ressurspakker som vist i Xcode, ikke vil redusere på grunn av app-snitting.

Konklusjon

On-demand ressurser i iOS 9 og tvOS er en fin måte å redusere størrelsen på appen din og gi en bedre brukeropplevelse til folk som laster ned og bruker programmet. Selv om det er veldig enkelt å implementere og sette opp, er det ganske mange detaljer som du må huske på for at hele on-demand ressurssystemet skal fungere feilfritt uten overdreven lastetider og unødvendig rensing av data.

Som alltid, vær sikker på å legge igjen dine kommentarer og tilbakemeldinger i kommentarene nedenfor.