iOS Deployment Target: що це, мінімальна версія iOS та налаштування

Автор: IT Sectr Опубліковано: 2026-02-08 Час читання: 14 хв

iOS Deployment Target (також iOS Target, Deployment Target) — мінімальна версія операційної системи Apple, на якій може бути запущено застосунок. Параметр задається в проєкті Xcode та визначає межу сумісності: при виборі iOS 16.0 застосунок встановлюється лише на пристрої з iOS 16.0 та новіше. Згідно з Apple Developer Documentation, правильний вибір Deployment Target впливає як на охоплення аудиторії, так і на доступ до нових API Swift та Objective-C фреймворків.

Головне

  • iOS Deployment Target — мінімальна версія iOS для встановлення та запуску застосунку, повний аналог minSdkVersion для Android
  • Налаштування в Xcode: Project → Info → iOS Deployment Target, також у Swift Package Manager та CocoaPods
  • @available та #available — механізми Swift для безпечного виклику API вище поточного Deployment Target
  • Кожен новий Deployment Target дає доступ до нових API SwiftUI, UIKit, Foundation, AppKit, але скорочує охоплення пристроїв
  • App Store фільтрує застосунки за версією iOS пристрою — при невідповідності Deployment Target застосунок не відображається

Що таке iOS Deployment Target?

iOS Deployment Target — параметр конфігурації Xcode, який вказує найранішу версію iOS, iPadOS, tvOS, watchOS або visionOS, на якій може працювати застосунок. Кожен проєкт Xcode містить це налаштування для кожної платформи окремо. Наприклад, iOS-застосунок може мати Deployment Target 16.0, а watchOS-розширення — 9.0. Якщо пристрій користувача працює на iOS 15.0, застосунок із Target 16.0 не відображатиметься в App Store та не встановиться через пряму дистрибуцію.

Механізм роботи Deployment Target базується на перевірці версії ОС під час встановлення. App Store порівнює значення Deployment Target з Info.plist (ключ MinimumOSVersion) з версією ОС на пристрої користувача. Якщо версія пристрою нижча — кнопка "Завантажити" блокується, а API App Store не повертає застосунок у результатах пошуку для цього пристрою. Аналогічна поведінка діє для TestFlight, ad-hoc та enterprise-дистрибуції.

За даними StatCounter на червень 2025 року, iOS 16 займає близько 48% активних пристроїв iPhone, iOS 17 — 35%, iOS 18 — 12%, старіші версії — близько 5%. Вибір Deployment Target 16.0 охоплює 83% пристроїв, Target 17.0 — 35% (лише iOS 17+). Ці цифри критично важливі для прийняття рішення: чим вищий Target, тим менша аудиторія, але тим доступніші новітні API SwiftUI та UIKit.

Deployment TargetЧастка пристроїв (червень 2025)Доступні функції
iOS 15.0~90%Swift Concurrency, async/await, Focus State
iOS 16.0~83%SwiftUI NavigationStack, Layout, Live Activities
iOS 17.0~35%Observation, SwiftData, TipKit, Reactive Editing
iOS 18.0~12%Нові API Apple Intelligence, покращений SwiftUI

Кожен новий реліз iOS додає не лише користувацькі функції, але й API для розробників. Нові модифікатори SwiftUI, методи UIKit, фреймворки на кшталт SwiftData та Observation доступні лише при певному Deployment Target. Розробник має балансувати між охопленням аудиторії та доступністю сучасних інструментів.

iOS Deployment Target vs minSdkVersion: порівняння з Android

iOS Deployment Target та minSdkVersion Android виконують ідентичну функцію — задають мінімальну версію ОС для застосунку. Однак механізми реалізації та супутні інструменти різняться. Розуміння цих відмінностей корисне розробникам, які працюють на обох платформах, і допомагає уникнути плутанини при переході між екосистемами.

В iOS мінімальна версія задається через Xcode build settings (IPHONEOS_DEPLOYMENT_TARGET) та зберігається в Info.plist (MinimumOSVersion). В Android — через build.gradle (minSdkVersion) та AndroidManifest.xml (<uses-sdk android:minSdkVersion>). iOS не має аналогів targetSdkVersion та compileSdkVersion — поведінкові зміни в iOS керуються SDK, з яким скомпільовано застосунок (Base SDK), та версією ОС на пристрої.

ПараметрiOSAndroid
Мінімальна версіяDeployment Target (IPHONEOS_DEPLOYMENT_TARGET)minSdkVersion
Де вказуєтьсяXcode Build Settings → Info.plistbuild.gradle → AndroidManifest.xml
Перевірка в коді@available / #available / if #availableBuild.VERSION.SDK_INT
Цільова версіяBase SDK (завжди останній)compileSdkVersion + targetSdkVersion
Фільтрація в магазиніApp Store: MinimumOSVersionGoogle Play: minSdkVersion

Ключова відмінність — Base SDK в iOS завжди є останньою версією, встановленою в Xcode. Розробник не може вибирати compileSdkVersion, як в Android — застосунок завжди компілюється проти останнього доступного SDK. Нові поведінкові зміни в iOS застосовуються до всіх застосунків, скомпільованих з новим Base SDK, незалежно від Deployment Target. В Android targetSdkVersion дає контроль над поведінковими змінами, в iOS такого розділення немає.

Поведінкові зміни в iOS vs Android

На відміну від Android, де поведінкові зміни прив'язані до targetSdkVersion, iOS застосовує зміни поведінки до всіх застосунків, скомпільованих з новою версією Xcode та Base SDK. Наприклад, iOS 13 ввела Dark Mode — всі застосунки, зібрані з Xcode 11 та iOS 13 SDK, автоматично отримували підтримку темної теми, незалежно від Deployment Target. В Android аналогічна зміна (Scoped Storage) застосовується лише при targetSdk >= 29. Розробнику iOS потрібно бути готовим до поведінкових змін з кожним новим Xcode, без можливості відстрочки.

Знання обох платформ дозволяє передбачати наслідки вибору мінімальної версії та планувати оновлення коду під нові API. В IT Sectr ми використовуємо обидві екосистеми з 2017 року — практика показує, що iOS Deployment Target варто вибирати на 2–3 версії нижче поточної для балансу охоплення та функціональності.

Як налаштувати Deployment Target в Xcode

Налаштування iOS Deployment Target виконується в кількох місцях проєкту: основний Target, Pods-проєкт (якщо використовується CocoaPods), залежності Swift Package Manager та Widget/Extension-таргети. Якщо значення відрізняються між основним застосунком та розширеннями, App Store використовує максимальне з усіх — тобто розширення не може мати Target нижчий, ніж основний застосунок.

Налаштування в Xcode project editor

Відкрийте проєкт Xcode → виберіть Target → вкладка General → розділ Minimum iOS Deployment. Випадаючий список показує всі доступні версії iOS SDK, встановлені в Xcode. Зміна застосовується до всіх схем збірки. Альтернативно — вкладка Build Settings → iOS Deployment Target (IPHONEOS_DEPLOYMENT_TARGET). Якщо проєкт містить кілька Target-розширень (Widget, Watch), кожен має власний Deployment Target.

Налаштування через Swift Package Manager

Для бібліотек, що поширюються через SPM, Deployment Target вказується в Package.swift в параметрі platforms. Бібліотека з platforms: [.iOS(.v16)] буде доступна лише застосункам з Deployment Target iOS 16.0+. При підключенні такої бібліотеки до проєкту з Target 15.0 Xcode видасть помилку несумісності. В CocoaPods Deployment Target задається в Podfile: platform :ios, '16.0'.

swift
// Package.swift — Deployment Target для SPM-бібліотеки
import PackageDescription

let package = Package(
    name: "MyLibrary",
    platforms: [
        .iOS(.v16),
        .macOS(.v13),
        .watchOS(.v9),
        .tvOS(.v16)
    ],
    products: [
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary"]
        )
    ],
    dependencies: [],
    targets: [
        .target(
            name: "MyLibrary",
            swiftSettings: [
                .enableUpcomingFeature("ConciseMagicFile")
            ]
        )
    ]
)

// Перевірка сумісності в коді
#if swift(>=5.9)
// Swift 5.9+ функції (Xcode 15+)
#endif

У прикладі Package.swift задано платформи iOS 16+, macOS 13+, watchOS 9+, tvOS 16+. Будь-який проєкт з Deployment Target нижче iOS 16.0 не зможе підключити цю бібліотеку. Параметр swiftSettings включає upcoming features для конкретної версії Swift. SPM автоматично перевіряє сумісність platforms при додаванні залежності.

CocoaPods та Podfile

Podfile використовує директиву platform :ios, '16.0'. Після pod install CocoaPods перевіряє Deployment Target кожної pod-бібліотеки: якщо хоча б одна має Target вищий, ніж проєкт, встановлення завершиться помилкою "The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 17.0, but the range of supported deployment target versions is 16.0 to 17.0". Рішення — знизити Target проблемної pod або підвищити Target проєкту.

ruby
# Podfile — приклад з Deployment Target
platform :ios, '16.0'

# Ігнорувати попередження про Deployment Target
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0'
        end
    end
end

post_install hook в Podfile примусово встановлює Deployment Target 16.0 для всіх pod-бібліотек. Це корисно, коли одна з pod вказує вищий Target, ніж потрібно для її функціональності. Використовуйте це лише якщо впевнені, що pod не використовує API з вищої версії iOS.

Перевірки @available та #available у коді Swift та Objective-C

@available та #available — директиви Swift та Objective-C для безпечного виклику API, доступних лише на певних версіях ОС. Якщо Deployment Target проєкту — iOS 16.0, а метод потребує iOS 17.0, прямий виклик призведе до runtime-крашу на пристроях з iOS 16.0–16.x. Перевірки availability — обов'язковий інструмент для підтримки кількох версій iOS.

@available — декларативна перевірка

Директива @available застосовується до класів, методів або цілих файлів. Якщо @available(iOS 17.0, *) вказано перед класом, весь клас доступний лише на iOS 17.0+. Спроба викликати клас на iOS 16.0 призведе до runtime-помилки. Використовуйте @available для ізоляції цілих модулів функціональності, специфічних для конкретної версії ОС. Для методів всередині класу @available дозволяє приховувати окремі функції.

#available — умовне виконання

Директива #available (if #available) перевіряє версію ОС в runtime та виконує код лише при її відповідності. Використовується всередині функцій для вибору між новою та старою реалізаціями. В Objective-C аналог — @available(iOS 17.0, *) всередині if. Для більш складних перевірок використовуйте ProcessInfo.processInfo.isOperatingSystemAtLeast для порівняння компонентів версії (major, minor, patch).

swift
import UIKit
import SwiftUI

// 1. @available — весь клас тільки для iOS 17+
@available(iOS 17.0, *)
class ObservationViewModel: ObservableObject {
    @Published var name: String = "User"

    // Використовує Observation framework — доступний тільки iOS 17+
    func updateWithObservation() {
        let newName = "Updated via Observation"
        name = newName
    }
}

// 2. #available — умовний виклик всередині функції
func configureLiveActivity() {
    if #available(iOS 16.1, *) {
        // Live Activities API — доступний з iOS 16.1
        let activity = Activity<MyAttributes>(
            attributes: MyAttributes(name: "Live"),
            contentState: MyContentState(value: 42)
        )
        Task {
            await activity.activate()
        }
    } else {
        // Fallback: push-сповіщення або нічого
        print("Live Activities недоступно")
    }
}

// 3. ProcessInfo — точна перевірка версії
func checkOSVersion() {
    let osVersion = ProcessInfo.processInfo.operatingSystemVersion
    print("iOS \(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)")

    // Порівняння компонентів
    if osVersion.majorVersion >= 17 {
        print("iOS 17+ виявлено")
    }
}

// 4. Objective-C @available
// В Objective-C використовується @available:
// if (@available(iOS 17.0, *)) { }

// 5. @available з аргументом unavailable
@available(*, unavailable, message: "Use configureWithSwiftUI instead")
func legacyConfigureMethod() { }

Клас ObservationViewModel використовує @available для ізоляції функціональності iOS 17. Функція configureLiveActivity використовує #available для перевірки Live Activities (iOS 16.1+) з fallback-реалізацією. ProcessInfo перевіряє точну версію ОС. @available(*, unavailable) позначає метод як недоступний на всіх версіях — для міграції на новий API. Без цих перевірок застосунок з Deployment Target 16.0 впаде на пристроях з iOS 16.0 при виклику API iOS 17.

Objective-C та @available

Objective-C використовує @available(iOS 17.0, *) з тією ж семантикою, що Swift #available. Різниця: Objective-C перевіряє в runtime, Swift #available — теж runtime, але з підказками компілятору для оптимізації розгалуження. Для коду на Objective-C, що взаємодіє зі Swift, перевірки availability необхідні на стороні Objective-C — Swift-бриджинг не додає автоматичних перевірок.

Як вибрати правильний Deployment Target для проєкту

Вибір iOS Deployment Target — стратегічне рішення, що впливає на три аспекти: охоплення аудиторії, доступні API та складність підтримки коду. Єдиного правильного значення не існує — вибір залежить від цільової аудиторії застосунку, мінімально необхідних функцій та ресурсів команди на підтримку зворотної сумісності.

Перший фактор — статистика використання версій iOS. Apple публікує дані про встановлення iOS на WWDC та в Apple Developer Dashboard. На червень 2025 розподіл: iOS 15 — ~7%, iOS 16 — ~48%, iOS 17 — ~35%, iOS 18 — ~10%. Вибір Target 16.0 дає охоплення 83%, Target 17.0 — 35%. Для масового застосунку (соцмережі, месенджери, e-commerce) рекомендується Target 16.0. Для нішевого B2B-застосунку з requirement-specific API — Target 17.0.

Другий фактор — необхідні API. Якщо ключова функція застосунку потребує SwiftData (iOS 17+), Observation (iOS 17+) або Live Activities (iOS 16.1+), Target не може бути нижчим за необхідну версію. Аналіз необхідних API на етапі проєктування запобігає ситуації, коли на півдорозі розробки з'ясовується, що потрібен вищий Target. Використовуйте Availability Checks як запасний варіант, але не як основний план.

Третій фактор — ресурси на тестування. Підтримка старих версій iOS потребує перевірки на симуляторах та реальних пристроях з цими версіями. iOS 15 тестується на iPhone 6s/7, iOS 16 — на iPhone 8/X, iOS 17 — на iPhone XS/XR. Кожна додаткова версія зворотної сумісності збільшує час QA. Якщо команда невелика, розумно вибрати Target на 2–3 версії нижче поточної (16.0) — баланс між охопленням та трудозатратами.

Тип застосункуРекомендований TargetОхопленняОбґрунтування
Масовий (соцмережі, маркетплейс)iOS 16.0~83%Максимальна аудиторія
Enterprise / B2BiOS 16.0~83%Корпоративні пристрої оновлюються повільно
Стартап / MVPiOS 17.0~35%Швидка розробка на нових API
Ігри (Metal 3+)iOS 17.0~35%Потребують нових графічних API
Бібліотека/SDKiOS 15.0~90%Максимальна сумісність для клієнтів

Бібліотеки та SDK повинні мати максимально низький Deployment Target (15.0 або навіть 14.0) — споживачі бібліотеки можуть мати будь-який Target вищий за ваш. Якщо бібліотека потребує iOS 17.0, половина проєктів не зможе її підключити. Для застосунків, навпаки, можна дозволити вищий Target заради доступу до нових API.

Як знизити Deployment Target після підвищення

Зниження iOS Deployment Target — задача, що виникає при необхідності розширити аудиторію або при публікації бібліотеки з сумісністю зі старими проєктами. На відміну від підвищення, зниження потребує активної роботи з кодом: потрібно замінити всі прямі виклики API, недоступних в новому (нижчому) Target, на перевірки #available з fallback-реалізаціями.

Перший крок — інвентаризація API. Xcode не видає помилки компіляції при зниженні Target — він лише попереджає жовтими ворнінгами. Вам потрібно знайти всі методи та класи, позначені @available(iOS N+, *), де N вищий за новий Target. Використовуйте пошук по проєкту (Cmd+Shift+F) по патерну "available(iOS". Кожен такий виклик — кандидат на рефакторинг.

Другий крок — заміна на #available-перевірки. Кожен виклик API з вищої версії обгортається в if #available(iOS N+, *) { } else { }. Для цілих класів використовуйте #if os(iOS) з @available на рівні типу. Якщо API не має розумного fallback (наприклад, Live Activities), функціональність вимикається для старих версій з повідомленням користувача.

swift
import UIKit
import SwiftUI

// Зниження Deployment Target з 17.0 до 16.0

// ДО (@available iOS 17.0):
@available(iOS 17.0, *)
func setupObservation() {
    // Observation framework — тільки iOS 17+
    let model = ObservationViewModel()
    // ...
}

// ПІСЛЯ (#available перевірка):
func setupObservationCompatible() {
    if #available(iOS 17.0, *) {
        // iOS 17+: Observation framework
        let model = ObservationViewModel()
        // ...
    } else {
        // iOS 16.x: ObservableObject з @Published
        let model = LegacyObservableViewModel()
        // ...
    }
}

// Для UIKit iOS 17+ API:
@available(iOS 17.0, *)
class ModernViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Використовує UIKit TraitChanges (iOS 17+)
        registerForTraitChanges([UITraitVerticalSizeClass.self]) { _, _ in }
    }
}

// Fallback для iOS 16:
class LegacyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Немає registerForTraitChanges — використовуємо traitCollectionDidChange
    }

    override func traitCollectionDidChange(_: UITraitCollection?) {
        super.traitCollectionDidChange(nil)
        // Обробка змін traits для iOS 16
    }
}

// Фабрика для вибору реалізації за версією iOS
func makeViewController() -> UIViewController {
    if #available(iOS 17.0, *) {
        return ModernViewController()
    } else {
        return LegacyViewController()
    }
}

Код демонструє зниження Target з iOS 17.0 до 16.0. Функція setupObservation замінена на setupObservationCompatible з #available-перевіркою. ViewController розділено на Modern (iOS 17+) та Legacy (iOS 16) з фабрикою makeViewController, що вибирає реалізацію за версією ОС. Така архітектура дозволяє підтримувати два Deployment Target без дублювання всієї кодової бази — лише версіоновані модулі.

Xcode warnings та їх усунення

Після зниження Deployment Target Xcode підсвітить жовтим всі виклики API, недоступні в новому Target. Warning "In iOS 16.0 and later" означає, що метод потребує вищої версії. Рішення: додати @available або if #available (рекомендується), подавити через @available(*, deprecated) для поступової міграції, або видалити виклик. Налаштування "Treat Warnings as Errors" в проєкті перетворить ці ворнінги на помилки компіляції — вмикайте цю опцію для контролю.

Часто задавані питання

Що таке iOS Deployment Target?

iOS Deployment Target — мінімальна версія iOS, на якій може працювати застосунок. Вказується в Xcode Project → Info → iOS Deployment Target. Застосунок з Target 16.0 не встановлюється на iOS 15.0 та нижче. App Store фільтрує застосунки за цим параметром — користувачі з непідтримуваною версією не бачать застосунок. Аналог в Android — minSdkVersion.

Чим iOS Deployment Target відрізняється від minSdkVersion?

Обидва параметри задають мінімальну версію ОС для встановлення застосунку. iOS Deployment Target зберігається в Info.plist (MinimumOSVersion), minSdkVersion — в AndroidManifest.xml. iOS не має аналогів targetSdkVersion та compileSdkVersion — всі поведінкові зміни застосовуються при компіляції з новим Base SDK. В Android поведінкові зміни контролюються через targetSdkVersion. Перевірки в коді: @available в Swift vs Build.VERSION.SDK_INT в Android.

Який iOS Deployment Target вибрати в 2026 році?

Рекомендується iOS 16.0 для масових застосунків (83% пристроїв) та iOS 17.0 для стартапів і проєктів на SwiftUI Observation/SwiftData (35% пристроїв). iOS 16.0 підтримується на iPhone 8 та новіше, включає SwiftUI Layout, NavigationStack, Live Activities. iOS 17.0 дає Observation, SwiftData, TipKit. Для бібліотек та SDK — iOS 15.0 для максимальної сумісності.

Як перевірити версію iOS в коді Swift?

В Swift використовуйте #available(iOS 17.0, *) всередині функцій для умовного виконання коду або @available(iOS 17.0, *) на рівні класу/методу для декларативної перевірки. Для точної версії — ProcessInfo.processInfo.operatingSystemVersion, що повертає OperatingSystemVersion. В Objective-C використовуйте @available(iOS 17.0, *) всередині if. Без перевірок виклик API вище Deployment Target призводить до runtime-крашу.

Чи можна знизити Deployment Target після публікації?

Знизити iOS Deployment Target можна, але це потребує заміни всіх прямих викликів API з вищих версій на #available-перевірки з fallback-реалізаціями. Xcode попередить жовтими ворнінгами, але не видасть помилку. API без розумного fallback (Live Activities, SwiftData) відключаються на старих версіях. Рекомендується починати з Target на 2 версії нижче поточної, щоб уникнути складної міграції.

Підсумки

  • iOS Deployment Target — мінімальна версія ОС для запуску застосунку, аналог minSdkVersion в Android
  • Налаштовується в Xcode Build Settings (IPHONEOS_DEPLOYMENT_TARGET) та зберігається в Info.plist (MinimumOSVersion)
  • @available та #available — основні механізми Swift для безпечного виклику API вище Deployment Target
  • Вибір Target впливає на охоплення пристроїв: iOS 16.0 — 83%, iOS 17.0 — 35%, iOS 15.0 — 90%
  • Для масових застосунків рекомендується iOS 16.0, для бібліотек — iOS 15.0, для стартапів на SwiftData — iOS 17.0
  • Зниження Target потребує рефакторингу всіх викликів API вищих версій на #available-перевірки з fallback
  • Base SDK в iOS завжди останній — поведінкові зміни застосовуються до всіх застосунків, на відміну від Android targetSdkVersion

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також