Eine Einführung in On-Demand-Ressourcen für iOS und tvOS

Einführung

Neben iOS 9 und watchOS 2 hat Apple On-Demand-Ressourcen eingeführt, eine neue API, mit der Inhalte für Ihre Anwendungen bereitgestellt werden können, während gleichzeitig der Platzbedarf der Anwendung auf dem Gerät des Benutzers reduziert wird. Mit On-Demand-Ressourcen können Sie bestimmte Ressourcen Ihrer Anwendung mit einem Tag versehen und auf den Servern von Apple hosten lassen, sodass Ihre Benutzer sie bei Bedarf herunterladen können. In diesem Tutorial werde ich Ihnen die Grundlagen von On-Demand-Ressourcen zeigen, indem Sie eine grundlegende Anwendung für die Bildbetrachter erstellen.

Voraussetzungen

Für dieses Lernprogramm müssen Sie Xcode 7+ ausführen und mit der iOS-Entwicklung vertraut sein. Sie müssen auch das Starterprojekt GitHub herunterladen.

1. Ressourcen auf Abruf

Leistungen

In iOS 9 und watchOS 2 wurden On-Demand-Ressourcen eingeführt, um den Speicherplatz zu reduzieren, den einzelne Apps auf einem Gerät beanspruchen. Ein weiterer wichtiger Vorteil von On-Demand-Ressourcen besteht darin, dass Ihre App von Benutzern viel schneller heruntergeladen und geöffnet werden kann.

On-Demand-Ressourcen funktionieren durch Zuweisung von unique Stichworte Ressourcen innerhalb von Xcode erstellen, um ein sogenanntes Asset Pack. Diese Pakete können alles aus Asset-Katalogen (Bilder, SpriteKit-Texturen, Daten usw.) oder auch nur andere Dateien wie OpenGL- und Metal-Shader sowie SpriteKit- und SceneKit-Szenen und Partikelsysteme enthalten.

Wenn Sie Ihre App an den App Store senden, werden diese Ressourcen ebenfalls hochgeladen und dort gehostet, um sie jederzeit herunterladen zu können. Um Asset-Pakete zur Laufzeit in einer App herunterzuladen, verwenden Sie einfach das Tag für jedes in Xcode zugewiesene Paket.

Kategorien

Die zwei Hauptaspekte einer App, die Ressourcen auf Abruf verwendet, sind die App-Paket, Das ist voll von ausführbarem Code für Ihre App und wichtigen Elementen, wie z. B. Symbolen für die Benutzeroberfläche und Asset-Packs.

Für diese Asset-Packs gibt es drei Hauptkategorien, die Sie in Xcode organisieren können:

  • Erstinstallation: Dies ist für Inhalte, die für die erste Ausführung Ihrer App erforderlich sind, die jedoch später gelöscht werden können. Dies kann die ersten Level eines Spiels umfassen, die nicht mehr benötigt werden, wenn der Spieler weit genug in das Spiel eintritt.
  • Vorausgeholt: Diese Kategorie enthält Inhalte, die sofort nach Abschluss der Installation heruntergeladen werden sollen. Diese Art von Inhalt wird für Ressourcen empfohlen, die nicht erforderlich sind, damit Ihre App nach der Installation funktioniert, die aber für eine bessere Benutzererfahrung erforderlich sind. Ein gutes Beispiel sind Tutorials für ein Spiel.
  • Auf Nachfrage: Diese Kategorie richtet sich an Inhalte, die Sie zu einem späteren Zeitpunkt benötigen, und Ihre App kann ohne funktionieren. Wenn Sie mit On-Demand-Ressourcen arbeiten, ist dies die am häufigsten verwendete Kategorie.

Grenzen

Apps, die mit Unterstützung für On-Demand-Ressourcen ausgestattet sind, müssen auch hinsichtlich der Dateigröße die folgenden Beschränkungen einhalten:

  • 2 GB für die iOS-App-Paket
  • 2 GB für das initial installieren Stichworte
  • 2 GB für die vorabgerufen Stichworte
  • 2 GB für Betriebsmittel. Dies ist nur wichtig, wenn Ihre Anwendung ausgeführt wird und Ressourcen auf Abruf verwendet werden.
  • 512 MB für jedes einzelne Asset-Pack. Kein einzelnes Tag kann mehr als diese Datenmenge enthalten. Wenn Sie dieses Limit überschreiten, gibt Xcode eine Warnung aus und ermöglicht Ihnen, Ihre App weiterhin zu testen und zu entwickeln. Alle Übermittlungsversuche an den App Store schlagen jedoch fehl.
  • 20 GB für alle von Apple gehosteten Ressourcen. Dies ist die Gesamtmenge an Ressourcen, die Ihre App gleichzeitig herunterladen kann. Während nur 2 GB gleichzeitig verwendet werden können, können auf einem Gerät eines Benutzers mit ausreichend Speicherplatz bis zu 20 GB Ihrer Ressourcen jederzeit heruntergeladen und für Ihre App verfügbar gemacht werden.

App Slicing

Beachten Sie, dass der Gesamtwert von 20 GB nicht berücksichtigt wird App in Scheiben schneiden während alle anderen Summen dies tun. Was ist App-Slicing? App-Slicing ist eine weitere Funktion, die in iOS 9 eingeführt wurde, um die Größe von Anwendungen zu reduzieren. Dabei werden nur die Ressourcen betrachtet, die für das Gerät spezifisch sind, auf dem die App installiert wird. Wenn beispielsweise Asset-Kataloge korrekt verwendet werden, muss eine App, die auf einem iPhone 6 Plus oder 6s Plus installiert ist, nur die 3-fach-Skalierung herunterladen und sich nicht um die 1x- und 2x-Skalen kümmern. Bei On-Demand-Ressourcen entspricht die Gesamtmenge von 20 GB, die Sie auf die App Store-Server hochladen können, der Gesamtmenge alles Gerätetypen. Alle anderen Grenzwerte beziehen sich auf jedes spezifische Gerät, auf dem Ihre App installiert wird.

On-Demand-Ressourcen löschen

In Bezug auf das Löschen (Löschen) von Daten werden Asset Packs, die von Ihrer App heruntergeladen wurden, nur entfernt, wenn auf dem Gerät, auf dem Ihre App installiert ist, der verfügbare Speicherplatz zur Verfügung steht. In diesem Fall prüft das On-Demand-Ressourcensystem alle Apps auf dem Gerät. Wenn Sie eine auswählen, wird die Eigenschaft der Aufbewahrung jedes Asset-Packs sowie der Zeitpunkt der letzten Verwendung angezeigt. Zu beachten ist, dass Asset-Packs für Ihre App niemals gelöscht werden, während Ihre App ausgeführt wird.

2. Tags zuweisen und organisieren

Öffnen Sie das Starterprojekt in Xcode und führen Sie die App im iOS-Simulator aus. Im Moment enthält diese grundlegende App eine Sammlung von Bildern, die jeweils eine der drei Farben (rot, grün oder blau) und eine der vier Formen (Kreis, Quadrat, Stern oder Sechseck) enthalten. Navigieren Sie bei laufender App zu Farben> Rot Auf dem Bildschirm wird ein einzelnes rotes Kreisbild angezeigt.

In dieser App werden wir insgesamt sieben Asset-Packs einrichten, eines für jede Farbe und eines für jede Form. Eine weitere großartige Funktion von On-Demand-Ressourcen besteht darin, dass einer einzelnen Ressource mehr als ein Tag zugewiesen werden kann. Der rote Kreis kann zum Beispiel Teil von beiden sein rot Asset Pack und Kreis Asset Pack.

Die On-Demand-Ressourcen-API ist auch intelligent genug, um dieselbe Ressource nicht zweimal herunterzuladen oder zu kopieren. Mit anderen Worten, wenn bereits eine Anwendung heruntergeladen wurde rot Asset Pack und wollte dann das laden Kreis Das Asset-Pack würde das rote Kreisbild nicht erneut herunterladen.

Öffnen Sie in Xcode Assets.xcassets. Sie sollten alle zwölf Bilder wie unten gezeigt sehen.

Als nächstes wählen Sie die Blaues Quadrat Bild einstellen und öffnen Attribute-Inspektor zur Rechten.

Sie werden das sehen Attribute-Inspektor enthält ein neues On-Demand-Ressourcen-Tags Abschnitt, in dem Sie jeder Ressource Tags zuweisen. Geben Sie für den blauen quadratischen Bildsatz ein Blau und Quadrat in dem On-Demand-Ressourcen-Tags Feld. Dies bedeutet, dass dem Image-Set jetzt zwei Tags zugewiesen sind.

Beachten Sie, dass das Starterprojekt bereits Ressource-Tags für neun der zwölf Bildsätze enthält. Dies erklärt, warum Xcode Ihnen bei der Eingabe dieser Tags Optionen für die automatische Vervollständigung bietet.

Nachdem Sie die Zuweisung von Tags für die Blaues Quadrat Fügen Sie für beide Bilder die richtigen Tags hinzu Grünes Sechseck und Roter Kreis Bildsätze wie unten gezeigt.

Wenn die On-Demand-Ressource-Tags korrekt eingerichtet sind, öffnen Sie die Projektnavigator auf der Linken. Öffne das Ressourcen-Tags Tab oben und wählen Sie die Vorabgerufen Filter oben.

Sie können jetzt sehen, wie groß jedes Asset-Pack ist und welche Ressourcen sich in jedem befinden. Das Alles Der Filter zeigt Ihnen jede der On-Demand-Ressourcen. Das Vorabgerufen Der Filter zeigt die On-Demand-Ressourcen pro Kategorie an und ermöglicht das Verschieben von Ressourcen von einer Kategorie in eine andere:

  • Tags für die Erstinstallation
  • Vorabgeholte Tag-Reihenfolge
  • Nur bei Bedarf herunterladen

Diese Abschnitte spiegeln die drei Kategorien von Asset-Paketen wider, die ich zuvor skizziert habe. Es ist wichtig zu wissen, dass die Asset-Packs, die Sie in die Vorabgeholte Tag-Reihenfolge Der Abschnitt wird in der Reihenfolge, in der sie angezeigt werden, heruntergeladen.

Wenn jedem Image-Set Tags zugewiesen sind, ist es an der Zeit, auf die Ressourcen im Projekt zuzugreifen.

3. Zugriff auf Ressourcen bei Bedarf

Der Zugriff auf Asset Packs, die auf den App Store-Servern gehostet werden, wird von den neuen verwaltet NSBundleResourceRequest Klasse. Eine Instanz dieser Klasse wird mit einer Reihe von Tags erstellt, die Sie verwenden möchten. Sie teilt dem System mit, wie Sie die entsprechenden Asset-Packs verwenden. Die Freigabe von diesen NSBundleResourceRequest Objekte ist die beste und einfachste Möglichkeit, das Betriebssystem mitzuteilen, wenn Sie ein bestimmtes Asset-Pack nicht mehr verwenden. Dies ist wichtig, damit Sie die Grenze von 2 GB für die verwendeten Ressourcen nicht überschreiten.

Öffnen Sie in Ihrem Projekt DetailViewController.swift und fügen Sie die folgende Eigenschaft hinzu DetailViewController Klasse.

var request: NSBundleResourceRequest!

Als nächstes ersetzen Sie Ihre viewDidAppear (_ :) Methode mit der folgenden:

func viewDidAppear überschreiben (animiert: Bool) super.viewDidAppear (animiert) request = NSBundleResourceRequest (tags: [tagToLoad]) request.beginAccessingResourcesWithCompletionHandler (Fehler: NSError?) -> Void in // NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Void in self.displayImages ())

Mit diesem Code initialisieren Sie zuerst die anfordern Eigenschaft mit einem Set, das ein einzelnes Tag enthält. Der Satz von Tags, die Sie für diesen Initialisierer bereitstellen, enthält Zeichenfolgenwerte. In diesem Fall verwenden wir die tagToLoad Diese Eigenschaft wird von den vorherigen View-Controllern in der Anwendung festgelegt.

Als Nächstes beginnen wir mit dem Herunterladen der Asset Packs für die angegebenen Tags beginAccessingResourcesWithCompletionHandler (_ :). Diese Methode greift auf alle Ressourcen mit den angegebenen Tags zu und startet bei Bedarf automatisch einen Download. Nachdem Sie auf diese Weise auf die Ressourcen zugegriffen haben, bleibt der gesamte andere Code zum Laden dieser Ressourcen in Ihre App unverändert.

Wenn Sie nur auf bereits heruntergeladene Ressourcen zugreifen möchten, ohne Inhalte zu laden, können Sie das verwenden conditionallyBeginAccessingResourcesWithCompletionHandler (_ :) Methode.

Wie im obigen Code gezeigt, ist es wichtig, dass Sie an diesen Beendigungshandler denken, dass er in einem Hintergrundthread aufgerufen wird. Dies bedeutet, dass alle Benutzeroberflächen-Updates, die Sie nach Abschluss durchführen möchten, im Haupt-Thread ausgeführt werden müssen.

Erstellen und starten Sie Ihre App erneut, und wählen Sie eine Farbe oder Form aus, die in der App angezeigt werden soll. Sie sollten alle drei farbigen Bilder für eine bestimmte Form oder alle vier Formen für eine bestimmte Farbe sehen.

So einfach ist es, On-Demand-Ressourcen einzusetzen. Sie haben nun erfolgreich On-Demand-Ressourcen in einer Anwendung implementiert.

Eine wichtige Debugging-Funktion in Xcode 7 ist die Möglichkeit, zu sehen, welche Asset Packs Sie heruntergeladen haben und welche verwendet werden. Um dies anzuzeigen, navigieren Sie zu Debug-Navigator mit Ihrer App und wählen Sie Platte. Sie sehen einen Bildschirm ähnlich dem unten gezeigten. On-Demand-Ressourcen ist der Abschnitt, an dem wir interessiert sind.

Als Beispiel ändern wir nun die Download-Priorität, sodass einige Ressourcen immer sofort heruntergeladen werden. Gleichzeitig werden wir die Prioritäten für die Aufbewahrung der Asset Packs ändern, so dass die Hexagon und Star Asset Packs werden vor dem Löschen gelöscht Kreis und Quadrat Asset-Packs. Aktualisieren Sie die Implementierung von viewDidAppear (_ :) Methode wie unten gezeigt.

override func viewDidAppear (animiert: Bool) super.viewDidAppear (animiert) request = NSBundleResourceRequest (tags: [tagToLoad]) request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent NSBundle.mainBund (). ]) NSBundle.mainBundle (). SetPreservationPriority (0.5, forTags: ["Hexagon", "Star"]) request.beginAccessingResourcesWithCompletionHandler (error: NSError?) -> Void in // Im Hintergrund aufgerufen, wenn error == nil  NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Void in self.displayImages ())

Nach dem Initialisieren der Anfrage setzen wir das loadingPriority Eigentum an NSBundleResourceRequestLoadingPriorityUrgent. Alternativ können Sie eine beliebige Nummer zwischen vergeben 0,0 und 1,0 auf diese Eigenschaft, um die Ladepriorität in Ihrer App festzulegen.

Die Verwendung dieser Konstante hat den Vorteil, dass der Anforderung automatisch die höchste Priorität beim Laden zugewiesen wird, die aktuelle CPU-Aktivität jedoch nicht berücksichtigt wird. Wenn die CPU des Geräts häufig verwendet wird, kann der Download eines Asset Packs verzögert werden.

Als Nächstes legen wir die Priorität für die Erhaltung für alle vier Shape-Tags fest. Dies geschieht durch Aufrufen der setPreservationPriority (_: forTags :) Methode das Hauptpaket der Anwendung. Wir haben jetzt sichergestellt, dass, wenn das On-Demand-Ressourcensystem einige Assets aus unserer App entfernen muss, die Hexagon und Star Asset Packs werden zuerst gelöscht.

4. Best Practices

Nun, da Sie wissen, wie Sie On-Demand-Ressourcen in einer iOS-Anwendung implementieren, möchte ich Ihnen kurz einige bewährte Vorgehensweisen nennen, die Sie berücksichtigen sollten.

Halten Sie einzelne Tags so klein wie möglich

Wenn Sie die Downloadzeiten verkürzen und Ihre Ressourcen besser zugänglich machen, wird durch das Halten der einzelnen Asset-Packs das Überspülen des Systems verhindert. In diesem Fall muss das On-Demand-Ressourcensystem eine bestimmte Menge an Speicherplatz freigeben und letztendlich viel mehr als nötig freigeben.

Wenn zum Beispiel das System 50 MB Speicherplatz freigeben musste und aufgrund der zuvor genannten Bedingungen entschieden wurde, dass ein 400-MB-Asset-Pack aus Ihrer App am besten zum Löschen geeignet ist, würde das System 350 MB überschreiben. Das bedeutet, dass, wenn Ihre App mehr Daten als nötig verloren hat, alle Ressourcen, die mit diesem Tag verknüpft sind, erneut heruntergeladen werden müssen. Die empfohlene Größe für einzelne Tags beträgt ca. 64 MB.

Laden Sie Tags im Voraus herunter

Wenn Ihre App über eine sehr vorhersehbare Benutzerinteraktion verfügt, sollten Sie am besten Ressourcen herunterladen, bevor sie tatsächlich benötigt werden. Dadurch wird die Benutzererfahrung verbessert, da sie nicht auf einen Ladebildschirm starren müssen, während Ihre App Inhalte herunterlädt.

Spiele sind ein bekanntes Beispiel. Wenn der Spieler gerade Level 5 abgeschlossen hat, ist es ratsam, Level 7 herunterzuladen, während er Level 6 spielt.

Beenden Sie den korrekten Zugriff auf Ressourcen

Wenn Sie mit der Verwendung eines bestimmten Asset Packs fertig sind, stellen Sie sicher, dass entweder Ihr NSBundleResourceRequest Objekt wird freigegeben oder Sie rufen das an endAccessingResources Methode darauf.

Dadurch wird nicht nur vermieden, dass Ihre Anwendung das Limit von 2 GB für Ressourcen im Gebrauch erreicht, sondern auch, dass das On-Demand-Ressourcensystem erkennt, wann Ihre Anwendung diese Ressourcen verwendet. Dies bedeutet, dass Sie besser entscheiden können, was gelöscht werden soll, wenn mehr Speicherplatz zur Verfügung steht erforderlich.

5. On-Demand-Ressourcen für tvOS

Ich habe kürzlich über die Entwicklung von tvOS geschrieben und in diesem Tutorial habe ich die Einschränkungen von tvOS-Anwendungen erwähnt. Die maximale Größe eines App-Pakets beträgt 200 MB. Es wird daher dringend empfohlen, in Ihren tvOS-Apps nach Bedarf Ressourcen zu verwenden, wann immer dies möglich ist.

Aufgrund der Ähnlichkeiten von tvOS und iOS sind die APIs und Speichergrenzen (mit Ausnahme des App-Pakets) für On-Demand-Ressourcen gleich. Bei der Verwendung von On-Demand-Ressourcen in tvOS ist es jedoch auch wichtig zu bedenken, dass alle Assets (z. B. Bilder) über eine einzige 1-Skalierungsversion verfügen, sodass die Größe Ihrer Asset-Packs, wie in Xcode gezeigt, nicht durch das App-Slicing verringert wird.

Fazit

On-Demand-Ressourcen in iOS 9 und tvOS sind eine großartige Möglichkeit, um die Größe Ihrer App zu reduzieren und Benutzern, die Ihre Anwendung herunterladen und verwenden, eine bessere Benutzererfahrung zu bieten. Es ist zwar sehr einfach zu implementieren und einzurichten, aber es gibt einige Details, die Sie berücksichtigen müssen, damit das gesamte On-Demand-Ressourcensystem ohne übermäßige Ladezeiten und unnötiges Löschen von Daten einwandfrei funktioniert.

Wie immer sollten Sie Ihre Kommentare und Rückmeldungen in den nachstehenden Kommentaren hinterlassen.