An Introduksjon til On-Demand Resources på iOS og tvOS
23
Del
10
Del
Dette Cyber Mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Innledning
I tillegg til iOS 9 og watchOS 2, introduserte Apple on-demand-ressurser, et nytt API for å levere innhold til dine applikasjoner samtidig redusere hvor mye plass det programmet tar opp på brukerens enhet. Med on-demand ressurser, kan du merke bestemte eiendeler i søknaden, har dem vert på Apples servere, slik at brukerne kan laste dem ned når det trengs. I denne opplæringen, skal jeg vise deg det grunnleggende on-demand-ressurser ved å skape en grunnleggende bildevisningsprogram.
Forutsetninger
Denne opplæringen forutsetter at du kjører Xcode 7+ og er kjent med iOS utvikling. Du må også laste ned starter prosjektet GitHub.
1. On-Demand Resources
Fordeler
On-demand ressurser ble introdusert i iOS 9 og watchOS 2 for det viktigste formålet med å redusere mengden av plass individuelle apps ta opp på en enhet. En annen viktig fordel med on-demand-ressurser er at applikasjonen kan lastes ned og åpnes av brukerne mye raskere.
On-demand ressurser arbeid ved å tildele unike koder til ressurser innen Xcode for å skape det som kalles en eiendel pack. Disse pakkene kan omfatte alt fra aktiva kataloger (bilder, SpriteKit teksturer, data osv) eller bare andre filer, for eksempel OpenGL og Metall shaders samt SpriteKit og SceneKit scener og partikkelsystemer.
Når du sende inn app til App Store, disse ressursene er også lastet opp og er vert det for å lastes ned når som helst. For å laste ned formues pakker under kjøring i en app, du bare bruke kode for hver pakke du tilordnet i Xcode.
Kategorier
De to viktigste aspektene ved en app som bruker on-demand-ressurser er app bunt, som er full av kjørbar kode for din app og viktige eiendeler, for eksempel ikoner brukergrensesnitt, og aktiva pakker.
For disse aktiva pakker, er det tre hovedkategorier som du kan organisere i Xcode :
Første Installer: Dette er for innhold som er nødvendig for din app for å kjøre for første gang, men det kan slettes senere. Dette kan omfatte de første nivåene i et spill, som ikke lenger er nødvendige når spilleren utvikler seg langt nok inn i spillet
forhåndshentet. Denne kategorien inkluderer innhold som du ønsker å lastes ned umiddelbart etter at programmet ditt er ferdig installere. Denne typen innhold er anbefalt for ressurser som ikke er nødvendig for programmet å fungere etter installasjon av det, men det er behov for en bedre brukeropplevelse. Et godt eksempel er tutorials for et spill
On Demand. Denne kategorien er rettet mot innhold som du trenger på et senere tidspunkt og din app kan fungere uten. Når du arbeider med on-demand-ressurser, er dette den vanligste typen av kategori du vil bruke.
Limits
Apps 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 bunt
2 GB for den innledende installere koder
2GB for forhåndshentet tags
2 GB for i bruk ressurser. Dette er bare viktig når søknaden er i gang og bruker on-demand-ressurser.
App Kutting
Merk at 20GB total ikke står for app kutting, mens alle de andre summer gjør. Hva er app slicing? App slicing er en annen funksjon som ble introdusert i iOS 9 for å redusere størrelsen på søknader. Det gjør den ved bare å se på de ressursene som er spesifikke for enheten at appen blir installert på. For eksempel, hvis aktiva kataloger brukes riktig, en applikasjon som er installert på en iPhone 6 Plus eller 6s Plus, trenger bare å laste ned 3x skalere bilder og ikke bekymre deg for 1x og 2x skalaer. For on-demand-ressurser, 20GB av totale ressurser du kan laste opp til App Store-servere er det totale beløpet på tvers av alle enhetstyper. Alle de andre grensene er for hver enkelt enhet appen blir installert på.
Slette On-Demand Resources
Når det gjelder sletting av data (purging), aktiva pakker som appen har lastet ned vil bare bli fjernet når enheten programmet er installert på går ut av tilgjengelig plass. Når dette skjer, vil on-demand ressurser system se på alle apps på enheten og ved å velge en vil se på bevaring eiendom av hver enkelt eiendel pakke samt når det sist ble brukt. En viktig ting å merke seg er at aktiva pakker for din app vil aldri bli renset mens programmet kjører.
2. Fastsettelse og Organizing Tags
Åpne starter prosjektet i Xcode og kjøre app i iOS Simulator. For øyeblikket inneholder denne grunnleggende app en samling av bilder hver med en kombinasjon av en av tre farger (rødt, grønt eller blått) og en av fire figurer (sirkel, firkant, stjerne, eller sekskant). Med app kjører, navigere til Farger > Rødt, og du vil se en eneste rød sirkel bildet som vises på skjermen.
I dette programmet, skal vi sette opp en totalt sju aktiva pakker, en for hver farge og en for hver form. En annen flott funksjon av on-demand-ressurser er at en enkelt ressurs kan tildeles mer enn én kode. Den røde sirkelen, for eksempel, kan være en del av både den røde eiendelen pakken og Circle aktivum pack.
Den on-demand ressurser API 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 den røde eiendelen pakke og deretter ønsket å laste Circle eiendelen pack, den røde sirkelen bildet ville ikke lastes ned på nytt.
I Xcode, åpne Assets.xcassets. Du bør se alle tolv bildene som vist nedenfor.
Deretter velger Blue Square bilde satt og åpne attributter Inspector til høyre.
Du vil se at attributter Inspector inkluderer en ny On kreve Resource Tags delen, som er der du tildele koder til hver ressurs. For den blå firkanten bildesett, skriver Blå og Square i On Demand Ressurs Tags feltet. Dette betyr at bildet satt nå har to koder tildelt.
Merk at starteren Prosjektet omfatter allerede ressurs koder for ni av de tolv bildesett. Dette forklarer hvorfor Xcode gir autofullføringsord alternativer for deg når du kom inn disse kodene.
Når du har fullført tildele koder for Blue Square bildesett, legger til de riktige kodene til både Grønn Hexagon og Red Circle bildesett som vist nedenfor.
Med on-demand ressurs tags riktig satt opp, åpne for prosjekt Navigator til venstre. Åpne kategorien Resource tagger på toppen og velg forhåndshentet filter på toppen.
Du kan nå se hvor stor hver enkelt eiendel pakken er, og nøyaktig hvilke ressurser som er i hver enkelt. All filter viser hver av de on-demand-ressurser. Den forhåndshentet filter viser on-demand ressurser per kategori og det kan du flytte ressurser fra en kategori til en annen:
Første Installer Tags
forhåndshentet Tag Bestill Anmeldelser
Last ned Only On Demand
Disse delene speile de tre kategoriene av aktiva pakker som jeg skissert tidligere. En viktig ting å merke seg er at aktiva pakker du putter i den forhåndshentet Tag Bestill delen vil begynne å laste ned i den rekkefølgen de vises i.
Med tags tildelt hver bildesett, er det på tide å begynne å få tilgang til ressurser i prosjektet.
3. Tilgang Resources on Demand
Tilgang aktiva pakker som ligger på App Store servere håndteres av den nye NSBundleResourceRequest klassen. En forekomst av denne klassen er laget med et sett med koder som du vil bruke. Den forteller systemet om din bruk av tilsvarende eiendel pakker. Den deallokering av disse NSBundleResourceRequest objekter er den beste og enkleste måten å fortelle operativsystemet når du ikke lenger bruker en bestemt ressurs pack. Dette er viktig slik at du ikke overskrider 2 GB grense for ressurser som er i bruk
I prosjektet, åpen DetailViewController.swift og legge til følgende eiendom til DetailViewController klassen
Var forespørsel..: ! NSBundleResourceRequest
Deretter erstatte viewDidAppear (_ :) metode med følgende:
styre func viewDidAppear (animert: Bool) {super.viewDidAppear (animert) request = NSBundleResourceRequest (tags: [tagToLoad]) request.beginAccessingResourcesWithCompletionHandler {: - > (feil NSError?) Ugyldig i //Kalt på bakgrunn tråd hvis feilen == null {NSOperationQueue.mainQueue () addOperationWithBlock ({() - > ugyldig i self.displayImages ()}).}}}
Med denne koden, må du først klargjøre forespørselen eiendommen med et sett som inkluderer en enkelt kode. Settet med tags du gir til dette initializer inneholder strengverdier. I dette tilfellet bruker vi tagToLoad eiendommen, som er satt av forrige visning kontrollere i søknaden.
Neste, vi begynner å laste ned aktivapakker for de angitte kodene ved å ringe beginAccessingResourcesWithCompletionHandler (_ :). Denne metoden vil få tilgang til alle ressurser med de angitte koder og vil automatisk starte en nedlasting hvis nødvendig. Etter få tilgang til ressurser på denne måten, forblir all annen kode for å laste disse ressursene inn i din app samme.
Legg merke til at hvis du ønsker å bare få tilgang til ressurser som allerede er lastet ned, uten lasting innhold, du kan bruke conditionallyBeginAccessingResourcesWithCompletionHandler (_ :) metoden.
Som vist i koden ovenfor, en viktig ting å huske om dette ferdigstillelse behandleren er at det kalles på bakgrunn tråd. Dette betyr at eventuelle brukergrensesnittet oppdateringer du ønsker å gjøre ved ferdigstillelse vil trenge å bli henrettet på hovedtråden.
Bygg og drive din app igjen og velge en farge eller form for å vise i appen. Du bør se alle tre fargede bilder for en bestemt form eller alle fire former for en bestemt farge.
Det er hvor enkelt det er å bruke on-demand-ressurser. Du har nå implementert on-demand-ressurser i en søknad.
En viktig debugging funksjonen tilgjengelig i Xcode 7 er muligheten til å se hvilke aktiva pakker du har lastet ned og hvilke som er i bruk. For å se dette, navigerer du til Debug Navigator med din app løping og velg Disk. Du vil se et skjermbilde som ligner på det som vises nedenfor. On Demand Resources er den delen som vi er interessert i.
Som et eksempel, la oss nå endre nedlastings prioritet, slik at noen ressurser er alltid ned umiddelbart. Samtidig vil vi endre bevaring prioriteringer aktiva pakker slik at Hexagon og Star aktivapakkene er renset før Circle og Square aktiva pakker. Oppdater gjennomføringen av viewDidAppear (_ :) metode som vist nedenfor
overstyring 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 {( ? error: NSError) - > Ugyldig i //Kalt på bakgrunn tråd hvis feilen == null {NSOperationQueue.mainQueue () addOperationWithBlock ({() - > ugyldig i self.displayImages ()}).}}}
Etter initialisering forespørselen, setter vi den loadingPriority eiendom til NSBundleResourceRequestLoadingPriorityUrgent. Alternativt kan du tilordne et tall mellom 0,0 og 1,0 på denne eiendommen for å diktere lasting prioritet i programmet ditt.
Fordelen med å bruke dette konstant er at det gir automatisk forespørselen høyeste lasting prioritet, men det ser bort også nåværende CPU aktivitet. I noen situasjoner, hvis enheten CPU blir brukt tungt, nedlasting av en eiendel pakken kan bli forsinket.
Deretter setter vi bevaring prioritet for alle fire form koder. Dette gjøres ved å ringe setPreservationPriority (_: forTags :) metode programmets hoved bunt. Vi har nå sikret at dersom on-demand ressurser systemet må rense noen eiendeler fra vår app, vil Hexagon og Star aktiva pakker slettes først.
4. Best Practices
Nå som du vet hvordan du skal gjennomføre on-demand-ressurser på en iOS program, vil jeg fortelle deg kort om noen beste praksis for å huske på.
Hold Individuelle Tags som liten som mulig
I tillegg til å redusere nedlastingstiden og gjør dine ressurser mer tilgjengelig, holder hver aktiva pakke så lite som mulig forhindrer systemet fra over-sletting. Dette er når on-demand ressurser systemet må frigjøre en viss plass og ender opp frigjøre mye mer enn nødvendig.
For eksempel, hvis systemet er nødvendig for å frigjøre 50 MB plass, og basert på de vilkår som er nevnt tidligere, besluttet at en 400MB ressurs pakken fra din app var den mest egnet til å bli slettet, vil systemet over-purge 350MB. Dette betyr at hvis din app har mistet mer data enn det måtte, vil det trenger å laste ned alle de ressursene som er tilknyttet den koden igjen. Den anbefalte størrelsen for individuelle koder er ca 64MB.
Last ned signaler på forhånd
Hvis programmet har en veldig forutsigbar brukermedvirkning, så er det best å starte nedlasting av ressurser før de faktisk trengs. Dette er for å forbedre brukeropplevelsen som de da slipper å stirre på en lasteskjerm mens app nedlastinger innhold.
Games er et vanlig eksempel. Dersom spilleren har nettopp fullført nivå 5, så er det en god idé å starte nedlastingen nivå 7 mens hun spiller nivå 6.
Stop tilgang til ressurser Korrekt
Når du er ferdig med å bruke en bestemt eiendel pakke Pass på at enten NSBundleResourceRequest objektet deallocated eller du ringe endAccessingResources metoden på det.
Ikke bare vil dette unngå din søknad treffer 2GB grense for i bruk ressurser, det vil også hjelpe on-demand systemressurser til å vite når din app bruker de ressursene, noe som betyr at det kan bedre bestemme hva du skal rense hvis dere trenger mer plass.
5. On-Demand Ressurser for tvOS
Jeg har nylig skrev om tvOS utvikling og i den opplæringen jeg nevnte begrensningene tvOS applikasjoner. Den maksimale størrelsen for en app bunt er 200MB, så det anbefales sterkt at du bruker on-demand-ressurser i dine tvOS apps når det er mulig.
På grunn av likheter i tvOS og iOS, APIene og lagring grenser (unntatt for app bundle) for on-demand-ressurser er de samme. Når du arbeider med on-demand-ressurser på tvOS, men det er også viktig å huske på at alle eiendeler, for eksempel bilder, har en eneste 1x skala versjonen så størrelsen på aktiva pakker som vist i Xcode ikke vil avta på grunn av app slicing .
Konklusjon
On-demand ressurser i iOS 9 og tvOS er en fin måte å redusere størrelsen på programmet ditt og levere en bedre brukeropplevelse til folk som laster ned og bruke applikasjonen. Selv om det er svært enkelt å implementere og sette opp, det er ganske mange detaljer som du må huske på for at hele on-demand ressurser systemet skal fungere feilfritt uten overdreven lastetider og unødvendig sletting av data.
Som alltid, sørg for å la dine kommentarer og tilbakemeldinger i kommentarfeltet nedenfor.