Advertisement
  1. Code
  2. Mobile Development
  3. iOS Development

Введение в ресурсы по запросу для iOS и tvOS

Scroll to top
Read Time: 11 min

() translation by (you can also view the original English article)

Введение

Наряду с iOS 9 и watchOS 2 компания Apple представила ресурсы по запросу, новый API для доставки контента, уменьшающее объем пространства, которое приложение занимает на устройстве пользователя. Используя ресурсы по запросу вы можете отметить определенные активы вашего приложения, перенести их на сервер Apple, чтобы ваши пользователи могли загружать их по мере необходимости. В этом уроке я расскажу вам об основах ресурсов по запросу, создав простое приложение для просмотра изображений.

Необходимые условия

Для этого урока нам потребуется Xcode 7+ и навыки разработки для iOS. Также необходимо будет скачать стартовый проект на GitHub.

1. Ресурсы по требованию

Преимущества

Ресурсы по запросу были представлены в iOS 9 и watchOS 2 с основной целью - сократить объем занимаемого места в приложениях на устройстве. Другим важным преимуществом ресурсов по запросу является то, что ваше приложение может быть загружено и открыто пользователями намного быстрее.

Ресурсы по требованию работают, назначая уникальные теги ресурсам в Xcode, чтобы создать так называемый пакет активов. Эти пакеты могут включать в себя все, что связано с каталогами ресурсов (изображения, текстуры SpriteKit, данные и т. д.) Или даже с другими файлами, такими как OpenGL и Metal Shaders, а также сцены SpriteKit и SceneKit и системы частиц.

Когда вы отправляете свое приложение в App Store, эти ресурсы также загружаются и размещаются там для загрузки в любое время. Чтобы загрузить пакеты активов во время выполнения в приложении, вы просто используете тег для каждого пакета, который вы назначили в Xcode.

Категории

Двумя основными аспектами приложения, использующего ресурсы по требованию, являются пакет приложений, который заполнен исполняемым кодом для вашего приложения и основных активов, таких как значки пользовательского интерфейса и пакеты активов.

Для этих пакетов активов существуют три основные категории, которые вы можете организовать в Xcode:

  • Первоначальная установка: это для контента, который требуется для запуска приложения в первый раз, но его можно удалить позже. Это может включать в себя первые несколько уровней игры, которые больше не нужны, когда игрок продвигается достаточно далеко в игре.
  • Prefetched: эта категория включает контент, который вы хотите загрузить сразу после завершения установки. Этот тип контента рекомендуется для ресурсов, которые не требуются для работы вашего приложения после его установки, но которые необходимы для лучшего удобства пользователей. Хорошим примером являются учебники для игры.
  • On Demand: эта категория предназначена для контента, который вам нужен в более позднее время, и ваше приложение может функционировать без него. При работе с ресурсами по требованию это наиболее распространенный тип категории, который вы будете использовать.

Ограничения

Приложения, созданные с поддержкой ресурсов по требованию, также должны придерживаться следующих ограничений в отношении размера файла:

  • 2GB для пакета приложений для iOS
  • 2GB для начальных тегов установки
  • 2GB для предварительно выбранных тегов
  • 2ГБ для использования ресурсов. Это важно только при запуске приложения и использовании ресурсов по требованию.
  • 512МБ для каждого отдельного пакета активов. Ни один ярлык не может содержать больше, чем этот объем данных. Если вы перейдете этот предел, Xcode предоставит вам предупреждение и позволит вам еще тестировать и разрабатывать ваше приложение. Однако попытки подачи заявок в App Store потерпят неудачу.
  • 20ГБ для всех ресурсов, размещенных Apple. Это общий объем ресурсов, которые ваше приложение может загружать в любой момент времени. В то время как только 2 ГБ могут использоваться в любой момент времени, если на устройстве пользователя достаточно памяти, до 20 ГБ ваших ресурсов можно загрузить и сделать доступным для вашего приложения в любое время.

Нарезка приложений

Обратите внимание, что общая сумма в 20 ГБ не учитывает аппликацию приложений, пока все остальные суммы делают. Что такое нарезка приложений? Срезание приложений - еще одна функция, которая была внедрена в iOS 9 для уменьшения размера приложений. Он делает это, только просматривая ресурсы, специфичные для устройства, на котором установлено приложение. Например, если каталоги активов используются правильно, приложение, установленное на iPhone 6 Plus или 6s Plus, нужно загрузить только 3-кратные изображения и не беспокоиться о масштабах 1x и 2x. Для ресурсов по требованию 20 ГБ общих ресурсов, которые вы можете загрузить на серверы App Store, - это общая сумма для всех типов устройств. Все остальные ограничения предназначены для каждого конкретного устройства, на котором установлено приложение.

Удаление ресурсов по требованию

С точки зрения удаления данных (очистки) пакеты активов, загруженные вашим приложением, будут удалены только тогда, когда устройство, на котором установлено ваше приложение, исчерпало доступное пространство. Когда это произойдет, система ресурсов по требованию будет смотреть на все приложения на устройстве, и, выбрав ее, вы увидите свойство сохранения каждого пакета активов, а также когда оно было использовано в последний раз. Важно отметить, что пакеты активов для вашего приложения никогда не будут очищены во время работы вашего приложения.

2. Назначение и организация тегов

Откройте проект стартера в Xcode и запустите приложение в iOS Simulator. На данный момент это основное приложение содержит коллекцию изображений, каждая из которых имеет комбинацию одного из трех цветов (красного, зеленого или синего) и одной из четырех фигур (круг, квадрат, звезда или шестиугольник). При запуске приложения перейдите в «Цвета» > «Красный», и на экране появится одно изображение красного круга.

App MenuApp MenuApp Menu
Color MenuColor MenuColor Menu
Red CircleRed CircleRed Circle

В этом приложении мы собираемся создать в общей сложности семь пакетов активов, по одному для каждого цвета и по одному для каждой фигуры. Еще одна замечательная особенность ресурсов по требованию заключается в том, что одному ресурсу может быть назначено более одного тега. Красный круг, например, может быть частью как пакета Red активов, так и пакета активов Circle.

API ресурсов по требованию также достаточно умен, чтобы не загружать и не копировать один и тот же ресурс дважды. Другими словами, если приложение уже загрузило пакет Red asset, а затем захотелось загрузить пакет ресурсов Circle, изображение с красным кружком не будет загружено снова.

В Xcode откройте Assets.xcassets. Вы должны увидеть все двенадцать изображений, как показано ниже.

Asset CatalogAsset CatalogAsset Catalog

Затем выберите набор изображений Blue Square и откройте Attributes Inspector справа.

Attributes InspectorAttributes InspectorAttributes Inspector

Вы увидите, что инспектор атрибутов включает в себя новый раздел тегов ресурсов спроса, в котором вы указываете теги для каждого ресурса. Чтобы установить синий квадрат, введите «Синий» и «Квадрат» в поле «Метки ресурсов по запросу». Это означает, что у установленного изображения есть два присваиваемых им тега.

Blue Square tagsBlue Square tagsBlue Square tags

Обратите внимание, что стартовый проект уже включает теги ресурсов для девяти из двенадцати наборов изображений. Это объясняет, почему Xcode предоставляет параметры автозаполнения для вас при вводе этих тегов.

После того, как вы завершили назначение тегов для набора изображений Blue Square, добавьте правильные теги к наборам изображений Green Hexagon и Red Circle, как показано ниже.

Green Hexagon tagsGreen Hexagon tagsGreen Hexagon tags
Red Circle tagsRed Circle tagsRed Circle tags

Правильно настроенные метки ресурса по запросу, откройте навигатор проекта слева. Откройте вкладку «Теги ресурса» вверху и выберите «Предварительно установленный фильтр» вверху.

Tags OverviewTags OverviewTags Overview

Теперь вы можете увидеть, насколько велик каждый пакет активов и какие ресурсы находятся в каждом из них. Фильтр «Все» показывает вам каждый из ресурсов по требованию. Фильтр Prefetched показывает ресурсы по требованию для каждой категории и позволяет переместить ресурсы из одной категории в другую:

  • Исходные теги установки
  • Предварительно запрограммированный заказ тега
  • Скачать только по запросу

Эти разделы отражают три категории пакетов активов, которые я изложил ранее. Важно отметить, что пакеты активов, которые вы разместили в разделе «Предварительно загруженный тег», начнут загружаться в том порядке, в котором они появятся.

С тегами, назначенными каждому набору изображений, пришло время начать доступ к ресурсам в проекте.

3. Доступ к ресурсам по запросу

Доступ к пакетам активов, размещенным на серверах App Store, обрабатывается новым классом NSBundleResourceRequest. Экземпляр этого класса создается с помощью набора тегов, который вы хотите использовать. Он сообщает системе о вашем использовании соответствующих пакетов активов. Освобождение этих объектов NSBundleResourceRequest является наилучшим и простым способом сообщить операционной системе, когда вы больше не используете какой-либо конкретный пакет активов. Это важно, чтобы вы не превышали лимит 2 ГБ для ресурсов, которые используются.

В своем проекте откройте DetailViewController.swift и добавьте следующее свойство в класс DetailViewController.

1
var request: NSBundleResourceRequest!

Затем замените метод viewDidAppear(_:) следующим образом:

1
override func viewDidAppear(animated: Bool) {
2
     super.viewDidAppear(animated)
3
     
4
     request = NSBundleResourceRequest(tags: [tagToLoad])
5
     request.beginAccessingResourcesWithCompletionHandler { (error: NSError?) -> Void in
6
         //  Called on background thread

7
         if error == nil {
8
             NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
9
                 self.displayImages()
10
             })
11
         }
12
     }
13
 }

С помощью этого кода вы сначала инициализируете свойство request с помощью набора, который включает один тег. Набор тегов, которые вы предоставили этому инициализатору, содержит строковые значения. В этом случае мы используем свойство tagToLoad, которое задается предыдущими контроллерами представлений в приложении.

Затем мы начинаем загрузку пакетов активов для указанных тегов, вызывая beginAccessingResourcesWithCompletionHandler(_:). Этот метод будет обращаться ко всем ресурсам с указанными тегами и автоматически загрузит их при необходимости. После доступа к ресурсам таким образом весь ваш другой код для загрузки этих ресурсов в ваше приложение остается прежним.

Обратите внимание: если вы хотите получить доступ только к ресурсам, которые уже были загружены, без загрузки содержимого, вы можете использовать метод conditionalBeginAccessingResourcesWithCompletionHandler(_).

Как показано в приведенном выше коде, важно помнить об этом обработчике завершения, так как он вызывается в фоновом потоке. Это означает, что любые обновления пользовательского интерфейса, которые вы хотите выполнить после завершения, должны быть выполнены в основном потоке.

Создайте и запустите приложение снова и выберите цвет или форму для просмотра в приложении. Вы должны увидеть все три цветных изображения для определенной фигуры или всех четырех фигур для определенного цвета.

All Resources ShownAll Resources ShownAll Resources Shown

Так просто использовать ресурсы по требованию. Теперь вы успешно реализовали ресурсы по требованию в приложении.

Важной функцией отладки, доступной в Xcode 7, является возможность видеть, какие пакеты активов вы загрузили и какие из них используются. Чтобы просмотреть это, перейдите к Debug Navigator с запущенным приложением и выберите «Диск». Вы увидите экран, подобный показанному ниже. On Demand Resources - это раздел, который нас интересует.

On Demand Resources DebuggingOn Demand Resources DebuggingOn Demand Resources Debugging

В качестве примера давайте теперь изменим приоритет загрузки, чтобы сразу загрузить некоторые ресурсы. В то же время мы изменим приоритеты сохранения пакетов активов, чтобы пакеты активов Hexagon и Star были очищены до пакетов активов Circle и Square. Обновите реализацию метода viewDidAppear(_:), как показано ниже.

1
override func viewDidAppear(animated: Bool) {
2
     super.viewDidAppear(animated)
3
     
4
     request = NSBundleResourceRequest(tags: [tagToLoad])
5
     
6
     request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent
7
     NSBundle.mainBundle().setPreservationPriority(1.0, forTags: ["Circle", "Square"])
8
     NSBundle.mainBundle().setPreservationPriority(0.5, forTags: ["Hexagon", "Star"])
9
     
10
     request.beginAccessingResourcesWithCompletionHandler { (error: NSError?) -> Void in
11
         //  Called on background thread

12
         if error == nil {
13
             NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
14
                 self.displayImages()
15
             })
16
         }
17
     }
18
 }

После инициализации запроса мы устанавливаем свойство loadPriority NSBundleResourceRequestLoadingPriorityUrgent. В качестве альтернативы вы можете присвоить это значение между 0.0 и 1.0, чтобы диктовать приоритет загрузки в вашем приложении.

Преимущество использования этой константы состоит в том, что она автоматически дает запросу самый высокий приоритет загрузки, но также игнорирует текущую активность ЦП. В некоторых ситуациях, если процессор процессора используется в значительной степени, загрузка пакета активов может быть отложена.

Затем мы устанавливаем приоритет сохранения для всех четырех тегов формы. Это делается путем вызова метода setPreservationPriority(_:forTags:) основного пакета приложения. Мы теперь гарантировали, что если система ресурсов по требованию должна очистить некоторые активы от нашего приложения, пакеты активов Hexagon и Star будут удалены первыми.

4. Лучшие практики

Теперь, когда вы знаете, как реализовать ресурсы по требованию в приложении iOS, я хочу кратко рассказать вам о нескольких лучших практиках, которые следует учитывать.

Сохраняйте как можно меньше индивидуальных тегов

В дополнение к сокращению времени загрузки и повышению доступности ресурсов, максимально уменьшая количество активов, предотвращает чрезмерную очистку системы. Это когда система ресурсов по требованию должна освобождать определенное количество места и в итоге освобождает гораздо больше, чем необходимо.

Например, если системе необходимо высвободить 50 МБ пространства и, основываясь на упомянутых выше условиях, решили, что 400-мегабайтный пакет активов из вашего приложения был наиболее подходящим для удаления, система будет чрезмерно чистить 350 МБ. Это означает, что если ваше приложение потеряло больше данных, чем нужно, потребуется снова загрузить все ресурсы, связанные с этим тегом. Рекомендуемый размер для отдельных тегов составляет приблизительно 64МБ.

Загрузить теги в Advance

Если ваше приложение имеет очень предсказуемое взаимодействие с пользователем, то лучше начать загрузку ресурсов до того, как они действительно понадобятся. Это должно улучшить пользовательский опыт, так как им не нужно смотреть на экран загрузки, пока ваше приложение загружает контент.

Игры - общий пример. Если игрок только что завершил уровень 5, то неплохо начать загрузку уровня 7, пока она играет на уровне 6.

Правильно прекратите доступ к ресурсам

Когда вы закончите использовать определенный пакет активов, убедитесь, что ваш NSBundleResourceRequest объект освобожден или вы вызываете на нем метод endAccessingResources.

Это не только предотвратит попадание вашего приложения на ограничение 2 ГБ для использования ресурсов, но также поможет системе ресурсов по требованию узнать, когда ваше приложение использует эти ресурсы, а это значит, что он может лучше решить, что делать, если больше места необходимо.

5. Ресурсы по запросу для tvOS

Недавно я писал о развитии tvOS, и в этом уроке я упомянул об ограничениях приложений tvOS. Максимальный размер для пакета приложений - 200 МБ, поэтому настоятельно рекомендуется использовать ресурсы по требованию в ваших приложениях tvOS, когда это возможно.

Из-за сходства tvOS и iOS API и ограничения хранения (за исключением пакета приложений) для ресурсов по требованию одинаковы. Однако при работе с ресурсами по требованию на tvOS важно также помнить, что все активы, такие как изображения, имеют одну версию масштаба 1x, поэтому размер ваших пакетов активов, как показано в Xcode, не будет уменьшаться из-за наложения приложений.

Заключение

Ресурсы по требованию в iOS 9 и tvOS - отличный способ уменьшить размер вашего приложения и обеспечить лучший пользовательский интерфейс для пользователей, загружающих и использующих ваше приложение. Хотя его очень легко реализовать и настроить, есть немало деталей, которые вы должны иметь в виду, чтобы система ресурсов по требованию работала безупречно без чрезмерного времени загрузки и ненужной очистки данных.

Как всегда, не забудьте оставить свои комментарии и отзывы в комментариях ниже.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.