Как уменьшение минимальной поддерживаемой версии iOS (deployment target) может снизить размер приложения?

Ответ

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

Основные причины:

  1. Условная компиляция и слабые ссылки:

    • Код внутри директив @available(iOS 14, *) или проверок if #available для старых версий может быть исключен.
    • Фреймворки, слабо связанные для старых iOS (Weakly Linked), могут не включаться в билд.
  2. Swift Runtime:

    • Для целевых версий ниже iOS 12.2 Swift runtime библиотеки (~5-10 МБ) встраиваются в каждый IPA.
    • Для версий iOS 12.2 и выше runtime является частью ОС и не дублируется в приложении.
  3. Ресурсы:

    • В Asset Catalogs можно удалить ресурсы для устаревших разрешений (например, изображения @1x для iPhone 3GS/4).
    • Возможно исключение альтернативных реализаций UI для старых iOS.

Пример (Podfile):

platform :ios, '15.0' # Было '11.0'. Позволяет отказаться от fallback-кода для iOS 11-14.

Важно: Эффект не всегда значителен, так как основная бизнес-логика и ресурсы остаются неизменными. Главный выигрыш часто дает исключение Swift runtime для версий <12.2.

Ответ 18+ 🔞

Смотри, вот тебе как есть, без прикрас. Сидишь ты, значит, смотришь на свой IPA-файл, а он раздулся как корова перед отелом. И думаешь: "Ну что за хуйня, куда всё это делось?". А один из способов, который может помочь — это понизить эту самую iOS Deployment Target. Не магическая таблетка, но иногда реально выручает.

А работает это вот почему, блядь:

  1. Условный пиздец и слабые связи:

    • Вся эта хуйня, которая завёрнута в @available(iOS 14, *) или в if #available(iOS 14, *) для старых айфонов — её можно просто выкинуть нахуй. Компилятор её не увидит и не положит в билд.
    • Фреймворки, которые ты слабо линковал для совместимости со старьём (Weakly Linked), тоже могут остаться за бортом. Не нужны — не грузим.
  2. Swift Runtime — вот где собака порылась:

    • Это, сука, самый жирный кусок. Если твоя цель ниже iOS 12.2, то весь этот Swift runtime (эти самые 5-10 мегабайт библиотек) впихивается прямо в каждый твой IPA-файл, как назойливый сосед.
    • А если цель iOS 12.2 или выше, то этот рантайм уже сидит в самой операционке, и тебе его таскать с собой не надо. Освобождаешь сразу овердохуища места.
  3. Разный хлам:

    • В ассетах можно поудалять картинки для древних ретина-дисплеев (эти твои @1x для iPhone 4, который уже в музее пылится).
    • И всякие костыльные UI-реализации под старые версии iOS тоже можно отправить в утиль.

Вот, смотри, как в Podfile это выглядит:

platform :ios, '15.0' # Раньше тут было '11.0'. Теперь можно забыть про код для iOS 11-14, как про страшный сон.

Но, чувак, не обольщайся. Эффект-то не всегда оглушительный. Основная логика и самые жирные ресурсы никуда не денутся. Самый ощутимый плюс — это когда избавляешься от Swift runtime для версий ниже 12.2. Вот это реально может срезать с билда приличный кусок мяса. В остальном — мелочёвка, но иногда и она радует.