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