Ответ
Снижение iOS Deployment Target позволяет компилятору и линковщику исключить код и ресурсы, необходимые для обратной совместимости, что может уменьшить итоговый размер билда (IPA).
Основные причины:
-
Условная компиляция и слабые ссылки:
- Код внутри директив
@available(iOS 14, *)или проверокif #availableдля старых версий может быть исключен. - Фреймворки, слабо связанные для старых iOS (
Weakly Linked), могут не включаться в билд.
- Код внутри директив
-
Swift Runtime:
- Для целевых версий ниже iOS 12.2 Swift runtime библиотеки (~5-10 МБ) встраиваются в каждый IPA.
- Для версий iOS 12.2 и выше runtime является частью ОС и не дублируется в приложении.
-
Ресурсы:
- В Asset Catalogs можно удалить ресурсы для устаревших разрешений (например, изображения
@1xдля iPhone 3GS/4). - Возможно исключение альтернативных реализаций UI для старых iOS.
- В Asset Catalogs можно удалить ресурсы для устаревших разрешений (например, изображения
Пример (Podfile):
platform :ios, '15.0' # Было '11.0'. Позволяет отказаться от fallback-кода для iOS 11-14.
Важно: Эффект не всегда значителен, так как основная бизнес-логика и ресурсы остаются неизменными. Главный выигрыш часто дает исключение Swift runtime для версий <12.2.
Ответ 18+ 🔞
Смотри, вот тебе как есть, без прикрас. Сидишь ты, значит, смотришь на свой IPA-файл, а он раздулся как корова перед отелом. И думаешь: "Ну что за хуйня, куда всё это делось?". А один из способов, который может помочь — это понизить эту самую iOS Deployment Target. Не магическая таблетка, но иногда реально выручает.
А работает это вот почему, блядь:
-
Условный пиздец и слабые связи:
- Вся эта хуйня, которая завёрнута в
@available(iOS 14, *)или вif #available(iOS 14, *)для старых айфонов — её можно просто выкинуть нахуй. Компилятор её не увидит и не положит в билд. - Фреймворки, которые ты слабо линковал для совместимости со старьём (
Weakly Linked), тоже могут остаться за бортом. Не нужны — не грузим.
- Вся эта хуйня, которая завёрнута в
-
Swift Runtime — вот где собака порылась:
- Это, сука, самый жирный кусок. Если твоя цель ниже iOS 12.2, то весь этот Swift runtime (эти самые 5-10 мегабайт библиотек) впихивается прямо в каждый твой IPA-файл, как назойливый сосед.
- А если цель iOS 12.2 или выше, то этот рантайм уже сидит в самой операционке, и тебе его таскать с собой не надо. Освобождаешь сразу овердохуища места.
-
Разный хлам:
- В ассетах можно поудалять картинки для древних ретина-дисплеев (эти твои
@1xдля iPhone 4, который уже в музее пылится). - И всякие костыльные UI-реализации под старые версии iOS тоже можно отправить в утиль.
- В ассетах можно поудалять картинки для древних ретина-дисплеев (эти твои
Вот, смотри, как в Podfile это выглядит:
platform :ios, '15.0' # Раньше тут было '11.0'. Теперь можно забыть про код для iOS 11-14, как про страшный сон.
Но, чувак, не обольщайся. Эффект-то не всегда оглушительный. Основная логика и самые жирные ресурсы никуда не денутся. Самый ощутимый плюс — это когда избавляешься от Swift runtime для версий ниже 12.2. Вот это реально может срезать с билда приличный кусок мяса. В остальном — мелочёвка, но иногда и она радует.