Как адаптировать приложение под разные версии iOS
Что проверяют
Различаете ли вы минимальную поддерживаемую версию и SDK, с которым собирается приложение, и умеете ли безопасно использовать новые API без падений на старых системах. Следом обычно спрашивают, как вы решаете, какую минимальную версию поддерживать.
Как отвечать
Основа ответа это две настройки. Deployment Target задаёт минимальную версию iOS, на которой приложение запустится. SDK всегда берётся из актуального Xcode: App Store регулярно поднимает требования к SDK для загружаемых сборок, поэтому держаться за старый Xcode ради старых систем не выйдет. Всё, что новее Deployment Target, закрывают проверками:
- *`if #available(iOS 17, )
**: проверка во время выполнения, ветка с новым API выполнится только на подходящей системе. Для обратного случая есть#unavailable`; - *`@available(iOS 17, )`**: помечает тип, метод или расширение, и компилятор не даст вызвать их без проверки;
#if canImport(...)и#if compiler(...): вот это настоящая условная компиляция, она нужна, когда код должен собираться разными версиями Xcode или без фреймворка;- обёртки: в SwiftUI новый модификатор удобно спрятать в свой
ViewModifierс#availableвнутри, чтобы не размазывать проверки по экранам.
Минимальную версию выбирают по аналитике аудитории и стоимости поддержки. Обычно поддерживают текущую и одну-две предыдущие мажорные версии, а порог поднимают, когда старые системы становятся малой долей, а новые API экономят заметно больше времени (NavigationStack вместо NavigationView, Observation вместо ObservableObject).
Проверяют это на симуляторах со старыми рантаймами из настроек Xcode и хотя бы на одном устройстве с минимальной версией.
Где спотыкаются
Называют #available условной компиляцией. Это проверка в рантайме, обе ветки компилируются, а #if работает на этапе сборки.
Вручную сравнивают строку UIDevice.current.systemVersion. Это хрупко и лишает вас проверок компилятора.
Тестируют только на последней iOS. Вызов API, которого нет в старой системе, падает уже у пользователей, а поведение одного и того же компонента между версиями иногда тоже меняется, например стиль модальных экранов.