Een inleiding tot on-demand-bronnen op iOS en tvOS

Invoering

Naast iOS 9 en watchOS 2 introduceerde Apple on-demand bronnen, een nieuwe API voor het leveren van content aan uw applicaties, terwijl ook de hoeveelheid ruimte die de applicatie opneemt op het apparaat van de gebruiker, wordt verminderd. Met on-demand resources kunt u specifieke assets van uw applicatie labelen, ze laten hosten op de servers van Apple, zodat uw gebruikers ze kunnen downloaden wanneer dat nodig is. In deze zelfstudie laat ik u de basisbeginselen van on-demand bronnen zien door een eenvoudige image viewer-toepassing te maken.

voorwaarden

Deze tutorial vereist dat je Xcode 7+ gebruikt en bekend bent met de ontwikkeling van iOS. Je moet ook het startersproject GitHub downloaden.

1. Resources op aanvraag

Voordelen

On-demand bronnen werden geïntroduceerd in iOS 9 en watchOS 2 met als hoofddoel het verminderen van de hoeveelheid ruimte die individuele apps innemen op een apparaat. Een ander belangrijk voordeel van on-demand bronnen is dat uw app veel sneller kan worden gedownload en geopend door gebruikers.

On-demand bronnen werken door het toewijzen van unieke labels naar bronnen binnen Xcode om een ​​zogenaamd een te maken activapakket. Deze pakketten kunnen alles omvatten uit activacatalogi (afbeeldingen, SpriteKit-structuren, gegevens, enz.) Of zelfs gewoon andere bestanden, zoals OpenGL en Metal shaders, evenals SpriteKit- en SceneKit-scènes en deeltjessystemen.

Wanneer u uw app naar de App Store verzendt, worden deze bronnen ook geüpload en worden ze daar gehost om op elk gewenst moment te kunnen worden gedownload. Als u asset packs tijdens runtime in een app wilt downloaden, gebruikt u eenvoudigweg de tag voor elk pakket dat u in Xcode hebt toegewezen.

Categorieën

De twee belangrijkste aspecten van een app die on-demand bronnen gebruikt, zijn de app-bundel, die vol zit met uitvoerbare code voor uw app en essentiële voorzieningen, zoals pictogrammen voor gebruikersinterfaces, en activapakketten.

Voor deze asset packs zijn er drie hoofdcategorieën die u in Xcode kunt ordenen:

  • Eerste installatie: Dit is voor inhoud die nodig is om uw app voor de eerste keer uit te voeren, maar die later kan worden verwijderd. Dit kunnen de eerste paar niveaus van een game zijn, die niet langer nodig zijn als de speler ver genoeg in de game is.
  • vooraf op te halen: Deze categorie bevat inhoud die u wilt downloaden onmiddellijk nadat uw app de installatie heeft voltooid. Dit type inhoud wordt aanbevolen voor bronnen die niet vereist zijn voor uw app om te functioneren na de installatie, maar die nodig zijn voor een betere gebruikerservaring. Een goed voorbeeld zijn tutorials voor een game.
  • Op aanvraag: Deze categorie is gericht op inhoud die u op een later tijdstip nodig heeft en uw app kan zonder functioneren. Wanneer u met bronnen op aanvraag werkt, is dit het meest voorkomende type categorie dat u zult gebruiken.

grenzen

Apps die zijn gebouwd met ondersteuning voor on-demand bronnen moeten zich ook aan de volgende limieten houden met betrekking tot de bestandsgrootte:

  • 2GB voor de iOS-app-bundel
  • 2GB voor de initial installeren labels
  • 2GB voor de vooraf op te halen labels
  • 2GB voor gebruikte bronnen. Dit is alleen belangrijk wanneer uw toepassing wordt uitgevoerd en on-demand resources gebruikt.
  • 512MB voor elk individueel activapakket. Geen enkele tag kan meer dan deze hoeveelheid gegevens bevatten. Als je deze limiet overschrijdt, geeft Xcode je een waarschuwing en kun je nog steeds je app testen en ontwikkelen. Elke poging tot inzending voor de App Store mislukt echter.
  • 20GB voor alle bronnen die door Apple worden gehost. Dit is het totale aantal bronnen dat uw app op elk gewenst moment kan downloaden. Hoewel slechts 2 GB tegelijk kan worden gebruikt, als het apparaat van een gebruiker voldoende opslagcapaciteit heeft, kan op elk gewenst moment tot 20 GB aan uw bronnen worden gedownload en voor uw app toegankelijk worden gemaakt.

App-slicing

Merk op dat het totaal van 20 GB geen rekening houdt met app-slicing terwijl alle andere totalen doen. Wat is app-slicing? App-slicing is een andere functie die werd geïntroduceerd in iOS 9 om de grootte van applicaties te verminderen. Het doet dit door alleen naar de bronnen te kijken die specifiek zijn voor het apparaat waarop de app wordt geïnstalleerd. Als bijvoorbeeld activacatalogi correct worden gebruikt, hoeft een app die is geïnstalleerd op een iPhone 6 Plus of 6s Plus alleen de 3x schaalafbeeldingen te downloaden en hoeft u zich geen zorgen te maken over de 1x- en 2x-schalen. Voor resources op aanvraag is de totale hoeveelheid van 20 GB die u naar de App Store-servers kunt uploaden het totale bedrag allemaal apparaattypen. Alle andere limieten zijn voor elk specifiek apparaat waarop uw app wordt geïnstalleerd.

On-demand bronnen verwijderen

Wat betreft het verwijderen van gegevens (opschonen), worden activapakketten die uw app heeft gedownload, alleen verwijderd wanneer het apparaat waarop uw app is geïnstalleerd, te weinig beschikbare ruimte heeft. Wanneer dit gebeurt, zal het hulpbronnensysteem op aanvraag alle apps op het apparaat bekijken en bij het selecteren van een systeem wordt gekeken naar de bewaareigenschap van elk activapakket en ook wanneer het voor het laatst werd gebruikt. Een belangrijk ding om op te merken is dat activapakketten voor uw app nooit zullen worden leeggemaakt terwijl uw app wordt uitgevoerd.

2. Tags toewijzen en ordenen

Open het startersproject in Xcode en voer de app uit in de iOS Simulator. Op dit moment bevat deze basisapp een verzameling afbeeldingen met elk een combinatie van een van de drie kleuren (rood, groen of blauw) en een van de vier vormen (cirkel, vierkant, ster of zeshoek). Terwijl de app wordt uitgevoerd, navigeert u naar Kleuren> Rood en u zult een enkele rode cirkelafbeelding op het scherm zien verschijnen.

In deze app gaan we in totaal zeven asset packs instellen, één voor elke kleur en één voor elke shape. Een andere geweldige functie van on-demand bronnen is dat een enkele bron meer dan één tag kan worden toegewezen. De rode cirkel kan bijvoorbeeld deel uitmaken van beide Rood activapakket en Cirkel activapakket.

De API voor on-demand resources is ook slim genoeg om dezelfde bron niet tweemaal te downloaden of te kopiëren. Met andere woorden, als een app al de Rood asset pack en wilde vervolgens de Cirkel activapakket, zou de afbeelding met de rode cirkel niet opnieuw worden gedownload.

Open in Xcode Assets.xcassets. U zou alle twaalf afbeeldingen moeten zien zoals hieronder getoond.

Selecteer vervolgens de Blue Square afbeelding instellen en open de Kenmerken Inspector aan de rechterkant.

Je zult zien dat het Kenmerken Inspector bevat een nieuw On-demand resource tags sectie, waar u aan elke resource tags toewijst. Voor de blauwe vierkante afbeeldingset, voert u in Blauw en Plein in de On-demand resource tags veld. Dit betekent dat de afbeelding nu is voorzien van twee tags.

Merk op dat het startersproject al resourcetags bevat voor negen van de twaalf afbeeldingsets. Dit verklaart waarom Xcode voorziet in opties voor automatisch aanvullen wanneer u deze tags invoert.

Zodra u klaar bent met het toewijzen van tags voor de Blue Square image set, voeg de juiste tags toe aan beide Groene zeshoek en Rode cirkel afbeelding wordt ingesteld zoals hieronder wordt weergegeven.

Zorg dat de resourcetags op aanvraag correct zijn ingesteld en open deze Project Navigator aan de linkerzijde. Open de Resource Tags tab aan de bovenkant en selecteer de vooraf op te halen filter bovenaan.

U kunt nu zien hoe groot elk activumpakket is en wat voor resources er allemaal in zitten. De Allemaal filter toont u alle on-demand bronnen. De vooraf op te halen filter toont de on-demand bronnen per categorie en het laat je middelen verplaatsen van de ene categorie naar de andere:

  • Initiële installatie-tags
  • Prefetched Tag Order
  • Download Only On Demand

Deze secties weerspiegelen de drie categorieën van activapakketten die ik eerder heb geschetst. Een belangrijk ding om op te merken is dat de asset packs die u in de Prefetched Tag Order sectie begint met downloaden in de volgorde waarin ze verschijnen.

Met tags die aan elke set afbeeldingen zijn toegewezen, is het tijd om toegang te krijgen tot de bronnen in het project.

3. Toegang tot Resources on Demand

Toegang tot activapakketten die worden gehost op de App Store-servers wordt afgehandeld door de nieuwe NSBundleResourceRequest klasse. Een exemplaar van deze klasse is gemaakt met een set tags die u wilt gebruiken. Het vertelt het systeem over uw gebruik van de bijbehorende activapakketten. De deallocatie van deze NSBundleResourceRequest objecten is de beste en gemakkelijkste manier om het besturingssysteem te vertellen wanneer u niet langer een bepaald activapakket gebruikt. Dit is belangrijk zodat u de limiet van 2 GB voor de gebruikte bronnen niet overschrijdt.

In uw project, open DetailViewController.swift en voeg de volgende eigenschap toe aan de DetailViewController klasse.

var request: NSBundleResourceRequest!

Vervang vervolgens uw viewDidAppear (_ :) methode met de volgende:

override func viewDidAppear (geanimeerd: Bool) super.viewDidAppear (geanimeerd) request = NSBundleResourceRequest (tags: [tagToLoad]) request.beginAccessingResourcesWithCompletionHandler (error: NSError?) -> Void in // Wordt gebeld op background thread if error == nil NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Void in self.displayImages ())

Met deze code initialiseert u eerst de verzoek eigenschap met een set die een enkele tag bevat. De set met tags die u aan deze initialisatie verstrekt, bevat tekenreekswaarden. In dit geval gebruiken we de tagToLoad eigenschap, die is ingesteld door de vorige view controllers in de applicatie.

Vervolgens beginnen we met het downloaden van de activapakketten voor de opgegeven tags beginAccessingResourcesWithCompletionHandler (_ :). Deze methode heeft toegang tot alle bronnen met de opgegeven tags en start indien nodig automatisch een download. Nadat u op deze manier toegang hebt verkregen tot de bronnen, blijft al uw andere code voor het laden van deze bronnen in uw app hetzelfde.

Houd er rekening mee dat als u alleen toegang wilt tot bronnen die al zijn gedownload, zonder inhoud te laden, u de. Kunt gebruiken conditionallyBeginAccessingResourcesWithCompletionHandler (_ :) methode.

Zoals te zien is in de bovenstaande code, is een belangrijk ding om te onthouden over deze voltooiingshandler dat deze wordt opgeroepen op een achtergrondthread. Dit betekent dat alle updates van de gebruikersinterface die u wilt maken na voltooiing moeten worden uitgevoerd op de hoofdthread.

Bouw en voer uw app opnieuw uit en kies een kleur of vorm om te bekijken in de app. Je zou alle drie de gekleurde afbeeldingen voor een specifieke vorm of alle vier vormen voor een specifieke kleur moeten zien.

Zo simpel is het om on-demand bronnen te gebruiken. U hebt nu on-demand resources met succes geïmplementeerd in een applicatie.

Een belangrijke foutopsporingsfunctie die beschikbaar is in Xcode 7 is de mogelijkheid om te zien welke activapakketten u hebt gedownload en welke in gebruik zijn. Om dit te bekijken, navigeert u naar de Debug Navigator met uw app actief en selecteer Schijf. U ziet een scherm zoals hieronder afgebeeld. On Demand Resources is de sectie waarin we geïnteresseerd zijn.

Laten we als voorbeeld nu de downloadprioriteit wijzigen, zodat sommige bronnen altijd meteen worden gedownload. Tegelijkertijd zullen we de preserveringsprioriteiten van de asset packs veranderen, zodat de Zeshoek en Ster activapakketten worden verwijderd vóór de Cirkel en Plein activapakketten. Update de implementatie van de viewDidAppear (_ :) methode zoals hieronder getoond.

override func viewDidAppear (geanimeerd: Bool) super.viewDidAppear (geanimeerd) 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?) -> Void in // Wordt gebeld op background thread if error == nil  NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Void in self.displayImages ())

Na het initialiseren van het verzoek, stellen we de loadingPriority eigendom aan NSBundleResourceRequestLoadingPriorityUrgent. U kunt ook een willekeurig getal tussen toewijzen 0.0 en 1.0 aan deze eigenschap om de laadprioriteit in uw app te dicteren.

Het voordeel van het gebruik van deze constante is dat deze de aanvraag automatisch de hoogste laadprioriteit geeft, maar ook de huidige CPU-activiteit negeert. In sommige situaties, als de CPU van het apparaat zwaar wordt gebruikt, kan het downloaden van een asset pack worden vertraagd.

Vervolgens stellen we de preserveringsprioriteit in voor alle vier vormlabels. Dit wordt gedaan door het setPreservationPriority (_: forTags :) methode de hoofdbundel van de toepassing. We hebben er nu voor gezorgd dat, als het on-demand hulpbronnensysteem bepaalde assets uit onze app moet verwijderen, de Zeshoek en Ster asset packs worden eerst verwijderd.

4. Best Practices

Nu u weet hoe u on-demandbronnen moet implementeren in een iOS-applicatie, wil ik u kort vertellen over enkele praktische tips om in gedachten te houden.

Houd individuele tags zo klein mogelijk

Naast het verminderen van de downloadtijden en het toegankelijker maken van uw bronnen, voorkomt u dat elk activumpakket zo klein mogelijk is en voorkomt het systeem te veel. Dit is wanneer het on-demand hulpbronnensysteem een ​​bepaalde hoeveelheid ruimte moet vrijmaken en uiteindelijk veel meer vrijmaakt dan nodig is.

Als het systeem bijvoorbeeld 50 MB aan ruimte moest vrijmaken en, op basis van de eerder genoemde voorwaarden, besloot dat een 400 MB activapakket van uw app het meest geschikt was om te worden verwijderd, zou het systeem 350 MB te veel opschonen. Dit betekent dat als uw app meer gegevens heeft verloren dan nodig was, deze alle bronnen die aan die tag zijn gekoppeld, opnieuw moet downloaden. De aanbevolen grootte voor afzonderlijke tags is ongeveer 64 MB.

Tags van tevoren downloaden

Als uw app een zeer voorspelbare gebruikersinteractie heeft, is het het beste om middelen te downloaden voordat ze daadwerkelijk nodig zijn. Dit is om de gebruikerservaring te verbeteren, omdat ze dan niet naar een laadscherm hoeven te staren terwijl uw app inhoud downloadt.

Spellen zijn een bekend voorbeeld. Als de speler net level 5 heeft voltooid, is het een goed idee om level 7 te gaan downloaden terwijl ze level 6 speelt.

Stop met het correct openen van bronnen

Wanneer u klaar bent met het gebruik van een bepaald activapakket, moet u ervoor zorgen dat uw NSBundleResourceRequest object is deallocated of je belt het endAccessingResources methode erop.

Dit voorkomt niet alleen dat uw toepassing de limiet van 2 GB overschrijdt voor in gebruik zijnde bronnen, maar helpt het on-demand systeem ook om te weten wanneer uw app die bronnen gebruikt, wat betekent dat het beter kan bepalen wat te verwijderen als er meer ruimte is nodig zijn.

5. On-Demand Resources voor tvOS

Ik heb onlangs geschreven over tvOS-ontwikkeling en in die tutorial noemde ik de beperkingen van tvOS-applicaties. De maximale grootte voor een app-bundel is 200 MB, dus het wordt ten zeerste aanbevolen dat u indien mogelijk on-demand bronnen in uw tvOS-apps gebruikt..

Vanwege de overeenkomsten tussen tvOS en iOS zijn de API's en opslaglimieten (behalve de app-bundel) voor on-demand resources hetzelfde. Wanneer u werkt met on-demand bronnen op tvOS, is het echter ook belangrijk om te onthouden dat alle elementen, zoals afbeeldingen, één enkele schaalversie hebben, zodat het formaat van uw activapakketten zoals weergegeven in Xcode niet zal afnemen vanwege app-slicing.

Conclusie

On-demand bronnen in iOS 9 en tvOS zijn een geweldige manier om de omvang van uw app te verkleinen en een betere gebruikerservaring te bieden aan mensen die uw toepassing downloaden en gebruiken. Hoewel het zeer eenvoudig te implementeren en in te stellen is, zijn er nogal wat gegevens waar u rekening mee moet houden zodat het hele on-demand bronnenysteem perfect werkt zonder overmatige laadtijden en onnodig zuiverende gegevens.

Laat zoals altijd uw opmerkingen en feedback achter in de opmerkingen hieronder.