Каждый год Apple выпускает новый iPhone, постепенно увеличивая объём оперативной и основной памяти, увеличивая мощность чипа. Сегодня на iPhone 15 уже можно запускать консольные игры типа «Обитель зла 4». И может возникнуть логичный вопрос – стоит ли оптимизировать размер своего приложения или можно не тратить на него больше времени?
Короче говоря, оптимизировать размер все же стоит. В этой статье я собрал причины, почему это важно, и предложил некоторые полезные методы оптимизации.
Итак, начнем с самого банального ответа на вопрос «Почему размер имеет значение?» - Ограничения App Store. App Store Connect просто не позволит вам загрузить файл, размер которого превышает указанный предел.
Для приложений iOS и tvOS убедитесь, что ваше приложение не превышает максимальные размеры файлов в поддерживаемых операционных системах. Общий размер вашего приложения в несжатом виде не должен превышать 4 ГБ.
Приложения Apple Watch должны иметь размер менее 75 МБ. Кроме того, каждый исполняемый файл Mach-O — например, имя_приложения.приложение/имя_приложения — не должен превышать эти максимальные размеры файла.
Связь
Конкретные файлы, на которые они ссылаются, могут немного сбить с толку. Чтобы лучше это понять, давайте рассмотрим процесс отправки вашего приложения в App Store Connect.
Первым шагом является создание архива. В этом архиве хранится коллекция артефактов сборки и связанная информация для приложений iOS, macOS, watchOS или tvOS.
У нас есть возможность посмотреть, что именно и в каком виде включено в архив.
Среди основных файлов вы найдете:
Папка «Продукты» с вашим приложением;
dSYMs, (сокращение от «символы отладки»), специальные файлы, генерируемые Xcode с информацией, необходимой для отладки, короче говоря, журналы сбоев;
Инфо.plist;
Кстати, файл приложения также можно открыть с помощью «Показать содержимое пакета», и среди файлов вы найдете исполняемый файл и CodeResources, результат подписания кода; он отслеживает цифровые подписи различных ресурсов приложения (изображений и т. д.).
Возвращаясь обратно в Xcode, после создания архива вам доступна кнопка Distribute App
. На этом этапе .xcarchive превращается в .ipa .
Файл .ipa можно рассматривать как сжатый пакет, включающий папку «Полезная нагрузка». Внутри этой папки «Полезная нагрузка» находится основной пакет «YourApp.app». В пакете «.app» вы найдете все важные компоненты вашего приложения, включая такие ресурсы, как
Кроме того, в нем размещены ресурсы для подписи кода, обеспечивающие целостность и безопасность приложения.
Чтобы просмотреть содержимое вашего .ipa , нажмите Export
после распространения», преобразуйте тип из .ipa в .zip и просто извлеките его.
Таким образом, файл .ipa — это упакованное приложение, которое конечные пользователи устанавливают на свои устройства iOS, а файл .xcarchive — это архив, ориентированный на разработчиков, который содержит различные ресурсы и информацию о сборке приложения.
Файл .ipa используется для распространения, а файл .xcarchive — для отладки, архивирования и дальнейшей разработки. С другой стороны, исполняемый файл — это центральный код, выполняющий функции приложения и содержащийся в пакете .ipa .
Таким образом, ограничения AppStore можно проиллюстрировать следующим образом.
Версия ОС | IPA-размер | .ipa -> Полезная нагрузка -> Приложение -> размер exe |
---|---|---|
iOS 9.0 и более поздние версииTVOS 9.0 и более поздние версии | 4ГБ | 500 МБ |
iOS 7.X – iOS 8.X | 2 ГБ | 60 МБ |
Однако, чтобы оценить размер вашего конечного приложения, то есть сколько байт тот или иной пользователь должен будет установить на свое устройство, вам потребуются дополнительные действия, а именно создание отчета о размере приложения. В документации хорошо описана процедура его создания, поэтому оставлю
Следующий повод задуматься о размере вашего приложения — это… снова AppStore, но сейчас мы говорим не о системных ограничениях, а о скорости загрузки . Здесь все очевидно – чем меньше размер, тем выше ставка.
Кроме того, существует ограничение в 200 МБ, при достижении которого пользователям необходимо подключиться к сети Wi-Fi для установки приложения. Задержка может отпугнуть пользователей и привести к увеличению количества отказов.
Алгоритмы поиска и обнаружения Apple App Store часто отдают предпочтение небольшим приложениям, поскольку пользователям их легче загрузить и опробовать. Меньшие размеры приложения потенциально могут улучшить видимость вашего приложения в результатах поиска и рекомендациях.
Когда приложение установлено на устройстве, его размер по-прежнему имеет значение. Небольшие приложения запускаются быстрее, обеспечивая лучший пользовательский опыт. Когда приложение оптимизирует объем памяти, это способствует увеличению срока службы батареи, уменьшению занимаемого приложением объема и хорошему состоянию устройства. В результате, чем больше людей довольны iPhone, тем больше у вас потенциальных пользователей.
Есть несколько простых советов, которые помогут избежать ненужного увеличения размера вашего приложения во время разработки. Первый из них – осознанная работа с изображениями.
Во-первых, выберите HEIC вместо JPEG. HEIC предоставляет файлы, которые на 50 процентов меньше по сравнению с JPEG, сохраняя при этом такое же качество изображения. Это приводит к уменьшению места на вашем устройстве. Файлы меньшего размера легче передавать по сети, а также быстрее загружать и сохранять на диск.
HEIC поддерживают прозрачность изображений и возможность хранить дополнительные изображения, содержащие информацию о глубине и несоответствии. Он поддерживает сжатие без потерь и позволяет хранить несколько изображений в одном контейнере.
Во-вторых, попробуйте использовать SVG (формат векторных изображений на основе XML, используемый для отображения двумерной векторной графики) вместо PDF и PNG. В отличие от растровых изображений, векторная графика обычно имеет меньший размер файла, поскольку она характеризуется математическими уравнениями, которые определяют формы и кривые, а не хранят отдельные пиксели.
Изначально нужно было добавить 3 изображения с префиксами (для каждой плотности пикселей). Потом была добавлена поддержка PNG (=векторное изображение заданного размера), но она все равно работала на уровне «вырезать 3 PNG из PDF при сборке проекта».
И только тогда появилась возможность использовать SVG + включить в каталог ассетов галочку «использовать векторную дату», тем самым реально уменьшить размер используемых изображений + добавить возможность бесконечного масштабирования, без потери качества.
В-третьих, максимально используйте возможности Asset Catalogs . Каталоги активов предоставляют простое в использовании хранилище для одного и того же изображения в нескольких разрешениях. Более того, в каталогах все графические ресурсы хранятся в едином оптимизированном формате с метаданными вместо отдельных файлов.
Это позволяет App Store предоставлять только необходимые ресурсы для конкретного устройства. Это приводит к увеличению скорости загрузки, а мы уже знаем, что пользователи не любят ждать.
На ресурсе можно установить «по требованию», то есть ресурс будет загружаться на устройство только в случае необходимости, а через некоторое время неиспользования будет удален.
Не забывайте, что у вас есть огромный каталог «бесплатных» изображений — SF Символы . Apple постоянно работает над увеличением персонажей, добавляя возможность настройки цвета и даже анимации.
Итак, с картинками и другими графическими ресурсами вроде все понятно — используем правильные форматы, и добавляем каталог через Активы. Всегда есть возможность не включать в финальную сборку большие ресурсы, а просто загрузить из Интернета, когда это необходимо. Теперь поговорим о коде и использовании библиотек.
Позвольте мне быстро напомнить вам о связывании. Существует два его типа: статический и динамический.
| Статический | Динамический |
---|---|---|
Когда происходит связывание | Время сборки | Время выполнения |
Где хранятся зависимости | В конечном исполняемом файле | В отдельных динамических библиотеках |
Как распределяются зависимости | Одна и та же копия используется всеми экземплярами приложения. | Каждый экземпляр приложения имеет свою копию. |
Как обрабатываются обновления зависимостей | Пересоберите приложение | Обновите динамическую библиотеку |
Согласно теме этой статьи, хранение зависимостей особенно важно для нас, и динамическое связывание выглядит нашим любимым.
Динамические библиотеки не связаны статически с клиентскими приложениями; они не становятся частью исполняемого файла. Вместо этого динамические библиотеки можно загружать (и связывать) в приложение либо при запуске приложения, либо во время его работы.
Связь
Короче говоря, выбор динамических библиотек вместо статических приводит к уменьшению размера файлов приложения и снижению начального использования памяти. Однако по-прежнему важно соблюдать баланс и избегать чрезмерного использования динамических библиотек, поскольку это может привести к задержке производительности во время запуска приложения.
Apple также рекомендует создать в вашем приложении модульную базу кода ( SPM ), которая может оказаться удобной при совместном использовании кода с другими целями, например App Clipps.
Swift Package Manager предлагает оптимизированный и собственный способ управления зависимостями в ваших проектах Swift.
Один из наиболее эффективных способов уменьшить размер вашего приложения — удалить все ненужные файлы. Этими дополнительными файлами могут быть, например, Read.me или оставшиеся изображения. На самом деле, в самом начале статьи, где мы разобрались, что такое .ipa, мы уже узнали, как найти все файлы, которые попадут в AppStore: .ipa -> .zip -> App -> show package содержание.
Найдите все ресурсы, которые вам не нужны, и смело удаляйте их из своего приложения.
Просто чтобы подвести итог. Есть еще несколько важных причин, по которым нам следует следить за размером нашего приложения:
И есть несколько способов уменьшить размер приложения:
Так что не забывайте об этом во время рутинной разработки; становитесь умнее с каждым днём 🙃