iOS Deployment Target (také iOS Target, Deployment Target) — minimální verze Apple operačního systému, na které může být aplikace spuštěna. Parametr se nastavuje v projektu Xcode a určuje hranici kompatibility: při výběru iOS 16.0 se aplikace instaluje pouze na zařízení s iOS 16.0 a novějším. Podle Apple Developer Documentation správný výběr Deployment Target ovlivňuje jak pokrytí publika, tak přístup k novým API Swift a Objective-C frameworků.
Hlavní body
iOS Deployment Target — parametr konfigurace Xcode, který určuje nejstarší verzi iOS, iPadOS, tvOS, watchOS nebo visionOS, na které může aplikace běžet. Každý projekt Xcode obsahuje toto nastavení pro každou platformu zvlášť. Například iOS aplikace může mít Deployment Target 16.0 a rozšíření watchOS — 9.0. Pokud zařízení uživatele běží na iOS 15.0, aplikace s Target 16.0 se nezobrazí v App Store a nenainstaluje se prostřednictvím přímé distribuce.
Mechanismus fungování Deployment Target je založen na kontrole verze OS během instalace. iOS App Store porovnává hodnotu Deployment Target z Info.plist (klíč MinimumOSVersion) s verzí OS na zařízení uživatele. Pokud je verze zařízení nižší — tlačítko "Stáhnout" je blokováno a API App Store nevrací aplikaci ve výsledcích vyhledávání pro toto zařízení. Analogické chování platí pro TestFlight, ad-hoc a enterprise distribuci.
Podle údajů StatCounter k červnu 2025 iOS 16 zaujímá přibližně 48 % aktivních zařízení iPhone, iOS 17 — 35 %, iOS 18 — 12 %, starší verze — asi 5 %. Výběr Deployment Target 16.0 pokrývá 83 % zařízení, Target 17.0 — 35 % (pouze iOS 17+). Tato čísla jsou kritická pro rozhodování: čím vyšší Target, tím menší publikum, ale tím dostupnější jsou nejnovější API SwiftUI a UIKit.
| Deployment Target | Podíl zařízení (červen 2025) | Dostupné funkce |
|---|---|---|
| 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% | Nová Apple Intelligence API, vylepšené SwiftUI |
Každá nová verze iOS přidává nejen uživatelské funkce, ale také API pro vývojáře. Nové modifikátory SwiftUI, metody UIKit, frameworky jako SwiftData a Observation jsou dostupné pouze při určitém Deployment Target. Vývojář musí vyvážit pokrytí publika a dostupnost moderních nástrojů.
iOS Deployment Target a Android minSdkVersion plní identickou funkci — nastavují minimální verzi OS pro aplikaci. Mechanismus implementace a doprovodné nástroje se však liší. Pochopení těchto rozdílů je užitečné pro vývojáře pracující na obou platformách a pomáhá vyhnout se zmatkům při přechodu mezi ekosystémy.
V iOS se minimální verze nastavuje prostřednictvím Xcode build settings (IPHONEOS_DEPLOYMENT_TARGET) a ukládá se do Info.plist (MinimumOSVersion). V Androidu — prostřednictvím build.gradle (minSdkVersion) a AndroidManifest.xml (<uses-sdk android:minSdkVersion>). iOS nemá analogy pro targetSdkVersion a compileSdkVersion — změny chování v iOS jsou řízeny SDK, se kterým byla aplikace zkompilována (Base SDK), a verzí OS na zařízení.
| Parametr | iOS | Android |
|---|---|---|
| Minimální verze | Deployment Target (IPHONEOS_DEPLOYMENT_TARGET) | minSdkVersion |
| Kde se uvádí | Xcode Build Settings → Info.plist | build.gradle → AndroidManifest.xml |
| Kontrola v kódu | @available / #available / if #available | Build.VERSION.SDK_INT |
| Cílová verze | Base SDK (vždy nejnovější) | compileSdkVersion + targetSdkVersion |
| Filtrování v obchodě | App Store: MinimumOSVersion | Google Play: minSdkVersion |
Klíčový rozdíl — Base SDK v iOS je vždy nejnovější verze nainstalovaná v Xcode. Vývojář nemůže vybrat compileSdkVersion jako v Androidu — aplikace je vždy zkompilována proti nejnovějšímu dostupnému SDK. Nové změny chování v iOS se aplikují na všechny aplikace zkompilované s novým Base SDK, bez ohledu na Deployment Target. V Androidu targetSdkVersion poskytuje kontrolu nad změnami chování, v iOS takové rozdělení neexistuje.
Na rozdíl od Androidu, kde jsou změny chování vázány na targetSdkVersion, iOS aplikuje změny chování na všechny aplikace zkompilované s novou verzí Xcode a Base SDK. Například iOS 13 zavedl Dark Mode — všechny aplikace postavené s Xcode 11 a iOS 13 SDK automaticky získaly podporu tmavého motivu, bez ohledu na Deployment Target. V Androidu se podobná změna (Scoped Storage) aplikuje pouze při targetSdk >= 29. Vývojář iOS musí být připraven na změny chování s každým novým Xcode, bez možnosti odkladu.
Znalost obou platforem umožňuje předvídat důsledky výběru minimální verze a plánovat aktualizace kódu pro nová API. V IT Sectr používáme oba ekosystémy od roku 2017 — praxe ukazuje, že iOS Deployment Target by měl být vybrán 2–3 verze pod aktuální pro rovnováhu mezi pokrytím a funkčností.
Konfigurace iOS Deployment Target se provádí na několika místech projektu: hlavní Target, projekt Pods (pokud je použit CocoaPods), závislosti Swift Package Manager a targety Widget/Extension. Pokud se hodnoty liší mezi hlavní aplikací a rozšířeními, App Store použije maximum ze všech — to znamená, že rozšíření nemůže mít nižší Target než hlavní aplikace.
Otevřete projekt Xcode → vyberte Target → záložka General → sekce Minimum iOS Deployment. Rozbalovací seznam zobrazuje všechny dostupné verze iOS SDK nainstalované v Xcode. Změna se aplikuje na všechna schémata sestavení. Alternativně — záložka Build Settings → iOS Deployment Target (IPHONEOS_DEPLOYMENT_TARGET). Pokud projekt obsahuje několik cílových rozšíření (Widget, Watch), každé má svůj vlastní Deployment Target.
Pro knihovny distribuované přes SPM je Deployment Target uveden v Package.swift v parametru platforms. Knihovna s platforms: [.iOS(.v16)] bude dostupná pouze aplikacím s Deployment Target iOS 16.0+. Při připojení takové knihovny k projektu s Target 15.0 Xcode zobrazí chybu nekompatibility. V CocoaPods se Deployment Target nastavuje v Podfile: platform :ios, '16.0'.
// Package.swift — Deployment Target pro knihovnu 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")
]
)
]
)
// Kontrola kompatibility v kódu
#if swift(>=5.9)
// Swift 5.9+ funkce (Xcode 15+)
#endifV příkladu Package.swift jsou platformy nastaveny na iOS 16+, macOS 13+, watchOS 9+, tvOS 16+. Jakýkoli projekt s Deployment Target pod iOS 16.0 nebude moci tuto knihovnu připojit. Parametr swiftSettings zahrnuje nadcházející funkce pro konkrétní verzi Swift. SPM automaticky kontroluje kompatibilitu platforms při přidávání závislostí.
Podfile používá direktivu platform :ios, '16.0'. Po pod install CocoaPods zkontroluje Deployment Target každé knihovny pod: pokud alespoň jedna má vyšší Target než projekt, instalace skončí chybou "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". Řešení — snižte Target problematického podu nebo zvyšte Target projektu.
# Podfile — příklad s Deployment Target
platform :ios, '16.0'
# Ignorovat upozornění o 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
endHook post_install v Podfile vynucuje nastavení Deployment Target 16.0 pro všechny knihovny pod. To je užitečné, když jeden z podů uvádí vyšší Target, než je pro jeho funkčnost nutné. Použijte to pouze pokud jste si jisti, že pod nepoužívá API z vyšší verze iOS.
@available a #available — direktivy Swift a Objective-C pro bezpečné volání API dostupných pouze na určitých verzích OS. Pokud je Deployment Target projektu iOS 16.0 a metoda vyžaduje iOS 17.0, přímé volání způsobí runtime crash na zařízeních s iOS 16.0-16.x. Kontroly dostupnosti — povinný nástroj pro podporu více verzí iOS.
Direktiva @available se aplikuje na třídy, metody nebo celé soubory. Pokud je @available(iOS 17.0, *) uveden před třídou, celá třída je dostupná pouze na iOS 17.0+. Pokus o volání třídy na iOS 16.0 povede k runtime chybě. Použijte @available k izolaci celých modulů funkčnosti specifických pro konkrétní verzi OS. Pro metody uvnitř třídy @available umožňuje skrývat jednotlivé funkce.
Direktiva #available (if #available) kontroluje verzi OS za běhu a provádí kód pouze při shodě. Používá se uvnitř funkcí pro výběr mezi novou a starou implementací. V Objective-C je analogií @available(iOS 17.0, *) uvnitř if. Pro složitější kontroly použijte ProcessInfo.processInfo.isOperatingSystemAtLeast pro porovnání komponent verze (major, minor, patch).
import UIKit
import SwiftUI
// 1. @available — celá třída pouze pro iOS 17+
@available(iOS 17.0, *)
class ObservationViewModel: ObservableObject {
@Published var name: String = "User"
// Používá framework Observation — dostupný pouze iOS 17+
func updateWithObservation() {
let newName = "Updated via Observation"
name = newName
}
}
// 2. #available — podmíněné volání uvnitř funkce
func configureLiveActivity() {
if #available(iOS 16.1, *) {
// Live Activities API — dostupné od iOS 16.1
let activity = Activity<MyAttributes>(
attributes: MyAttributes(name: "Live"),
contentState: MyContentState(value: 42)
)
Task {
await activity.activate()
}
} else {
// Fallback: push oznámení nebo nic
print("Live Activities nejsou dostupné")
}
}
// 3. ProcessInfo — přesná kontrola verze
func checkOSVersion() {
let osVersion = ProcessInfo.processInfo.operatingSystemVersion
print("iOS \(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)")
// Porovnání komponent
if osVersion.majorVersion >= 17 {
print("iOS 17+ detekován")
}
}
// 4. Objective-C @available
// V Objective-C se používá @available:
// if (@available(iOS 17.0, *)) { }
// 5. @available s argumentem unavailable
@available(*, unavailable, message: "Use configureWithSwiftUI instead")
func legacyConfigureMethod() { }Třída ObservationViewModel používá @available k izolaci funkčnosti iOS 17. Funkce configureLiveActivity používá #available pro kontrolu Live Activities (iOS 16.1+) s fallback implementací. ProcessInfo kontroluje přesnou verzi OS. @available(*, unavailable) označuje metodu jako nedostupnou na všech verzích — pro migraci na nové API. Bez těchto kontrol aplikace s Deployment Target 16.0 spadne na zařízeních s iOS 16.0 při volání API iOS 17.
Objective-C používá @available(iOS 17.0, *) se stejnou sémantikou jako Swift #available. Rozdíl: Objective-C kontroluje za běhu, Swift #available — také za běhu, ale s nápovědou pro kompilátor k optimalizaci větvení. Pro kód Objective-C, který komunikuje se Swift, jsou kontroly dostupnosti nezbytné na straně Objective-C — Swift-bridging nepřidává automatické kontroly.
Výběr iOS Deployment Target — strategické rozhodnutí ovlivňující tři aspekty: pokrytí publika, dostupná API a složitost údržby kódu. Neexistuje jediná správná hodnota — výběr závisí na cílovém publiku aplikace, minimálně požadovaných funkcích a zdrojích týmu na podporu zpětné kompatibility.
První faktor — statistiky používání verzí iOS. Apple zveřejňuje data o instalaci iOS na WWDC a v Apple Developer Dashboard. K červnu 2025 je rozdělení: iOS 15 — ~7%, iOS 16 — ~48%, iOS 17 — ~35%, iOS 18 — ~10%. Výběr Target 16.0 dává pokrytí 83%, Target 17.0 — 35%. Pro masovou aplikaci (sociální sítě, messengery, e-commerce) se doporučuje Target 16.0. Pro nische B2B aplikaci se specifickými požadavky na API — Target 17.0.
Druhý faktor — požadovaná API. Pokud klíčová funkce aplikace vyžaduje SwiftData (iOS 17+), Observation (iOS 17+) nebo Live Activities (iOS 16.1+), Target nemůže být nižší než požadovaná verze. Analýza požadovaných API ve fázi návrhu předchází situaci, kdy se v polovině vývoje zjistí, že je potřeba vyšší Target. Používejte Availability Checks jako záložní možnost, ale ne jako hlavní plán.
Třetí faktor — zdroje pro testování. Podpora starých verzí iOS vyžaduje testování na simulátorech a skutečných zařízeních s těmito verzemi. iOS 15 se testuje na iPhone 6s/7, iOS 16 — na iPhone 8/X, iOS 17 — na iPhone XS/XR. Každá další verze zpětné kompatibility zvyšuje čas QA. Pokud je tým malý, je rozumné vybrat Target 2–3 verze pod aktuální (16.0) — rovnováha mezi pokrytím a pracovními náklady.
| Typ aplikace | Doporučený Target | Pokrytí | Odůvodnění |
|---|---|---|---|
| Masová (sociální sítě, marketplace) | iOS 16.0 | ~83% | Maximální publikum |
| Enterprise / B2B | iOS 16.0 | ~83% | Firemní zařízení se aktualizují pomalu |
| Startup / MVP | iOS 17.0 | ~35% | Rychlý vývoj na nových API |
| Hry (Metal 3+) | iOS 17.0 | ~35% | Vyžadují nová grafická API |
| Knihovna/SDK | iOS 15.0 | ~90% | Maximální kompatibilita pro klienty |
Knihovny a SDK by měly mít co nejnižší Deployment Target (15.0 nebo dokonce 14.0) — spotřebitelé knihovny mohou mít jakýkoli Target vyšší než vy. Pokud knihovna vyžaduje iOS 17.0, polovina projektů ji nebude moci připojit. Pro aplikace si naopak můžete dovolit vyšší Target pro přístup k novým API.
Snížení iOS Deployment Target — úkol, který vzniká při potřebě rozšířit publikum nebo při publikování knihovny s kompatibilitou se starými projekty. Na rozdíl od zvýšení, snížení vyžaduje aktivní práci s kódem: musíte nahradit všechna přímá volání API nedostupných v novém (nižším) Targetu kontrolami #available s fallback implementacemi.
První krok — inventarizace API. Xcode nevydává chyby kompilace při snížení Targetu — pouze varuje žlutými upozorněními. Musíte najít všechny metody a třídy označené @available(iOS N+, *), kde N je vyšší než nový Target. Použijte vyhledávání v projektu (Cmd+Shift+F) podle vzoru "available(iOS". Každé takové volání — kandidát na refaktorizaci.
Druhý krok — náhrada kontrolami #available. Každé volání API z vyšší verze se obalí do if #available(iOS N+, *) { } else { }. Pro celé třídy použijte #if os(iOS) s @available na úrovni typu. Pokud API nemá rozumný fallback (např. Live Activities), funkčnost se pro staré verze vypíná s upozorněním uživatele.
import UIKit
import SwiftUI
// Snížení Deployment Target z 17.0 na 16.0
// PŘED (@available iOS 17.0):
@available(iOS 17.0, *)
func setupObservation() {
// Observation framework — pouze iOS 17+
let model = ObservationViewModel()
// ...
}
// PO (kontrola #available):
func setupObservationCompatible() {
if #available(iOS 17.0, *) {
// iOS 17+: Observation framework
let model = ObservationViewModel()
// ...
} else {
// iOS 16.x: ObservableObject s @Published
let model = LegacyObservableViewModel()
// ...
}
}
// Pro UIKit iOS 17+ API:
@available(iOS 17.0, *)
class ModernViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Používá UIKit TraitChanges (iOS 17+)
registerForTraitChanges([UITraitVerticalSizeClass.self]) { _, _ in }
}
}
// Fallback pro iOS 16:
class LegacyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Žádný registerForTraitChanges — používáme traitCollectionDidChange
}
override func traitCollectionDidChange(_: UITraitCollection?) {
super.traitCollectionDidChange(nil)
// Zpracování změn traits pro iOS 16
}
}
// Továrna pro výběr implementace podle verze iOS
func makeViewController() -> UIViewController {
if #available(iOS 17.0, *) {
return ModernViewController()
} else {
return LegacyViewController()
}
}Kód demonstruje snížení Targetu z iOS 17.0 na 16.0. Funkce setupObservation byla nahrazena setupObservationCompatible s kontrolou #available. ViewController je rozdělen na Modern (iOS 17+) a Legacy (iOS 16) s továrnou makeViewController, která vybírá implementaci podle verze OS. Taková architektura umožňuje udržovat dva Deployment Targety bez duplikování celé kódové základny — pouze verzované moduly.
Po snížení Deployment Targetu Xcode žlutě zvýrazní všechna volání API nedostupná v novém Targetu. Upozornění "In iOS 16.0 and later" znamená, že metoda vyžaduje vyšší verzi. Řešení: přidat @available nebo if #available (doporučeno), potlačit přes @available(*, deprecated) pro postupnou migraci, nebo odstranit volání. Nastavení "Treat Warnings as Errors" v projektu změní tato upozornění na chyby kompilace — zapněte tuto možnost pro kontrolu.
Často kladené dotazy
iOS Deployment Target — minimální verze iOS, na které může aplikace běžet. Uvádí se v Xcode Project → Info → iOS Deployment Target. Aplikace s Target 16.0 se neinstaluje na iOS 15.0 a nižší. App Store filtruje aplikace podle tohoto parametru — uživatelé s nepodporovanou verzí aplikaci nevidí. Analogie v Androidu — minSdkVersion.
Oba parametry nastavují minimální verzi OS pro instalaci aplikace. iOS Deployment Target je uložen v Info.plist (MinimumOSVersion), minSdkVersion — v AndroidManifest.xml. iOS nemá analogy pro targetSdkVersion a compileSdkVersion — všechny změny chování se aplikují při kompilaci s novým Base SDK. V Androidu jsou změny chování řízeny prostřednictvím targetSdkVersion. Kontrola v kódu: @available ve Swift vs Build.VERSION.SDK_INT v Androidu.
Doporučuje se iOS 16.0 pro masové aplikace (83 % zařízení) a iOS 17.0 pro startupy a projekty na SwiftUI Observation/SwiftData (35 % zařízení). iOS 16.0 je podporován na iPhone 8 a novějších, zahrnuje SwiftUI Layout, NavigationStack, Live Activities. iOS 17.0 poskytuje Observation, SwiftData, TipKit. Pro knihovny a SDK — iOS 15.0 pro maximální kompatibilitu.
Ve Swift použijte #available(iOS 17.0, *) uvnitř funkcí pro podmíněné provedení kódu nebo @available(iOS 17.0, *) na úrovni třídy/metody pro deklarativní kontrolu. Pro přesnou verzi — ProcessInfo.processInfo.operatingSystemVersion, vracející OperatingSystemVersion. V Objective-C použijte @available(iOS 17.0, *) uvnitř if. Bez kontrol vede volání API nad Deployment Target k runtime crashi.
Snížit iOS Deployment Target lze, ale vyžaduje to nahrazení všech přímých volání API z vyšších verzí kontrolami #available s fallback implementacemi. Xcode bude varovat žlutými upozorněními, ale nezpůsobí chybu. API bez rozumného fallback (Live Activities, SwiftData) se na starých verzích vypínají. Doporučuje se začít s Targetem 2 verze pod aktuální, aby se předešlo složité migraci.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také