Une introduction aux ressources à la demande sur iOS et tvOS

introduction

Parallèlement à iOS 9 et à watchOS 2, Apple a introduit des ressources à la demande, une nouvelle API permettant de diffuser du contenu vers vos applications tout en réduisant l'espace occupé par l'application sur le périphérique de l'utilisateur. Avec des ressources à la demande, vous pouvez baliser des actifs spécifiques de votre application, les héberger sur des serveurs Apple, permettant ainsi à vos utilisateurs de les télécharger en cas de besoin. Dans ce tutoriel, je vais vous montrer les bases des ressources à la demande en créant une application de visualisation d'images de base..

Conditions préalables

Ce tutoriel nécessite que vous exécutiez Xcode 7+ et que vous maîtrisiez le développement iOS. Vous devrez également télécharger le projet de démarrage GitHub.

1. Ressources à la demande

Avantages

Des ressources à la demande ont été introduites dans iOS 9 et watchOS 2 dans le but principal de réduire l’espace occupé par les applications individuelles sur un appareil. Un autre avantage important des ressources à la demande est que votre application peut être téléchargée et ouverte par les utilisateurs beaucoup plus rapidement..

Les ressources à la demande fonctionnent en assignant des Mots clés aux ressources au sein de Xcode pour créer ce qu'on appelle un pack d'actifs. Ces packs peuvent inclure n’importe quel élément des catalogues de ressources (images, textures SpriteKit, données, etc.) ou même d’autres fichiers, tels que des shaders OpenGL et Metal, ainsi que des scènes et des systèmes de particules SpriteKit et SceneKit..

Lorsque vous soumettez votre application sur l'App Store, ces ressources sont également téléchargées et hébergées sur ce site afin d'être téléchargées à tout moment. Pour télécharger des packs d'actifs au moment de l'exécution dans une application, il vous suffit d'utiliser la balise pour chaque pack que vous avez attribué à Xcode..

Les catégories

Les deux principaux aspects d’une application utilisant des ressources à la demande sont les suivants: ensemble d'applications, qui est plein de code exécutable pour votre application et des actifs essentiels, tels que les icônes de l'interface utilisateur, et packs d'actifs.

Pour ces packs d'actifs, il existe trois catégories principales que vous pouvez organiser dans Xcode:

  • Installation initiale: Ceci concerne le contenu nécessaire à la première exécution de votre application, mais peut être supprimé ultérieurement. Cela pourrait inclure les premiers niveaux d'un jeu, qui ne sont plus nécessaires lorsque le joueur progresse suffisamment dans le jeu..
  • Pré-récupéré: Cette catégorie comprend le contenu que vous souhaitez télécharger immédiatement après l'installation de votre application. Ce type de contenu est recommandé pour les ressources qui ne sont pas nécessaires au fonctionnement de votre application après son installation, mais qui sont nécessaires à une meilleure expérience utilisateur. Un bon exemple sont les tutoriels pour un jeu.
  • À la demande: Cette catégorie est destinée au contenu dont vous avez besoin ultérieurement et à laquelle votre application peut ne pas fonctionner. Lorsque vous travaillez avec des ressources à la demande, il s’agit du type de catégorie le plus courant..

Limites

Les applications qui prennent en charge les ressources à la demande doivent également respecter les limites suivantes en ce qui concerne la taille du fichier:

  • 2 Go pour le Lot d'applications iOS
  • 2 Go pour le jeinstallation nitiale Mots clés
  • 2 Go pour le pré-récupéré Mots clés
  • 2 Go pour les ressources en cours d'utilisation. Ceci est important uniquement lorsque votre application est en cours d'exécution et utilise des ressources à la demande..
  • 512Mo pour chaque atout individuel. Aucune balise ne peut contenir plus que cette quantité de données. Si vous dépassez cette limite, Xcode vous avertira et vous permettra de tester et de développer votre application. Toute tentative de soumission à l'App Store échouera cependant.
  • 20 Go pour toutes les ressources hébergées par Apple. Il s’agit de la quantité totale de ressources que votre application peut éventuellement télécharger à tout moment. Alors que seulement 2 Go peuvent être utilisés à la fois, si le périphérique d'un utilisateur dispose de suffisamment de stockage, vous pouvez télécharger jusqu'à 20 Go de vos ressources et les rendre accessibles à tout moment à votre application..

Découpage d'application

Notez que le total de 20 Go ne représente pas découpage d'application alors que tous les autres totaux le font. Qu'est-ce que le découpage d'application? Le découpage d'application est une autre fonctionnalité introduite dans iOS 9 pour réduire la taille des applications. Pour ce faire, il ne recherche que les ressources spécifiques à l'appareil sur lequel l'application est en cours d'installation. Par exemple, si les catalogues d'actifs sont utilisés correctement, une application installée sur un iPhone 6 Plus ou 6s Plus n'a besoin que de télécharger les images à l'échelle 3x et ne vous inquiétez pas des échelles 1x et 2x. Pour les ressources à la demande, les 20 Go de ressources totales que vous pouvez télécharger sur les serveurs de l'App Store correspondent à la quantité totale sur tout types d'appareils. Toutes les autres limites s'appliquent à chaque périphérique spécifique sur lequel votre application est en cours d'installation..

Suppression de ressources à la demande

En termes de suppression de données (purge), les packs d'actifs que votre application a téléchargés ne seront supprimés que lorsque le périphérique sur lequel votre application est installée est à court d'espace disponible. Lorsque cela se produit, le système de ressources à la demande examine toutes les applications de l'appareil et, lors de la sélection, examine les propriétés de conservation de chaque pack d'actifs, ainsi que la date de la dernière utilisation. Une chose importante à noter est que les packs d'actifs de votre application ne seront jamais purgés tant que votre application est en cours d'exécution..

2. Affectation et organisation des balises

Ouvrez le projet de démarrage dans Xcode et exécutez l'application dans le simulateur iOS. Pour le moment, cette application de base contient une collection d'images combinant chacune l'une des trois couleurs (rouge, vert ou bleu) et l'une des quatre formes (cercle, carré, étoile ou hexagone). Avec l'application en cours d'exécution, accédez à Couleurs> Rouge et vous verrez une seule image de cercle rouge affichée à l'écran.

Dans cette application, nous allons configurer un total de sept packs d'actifs, un pour chaque couleur et un pour chaque forme. Une autre caractéristique intéressante des ressources à la demande est qu’une ressource unique peut être affectée à plusieurs balises. Le cercle rouge, par exemple, peut faire partie à la fois de la rouge pack d'actifs et Cercle pack d'actifs.

L'API des ressources à la demande est également suffisamment intelligente pour ne pas télécharger ni copier deux fois la même ressource. En d’autres termes, si une application avait déjà téléchargé le fichier rouge atout pack et ensuite voulu charger le Cercle ensemble d’actifs, l’image du cercle rouge ne serait pas téléchargée à nouveau.

Dans Xcode, ouvrez Assets.xcassets. Vous devriez voir les douze images comme indiqué ci-dessous.

Ensuite, sélectionnez le Blue Square jeu d'images et ouvrez le Inspecteur d'attributs sur la droite.

Vous verrez que le Inspecteur d'attributs comprend un nouveau Tags de ressources à la demande section, où vous affectez des balises à chaque ressource. Pour le jeu d’images carré bleu, entrez Bleu et Carré dans le Tags de ressources à la demande champ. Cela signifie que le jeu d'images a maintenant deux balises assignées.

Notez que le projet de démarrage inclut déjà des balises de ressource pour neuf des douze ensembles d'images. Ceci explique pourquoi Xcode fournit des options de complétion automatique lorsque vous avez saisi ces balises..

Une fois que vous avez fini d’attribuer des étiquettes au Blue Square jeu d’images, ajoutez les balises correctes à la fois Hexagone vert et Cercle rouge ensembles d'images comme indiqué ci-dessous.

Avec les balises de ressources à la demande correctement configurées, ouvrez le Navigateur de projet sur la gauche. Ouvrez le Tags de ressources onglet en haut et sélectionnez le Pré-récupéré filtre en haut.

Vous pouvez maintenant voir la taille de chaque groupe de ressources et les ressources correspondantes. le Tout Le filtre vous montre chacune des ressources à la demande. le Pré-récupéré Le filtre affiche les ressources à la demande par catégorie et vous permet de les déplacer d'une catégorie à une autre:

  • Balises d'installation initiale
  • Commande d'étiquette pré-récupérée
  • Télécharger uniquement sur demande

Ces sections reflètent les trois catégories de groupes d'actifs que j'ai décrites précédemment. Une chose importante à noter est que les packs d'actifs que vous mettez dans le Commande d'étiquette pré-récupérée section commencera à télécharger dans l'ordre dans lequel ils apparaissent dans.

Avec des balises assignées à chaque ensemble d'images, il est temps de commencer à accéder aux ressources du projet..

3. Accéder aux ressources sur demande

L'accès aux packs d'actifs hébergés sur les serveurs de l'App Store est géré par la nouvelle NSBundleResourceRequest classe. Une instance de cette classe est créée avec un ensemble de balises que vous souhaitez utiliser. Il informe le système de votre utilisation des packs d'actifs correspondants. La désallocation de ces NSBundleResourceRequest Objets est le moyen le plus simple et le plus simple d’indiquer au système d’exploitation que vous n’utilisez plus d’actifs Ceci est important pour ne pas dépasser la limite de 2 Go pour les ressources en cours d'utilisation..

Dans votre projet, ouvrez DetailViewController.swift et ajoutez la propriété suivante à la DetailViewController classe.

demande var: NSBundleResourceRequest!

Ensuite, remplacez votre viewDidAppear (_ :) méthode avec ce qui suit:

fonction de remplacement viewDidAppear (animée: Bool) super.viewDidAppear (animée) request = NSBundleResourceRequest (tags: [tagToLoad]) request.beginAccessingResourcesWithCompletionHandler (erreur: NSError?) -> Void in background of id NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Annuler dans self.displayImages ())

Avec ce code, vous initialisez d’abord le demande propriété avec un ensemble qui comprend une seule balise. L'ensemble de balises que vous fournissez à cet initialiseur contient des valeurs de chaîne. Dans ce cas, nous utilisons le tagToLoad propriété, qui est définie par les contrôleurs de vue précédents dans l'application.

Ensuite, nous commençons à télécharger les packs d'actifs pour les balises spécifiées en appelant beginAccessingResourcesWithCompletionHandler (_ :). Cette méthode accédera à toutes les ressources avec les balises spécifiées et lancera automatiquement un téléchargement si nécessaire. Après avoir accédé aux ressources de cette manière, tout votre autre code permettant de charger ces ressources dans votre application reste le même..

Notez que si vous souhaitez uniquement accéder aux ressources déjà téléchargées, sans charger de contenu, vous pouvez utiliser la commande conditionallyBeginAccessingResourcesWithCompletionHandler (_ :) méthode.

Comme indiqué dans le code ci-dessus, il est important de se rappeler que ce gestionnaire d'achèvement est appelé sur un thread en arrière-plan. Cela signifie que toutes les mises à jour de l'interface utilisateur que vous souhaitez effectuer à la fin de l'opération devront être exécutées sur le thread principal..

Générez et exécutez à nouveau votre application, puis choisissez une couleur ou une forme à afficher dans l'application. Vous devriez voir les trois images colorées pour une forme spécifique ou les quatre formes pour une couleur spécifique..

C'est simple d'utiliser des ressources à la demande. Vous avez maintenant implémenté avec succès des ressources à la demande dans une application.

Une fonctionnalité importante de débogage disponible dans Xcode 7 est la possibilité de voir quels packs d'actifs vous avez téléchargés et ceux qui sont en cours d'utilisation. Pour voir cela, naviguez vers le Navigateur de débogage avec votre application en cours d'exécution et sélectionnez Disque. Vous verrez un écran similaire à celui présenté ci-dessous. Ressources sur demande est la section qui nous intéresse.

Par exemple, changeons maintenant la priorité de téléchargement pour que certaines ressources soient toujours téléchargées immédiatement. Dans le même temps, nous modifierons les priorités de conservation des packs d’actifs afin que le Hexagone et Étoile les packs d’actifs sont purgés avant la Cercle et Carré packs d'actifs. Mettre à jour la mise en œuvre de la viewDidAppear (_ :) méthode comme indiqué ci-dessous.

override func viewDidAppear (animée: Bool) super.viewDidAppear (animée) request = NSBundleResourceRequest (tags: [tagToLoad]) request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent NSBolle.Malle ]) NSBundle.mainBundle (). SetPreservationPriority (0.5, forTags: ["Hexagon", "Star"]) request.beginAccessingResourcesWithCompletionHandler (erreur: NSError?) -> Nul dans // Appelé sur le thread d'arrière-plan si erreur == nil  NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Annuler dans self.displayImages ())

Après l’initialisation de la demande, nous définissons le chargementPriorité propriété à NSBundleResourceRequestLoadingPriorityUrgent. Sinon, vous pouvez attribuer un nombre quelconque entre 0.0 et 1,0 à cette propriété afin de dicter la priorité de chargement dans votre application.

L’utilisation de cette constante présente l’avantage de donner automatiquement à la requête la priorité de chargement la plus élevée, tout en ignorant l’activité du processeur en cours. Dans certaines situations, si le processeur du périphérique est fortement utilisé, le téléchargement d'un pack d'actifs peut être différé..

Ensuite, nous définissons la priorité de conservation pour les quatre étiquettes de forme. Ceci est fait en appelant le setPreservationPriority (_: forTags :) méthode le bundle principal de l'application. Nous nous sommes maintenant assurés que, si le système de ressources à la demande devait purger certains actifs de notre application, Hexagone et Étoile les packs d'actifs seront supprimés en premier.

4. Meilleures pratiques

Maintenant que vous savez comment implémenter des ressources à la demande dans une application iOS, je voudrais vous expliquer brièvement quelques meilleures pratiques à garder à l'esprit..

Gardez les étiquettes individuelles aussi petites que possible

En plus de réduire les temps de téléchargement et de rendre vos ressources plus accessibles, la taille réduite de chaque pack d'actifs empêche le système de se vider de son contenu. C’est à ce moment-là que le système de ressources à la demande doit libérer une certaine quantité d’espace et finit par libérer beaucoup plus que nécessaire..

Par exemple, si le système devait libérer 50 Mo d’espace et si, en fonction des conditions susmentionnées, il estimait qu’un pack de ressources de 400 Mo de votre application était le mieux à supprimer, le système sur-purgerait 350 Mo de plus. Cela signifie que si votre application a perdu plus de données que nécessaire, elle devra télécharger à nouveau toutes les ressources associées à cette balise. La taille recommandée pour les balises individuelles est d'environ 64 Mo.

Télécharger les balises à l'avance

Si votre application a une interaction utilisateur très prévisible, il est préférable de commencer à télécharger les ressources avant qu'elles ne soient réellement nécessaires. Cela améliore l'expérience de l'utilisateur, car il n'a alors pas besoin de regarder l'écran de chargement pendant que votre application télécharge du contenu..

Les jeux sont un exemple courant. Si la joueuse vient de terminer le niveau 5, il est judicieux de commencer à télécharger le niveau 7 pendant qu’elle joue le niveau 6..

Arrêter l'accès aux ressources correctement

Lorsque vous avez terminé d’utiliser un pack d’actifs particulier, assurez-vous que votre NSBundleResourceRequest objet est désalloué ou vous appelez le endAccèsRessources méthode sur elle.

Cela évitera non seulement à votre application d'atteindre la limite de 2 Go pour les ressources en cours d'utilisation, mais aidera également le système de ressources à la demande à savoir quand votre application utilise ces ressources, ce qui signifie qu'elle peut mieux décider quoi purger si davantage d'espace est disponible. nécessaire.

5. Ressources à la demande pour tvOS

J'ai récemment écrit sur le développement de tvOS et dans ce tutoriel, j'ai mentionné les limitations des applications tvOS. La taille maximale d'un ensemble d'applications est de 200 Mo. Il est donc vivement recommandé d'utiliser, dans la mesure du possible, les ressources à la demande de vos applications tvOS..

En raison des similitudes entre tvOS et iOS, les API et les limites de stockage (à l'exception du bundle d'applications) pour les ressources à la demande sont les mêmes. Toutefois, lorsque vous utilisez des ressources à la demande sur tvOS, il est également important de noter que tous les actifs, tels que les images, ont une seule version à l'échelle 1x afin que la taille de vos packs d'actifs, telle qu'elle est illustrée dans Xcode, ne diminue pas en raison du découpage d'application..

Conclusion

Les ressources à la demande d'iOS 9 et de tvOS constituent un excellent moyen de réduire la taille de votre application et de fournir une meilleure expérience utilisateur aux personnes qui téléchargent et utilisent votre application. Bien qu'il soit très facile à mettre en œuvre et à configurer, vous devez garder à l'esprit un certain nombre de détails pour que l'ensemble du système de ressources à la demande fonctionne parfaitement, sans temps de chargement excessif ni purge inutile des données..

Comme toujours, assurez-vous de laisser vos commentaires dans les commentaires ci-dessous.