Un'introduzione alle risorse on-demand su iOS e tvOS

introduzione

Accanto a iOS 9 e watchOS 2, Apple ha introdotto risorse on-demand, una nuova API per la distribuzione di contenuti alle applicazioni riducendo allo stesso tempo la quantità di spazio che l'applicazione occupa sul dispositivo dell'utente. Con le risorse on-demand, puoi taggare risorse specifiche della tua applicazione, averli ospitati sui server Apple, consentendo agli utenti di scaricarli quando necessario. In questo tutorial, vi mostrerò le basi delle risorse on-demand creando un'applicazione di visualizzazione delle immagini di base.

Prerequisiti

Questo tutorial richiede che tu stia utilizzando Xcode 7+ e abbia familiarità con lo sviluppo di iOS. Dovrai anche scaricare il progetto di avviamento GitHub.

1. Risorse on-demand

Benefici

Le risorse on-demand sono state introdotte in iOS 9 e watchOS 2 per lo scopo principale di ridurre la quantità di spazio che le singole app occupano su un dispositivo. Un altro importante vantaggio delle risorse on-demand è che l'app può essere scaricata e aperta dagli utenti molto più rapidamente.

Le risorse su richiesta funzionano assegnando un servizio univoco tag alle risorse all'interno di Xcode per creare ciò che viene chiamato un asset pack. Questi pacchetti possono includere qualsiasi cosa, dai cataloghi delle risorse (immagini, texture SpriteKit, dati, ecc.) O anche solo ad altri file, come gli shader OpenGL e Metal così come le scene e i sistemi di particelle SpriteKit e SceneKit.

Quando invii la tua app all'App Store, queste risorse vengono anche caricate e ospitate lì per poter essere scaricate in qualsiasi momento. Per scaricare asset pack in fase di runtime in un'app, è sufficiente utilizzare il tag per ogni pacchetto assegnato in Xcode.

categorie

I due aspetti principali di un'app che utilizza risorse on-demand sono i pacchetto di app, che è pieno di codice eseguibile per la tua app e le risorse essenziali, come le icone dell'interfaccia utente e pacchetti di asset.

Per questi asset pack, ci sono tre categorie principali che puoi organizzare in Xcode:

  • Installazione iniziale: Questo è per il contenuto necessario per la prima esecuzione dell'app, ma può essere eliminato in seguito. Questo potrebbe includere i primi livelli di un gioco, che non sono più necessari una volta che il giocatore avanza abbastanza nel gioco.
  • precaricato: Questa categoria include i contenuti che si desidera scaricare immediatamente dopo aver completato l'installazione dell'applicazione. Questo tipo di contenuto è consigliato per le risorse che non sono necessarie per il funzionamento dell'app dopo l'installazione, ma che sono necessarie per una migliore esperienza utente. Un buon esempio sono i tutorial per un gioco.
  • Su richiesta: Questa categoria è destinata ai contenuti di cui hai bisogno in un secondo momento e la tua app può funzionare senza. Quando si lavora con risorse on-demand, questo è il tipo di categoria più comune che verrà utilizzato.

limiti

Le app create con il supporto per le risorse on-demand devono inoltre rispettare i seguenti limiti relativi alle dimensioni del file:

  • 2GB per il Pacchetto di app iOS
  • 2GB per l'ioinstallazione nitial tag
  • 2GB per il prefetching tag
  • 2GB per risorse in uso. Questo è importante solo quando l'applicazione è in esecuzione e utilizza risorse on-demand.
  • 512MB per ogni singolo pacchetto di attività. Nessun singolo tag può contenere più di questa quantità di dati. Se superi questo limite, Xcode ti avviserà e ti consentirà di testare e sviluppare la tua app. Qualsiasi tentativo di invio all'App Store, tuttavia, fallirà.
  • 20GB per tutte le risorse ospitate da Apple. Questa è la quantità totale di risorse che la tua app può scaricare in qualsiasi momento. Mentre è possibile utilizzare solo 2 GB alla volta, se il dispositivo di un utente dispone di spazio sufficiente, è possibile scaricare e rendere accessibili alla tua app fino a 20 GB di risorse in qualsiasi momento.

Affettatura dell'app

Si noti che il totale da 20 GB non tiene conto affettatura app mentre tutti gli altri totali lo fanno. Cos'è l'affettatura di app? L'affettatura delle app è un'altra funzionalità introdotta in iOS 9 per ridurre le dimensioni delle applicazioni. Lo fa guardando solo le risorse specifiche del dispositivo su cui è installata l'app. Ad esempio, se i cataloghi delle risorse sono utilizzati correttamente, un'app installata su iPhone 6 Plus o 6s Plus, deve solo scaricare le immagini in scala 3x e non preoccuparsi delle bilance 1x e 2x. Per le risorse su richiesta, il totale di 20 GB di risorse che è possibile caricare sui server App Store è l'importo totale tutti tipi di dispositivo. Tutti gli altri limiti sono relativi a ciascun dispositivo specifico su cui viene installata l'app.

Eliminazione delle risorse su richiesta

In termini di eliminazione dei dati (eliminazione), gli asset pack scaricati dalla tua app verranno rimossi solo quando il dispositivo su cui è installata l'app sta esaurendo lo spazio disponibile. In questo caso, il sistema di risorse su richiesta analizzerà tutte le app sul dispositivo e, una volta selezionato, verrà esaminata la proprietà di conservazione di ogni asset pack e anche quando è stata utilizzata l'ultima volta. Una cosa importante da notare è che gli asset pack per la tua app non verranno mai eliminati mentre la tua app è in esecuzione.

2. Assegnazione e organizzazione dei tag

Apri il progetto iniziale in Xcode ed esegui l'app in iOS Simulator. Al momento, questa app di base contiene una raccolta di immagini ciascuna con una combinazione di uno dei tre colori (rosso, verde o blu) e una delle quattro forme (cerchio, quadrato, stella o esagono). Con l'app in esecuzione, vai a Colori> Rosso e vedrete una singola immagine del cerchio rosso visualizzata sullo schermo.

In questa app, imposteremo un totale di sette asset pack, uno per ciascun colore e uno per ogni forma. Un'altra grande caratteristica delle risorse on-demand è che una singola risorsa può essere assegnata a più di un tag. Il cerchio rosso, ad esempio, può essere una parte di entrambi Rosso asset pack e Cerchio asset pack.

L'API delle risorse on-demand è anche abbastanza intelligente da non scaricare o copiare due volte la stessa risorsa. In altre parole, se un'applicazione ha già scaricato il file Rosso asset pack e poi volevo caricare il Cerchio asset pack, l'immagine del cerchio rosso non verrebbe più scaricata.

In Xcode, aperto Assets.xcassets. Dovresti vedere tutte e dodici le immagini come mostrato di seguito.

Quindi, selezionare il Blue Square immagine impostata e aprire il Ispettore degli attributi sulla destra.

Vedrai che il Ispettore degli attributi include un nuovo Tag di risorse su richiesta sezione, che è dove si assegnano i tag a ciascuna risorsa. Per il set di immagini quadrato blu, immettere Blu Piazza nel Tag di risorse su richiesta campo. Ciò significa che al set di immagini ora sono assegnati due tag.

Si noti che il progetto di base include già tag risorsa per nove dei dodici set di immagini. Questo spiega perché Xcode fornisce opzioni di completamento automatico per te quando inserisci questi tag.

Una volta completato l'assegnazione dei tag per Blue Square set di immagini, aggiungi i tag corretti a entrambi Esagono verdeCerchio rosso l'immagine si imposta come mostrato di seguito.

Con i tag risorsa su richiesta impostati correttamente, apri a Project Navigator sulla sinistra. Apri il Tag delle risorse scheda in alto e selezionare il prefetching filtro in alto.

Ora puoi vedere quanto è grande ciascun pacco di risorse e esattamente quali risorse ci sono in ciascuna. Il Tutti filtro mostra ciascuna delle risorse su richiesta. Il prefetching filtro mostra le risorse su richiesta per categoria e ti consente di spostare le risorse da una categoria all'altra:

  • Tag di installazione iniziale
  • Ordine di tag prefetched
  • Scarica solo su richiesta

Queste sezioni rispecchiano le tre categorie di pacchetti di risorse che ho delineato in precedenza. Una cosa importante da notare è che gli asset pack che hai inserito Ordine di tag prefetched la sezione inizierà il download nell'ordine in cui appaiono.

Con i tag assegnati a ciascun set di immagini, è ora di iniziare ad accedere alle risorse nel progetto.

3. Accesso alle risorse su richiesta

L'accesso ai pacchetti di asset che sono ospitati sui server App Store viene gestito dal nuovo NSBundleResourceRequest classe. Un'istanza di questa classe viene creata con un set di tag che si desidera utilizzare. Indica al sistema l'utilizzo dei pacchetti di asset corrispondenti. La deallocazione di questi NSBundleResourceRequest oggetti è il modo migliore e più semplice per comunicare al sistema operativo quando non si utilizza più un determinato pacchetto di risorse. Questo è importante in modo da non superare il limite di 2 GB per le risorse in uso.

Nel tuo progetto, apri DetailViewController.swift e aggiungere la seguente proprietà al DetailViewController classe.

richiesta var: NSBundleResourceRequest!

Quindi, sostituisci il tuo viewDidAppear (_ :) metodo con il seguente:

override func viewDidAppear (animato: Bool) super.viewDidAppear (animato) request = NSBundleResourceRequest (tag: [tagToLoad]) request.beginAccessingResourcesWithCompletionHandler (errore: NSError?) -> Void in // Chiamato sul thread in background se error == nil NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Void in self.displayImages ())

Con questo codice, si inizializza per la prima volta richiesta proprietà con un set che include un singolo tag. Il set di tag che fornisci a questo inizializzatore contiene valori di stringa. In questo caso, usiamo il tagToLoad proprietà, che è impostata dai precedenti controller di vista nell'applicazione.

Successivamente, iniziamo a scaricare gli asset pack per i tag specificati chiamando beginAccessingResourcesWithCompletionHandler (_ :). Questo metodo accederà a tutte le risorse con i tag specificati e avvierà automaticamente un download se necessario. Dopo aver effettuato l'accesso alle risorse in questo modo, tutto il tuo altro codice per caricare queste risorse nell'app rimane invariato.

Si noti che se si desidera accedere solo alle risorse che sono già state scaricate, senza caricare il contenuto, è possibile utilizzare il conditionallyBeginAccessingResourcesWithCompletionHandler (_ :) metodo.

Come mostrato nel codice sopra, una cosa importante da ricordare su questo gestore di completamento è che viene chiamato su un thread in background. Ciò significa che qualsiasi aggiornamento dell'interfaccia utente che si desidera eseguire al completamento dovrà essere eseguito sul thread principale.

Crea ed esegui nuovamente la tua app e scegli un colore o una forma da visualizzare nell'app. Dovresti vedere tutte e tre le immagini colorate per una forma specifica o tutte e quattro le forme per un colore specifico.

È così semplice usare le risorse on-demand. Ora hai implementato con successo le risorse on-demand in un'applicazione.

Una funzionalità di debug importante disponibile in Xcode 7 è la possibilità di vedere quali pacchetti di asset sono stati scaricati e quali sono in uso. Per vederlo, vai al Debug Navigator con la tua app in esecuzione e seleziona Disco. Vedrai una schermata simile a quella mostrata sotto. Risorse su richiesta è la sezione a cui siamo interessati.

Ad esempio, cambiamo ora la priorità di download in modo che alcune risorse vengano sempre scaricate immediatamente. Allo stesso tempo, modificheremo le priorità di conservazione degli asset pack in modo che Esagono Stella i pacchetti di asset vengono eliminati prima del CerchioPiazza pacchetti di asset. Aggiorna l'implementazione di viewDidAppear (_ :) metodo come mostrato di seguito.

override func viewDidAppear (animato: Bool) super.viewDidAppear (animato) request = NSBundleResourceRequest (tag: [tagToLoad]) request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent NSBundle.mainBundle (). setPreservationPriority (1.0, forTags: ["Circle", "Square" ]) NSBundle.mainBundle (). SetPreservationPriority (0.5, forTags: ["Hexagon", "Star"]) request.beginAccessingResourcesWithCompletionHandler (errore: NSError?) -> Void in // Chiamato sul thread in background se error == nil  NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Void in self.displayImages ())

Dopo aver inizializzato la richiesta, abbiamo impostato il loadingPriority proprietà a NSBundleResourceRequestLoadingPriorityUrgent. In alternativa, puoi assegnare qualsiasi numero tra 0.0 e 1.0 a questa proprietà per dettare la priorità di caricamento all'interno della tua app.

Il vantaggio di utilizzare questa costante è che assegna automaticamente alla richiesta la massima priorità di caricamento, ma ignora anche l'attività corrente della CPU. In alcune situazioni, se la CPU del dispositivo viene utilizzata pesantemente, il download di un pacchetto di asset può essere ritardato.

Successivamente, impostiamo la priorità di conservazione per tutti e quattro i tag di forma. Questo viene fatto chiamando il setPreservationPriority (_: forTags :) metodo il pacchetto principale dell'applicazione. Ora abbiamo assicurato che, se il sistema di risorse su richiesta deve eliminare alcune risorse dalla nostra app, il EsagonoStella gli asset pack verranno eliminati per primi.

4. Best Practices

Ora che sai come implementare risorse on-demand in un'applicazione iOS, voglio raccontarti brevemente alcune best practice da tenere a mente.

Mantieni i singoli tag più piccoli possibili

Oltre a ridurre i tempi di download e rendere le risorse più accessibili, mantenere ogni asset pack il più piccolo possibile evita che il sistema si espanda eccessivamente. Questo è quando il sistema di risorse su richiesta deve liberare una certa quantità di spazio e finisce per liberare molto più del necessario.

Ad esempio, se il sistema fosse necessario per liberare 50 MB di spazio e, in base alle condizioni menzionate in precedenza, decidesse che un pacchetto di 400 MB di asset dalla propria app fosse il più adatto per essere eliminato, il sistema eliminerebbe più di 350 MB. Ciò significa che se la tua app ha perso più dati del necessario, sarà necessario scaricare nuovamente tutte le risorse associate a quel tag. La dimensione consigliata per i singoli tag è di circa 64 MB.

Scarica tag in anticipo

Se la tua app ha un'interazione utente molto prevedibile, allora è meglio iniziare a scaricare risorse prima che siano effettivamente necessarie. Questo è per migliorare l'esperienza dell'utente in quanto non devono guardare una schermata di caricamento mentre l'app scarica contenuto.

I giochi sono un esempio comune. Se il giocatore ha appena completato il livello 5, allora è una buona idea iniziare a scaricare il livello 7 mentre gioca al livello 6.

Interrompere l'accesso alle risorse correttamente

Quando hai finito di utilizzare un determinato pacchetto di asset, assicurati che sia il tuo NSBundleResourceRequest oggetto è deallocato o si chiama il endAccessingResources metodo su di esso.

Non solo eviterà che l'applicazione raggiunga il limite di 2 GB per le risorse in uso, ma aiuterà anche il sistema delle risorse on-demand a sapere quando l'app utilizza tali risorse, il che significa che può decidere meglio cosa eliminare se lo spazio è maggiore necessaria.

5. Risorse on-demand per tvOS

Recentemente ho scritto sullo sviluppo di tvOS e in quel tutorial ho menzionato i limiti delle applicazioni tvOS. La dimensione massima per un pacchetto di app è di 200 MB, quindi è altamente raccomandato l'utilizzo di risorse on-demand nelle app di TVOS quando possibile.

A causa delle somiglianze di tvOS e iOS, le API e i limiti di archiviazione (ad eccezione del pacchetto di app) per le risorse on-demand sono gli stessi. Quando si lavora con le risorse on-demand su tvOS, è anche importante ricordare che tutte le risorse, come le immagini, hanno una singola versione in scala 1x, quindi la dimensione dei pacchetti di asset come mostrato in Xcode non diminuirà a causa dell'affettatura delle app.

Conclusione

Le risorse on-demand in iOS 9 e tvOS sono un ottimo modo per ridurre le dimensioni della tua app e offrire un'esperienza utente migliore a chi scarica e utilizza la tua applicazione. Sebbene sia molto facile da implementare e configurare, ci sono alcuni dettagli che è necessario tenere a mente perché l'intero sistema di risorse on-demand funzioni in modo impeccabile senza tempi di caricamento eccessivi e inutilmente eliminando i dati.

Come sempre, assicurati di lasciare i tuoi commenti e feedback nei commenti qui sotto.