iOS Deployment Target (ook iOS Target, Deployment Target) — de minimale versie van het Apple-besturingssysteem waarop een app kan worden uitgevoerd. De parameter wordt ingesteld in het Xcode-project en bepaalt de compatibiliteitsgrens: bij keuze voor iOS 16.0 wordt de app alleen geïnstalleerd op apparaten met iOS 16.0 en nieuwer. Volgens Apple Developer Documentation beïnvloedt de juiste keuze van Deployment Target zowel het bereik van het publiek als de toegang tot nieuwe API's van Swift- en Objective-C-frameworks.
Belangrijkste punten
iOS Deployment Target — een Xcode-configuratieparameter die de vroegste versie van iOS, iPadOS, tvOS, watchOS of visionOS aangeeft waarop een app kan draaien. Elk Xcode-project bevat deze instelling voor elk platform afzonderlijk. Een iOS-app kan bijvoorbeeld Deployment Target 16.0 hebben en een watchOS-extensie — 9.0. Als het apparaat van de gebruiker iOS 15.0 gebruikt, wordt de app met Target 16.0 niet weergegeven in de App Store en niet geïnstalleerd via directe distributie.
Het werkingsmechanisme van Deployment Target is gebaseerd op controle van de OS-versie tijdens installatie. De iOS App Store vergelijkt de Deployment Target-waarde uit Info.plist (sleutel MinimumOSVersion) met de OS-versie op het apparaat van de gebruiker. Als de apparaatversie lager is — wordt de knop "Download" geblokkeerd en retourneert de App Store API de app niet in zoekresultaten voor dit apparaat. Vergelijkbaar gedrag geldt voor TestFlight, ad-hoc en enterprise-distributie.
Volgens StatCounter-gegevens van juni 2025 heeft iOS 16 ongeveer 48% van de actieve iPhone-apparaten, iOS 17 — 35%, iOS 18 — 12%, oudere versies — ongeveer 5%. De keuze voor Deployment Target 16.0 dekt 83% van de apparaten, Target 17.0 — 35% (alleen iOS 17+). Deze cijfers zijn cruciaal voor besluitvorming: hoe hoger het Target, hoe kleiner het publiek, maar hoe toegankelijker de nieuwste SwiftUI- en UIKit-API's.
| Deployment Target | Aandeel apparaten (juni 2025) | Beschikbare functies |
|---|---|---|
| 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% | Nieuwe Apple Intelligence API's, verbeterde SwiftUI |
Elke nieuwe iOS-release voegt niet alleen gebruikersfuncties toe, maar ook API's voor ontwikkelaars. Nieuwe SwiftUI-modifiers, UIKit-methoden, frameworks zoals SwiftData en Observation zijn alleen beschikbaar bij een specifiek Deployment Target. De ontwikkelaar moet balanceren tussen publieksbereik en beschikbaarheid van moderne tools.
iOS Deployment Target en minSdkVersion van Android vervullen dezelfde functie — ze stellen de minimale OS-versie voor een app in. De implementatiemechanismen en bijbehorende tools verschillen echter. Inzicht in deze verschillen is nuttig voor ontwikkelaars die op beide platformen werken en helpt verwarring te voorkomen bij overstap tussen ecosystemen.
In iOS wordt de minimale versie ingesteld via Xcode build settings (IPHONEOS_DEPLOYMENT_TARGET) en opgeslagen in Info.plist (MinimumOSVersion). In Android — via build.gradle (minSdkVersion) en AndroidManifest.xml (<uses-sdk android:minSdkVersion>). iOS heeft geen equivalenten voor targetSdkVersion en compileSdkVersion — gedragsveranderingen in iOS worden beheerd door de SDK waarmee de app is gecompileerd (Base SDK) en de OS-versie op het apparaat.
| Parameter | iOS | Android |
|---|---|---|
| Minimale versie | Deployment Target (IPHONEOS_DEPLOYMENT_TARGET) | minSdkVersion |
| Waar gespecificeerd | Xcode Build Settings → Info.plist | build.gradle → AndroidManifest.xml |
| Controle in code | @available / #available / if #available | Build.VERSION.SDK_INT |
| Doelversie | Base SDK (altijd de nieuwste) | compileSdkVersion + targetSdkVersion |
| Filteren in winkel | App Store: MinimumOSVersion | Google Play: minSdkVersion |
Het belangrijkste verschil — Base SDK in iOS is altijd de nieuwste versie geïnstalleerd in Xcode. De ontwikkelaar kan geen compileSdkVersion kiezen zoals in Android — de app wordt altijd gecompileerd tegen de nieuwste beschikbare SDK. Nieuwe gedragsveranderingen in iOS worden toegepast op alle apps gecompileerd met de nieuwe Base SDK, ongeacht het Deployment Target. In Android geeft targetSdkVersion controle over gedragsveranderingen, in iOS bestaat deze scheiding niet.
In tegenstelling tot Android, waar gedragsveranderingen zijn gekoppeld aan targetSdkVersion, past iOS gedragsveranderingen toe op alle apps die zijn gecompileerd met de nieuwe versie van Xcode en Base SDK. iOS 13 introduceerde bijvoorbeeld Dark Mode — alle apps gebouwd met Xcode 11 en iOS 13 SDK kregen automatisch ondersteuning voor het donkere thema, ongeacht het Deployment Target. In Android wordt een vergelijkbare verandering (Scoped Storage) alleen toegepast bij targetSdk >= 29. Een iOS-ontwikkelaar moet voorbereid zijn op gedragsveranderingen met elke nieuwe Xcode, zonder uitstel mogelijkheid.
Kennis van beide platformen maakt het mogelijk de gevolgen van het kiezen van de minimale versie te voorspellen en code-updates voor nieuwe API's te plannen. Bij IT Sectr gebruiken we sinds 2017 beide ecosystemen — de praktijk toont aan dat iOS Deployment Target 2–3 versies onder de huidige moet worden gekozen voor een balans tussen bereik en functionaliteit.
Configuratie van iOS Deployment Target wordt op meerdere plaatsen in het project uitgevoerd: het hoofd-Target, het Pods-project (indien CocoaPods wordt gebruikt), Swift Package Manager-afhankelijkheden en Widget/Extension-targets. Als waarden verschillen tussen de hoofd-app en extensies, gebruikt de App Store de maximale van alle — dat wil zeggen dat een extensie geen lager Target kan hebben dan de hoofd-app.
Open het Xcode-project → selecteer Target → tabblad General → sectie Minimum iOS Deployment. De vervolgkeuzelijst toont alle beschikbare iOS SDK-versies geïnstalleerd in Xcode. De wijziging wordt toegepast op alle buildschema's. Alternatief — tabblad Build Settings → iOS Deployment Target (IPHONEOS_DEPLOYMENT_TARGET). Als het project meerdere Target-extensies bevat (Widget, Watch), heeft elk zijn eigen Deployment Target.
Voor bibliotheken die via SPM worden gedistribueerd, wordt Deployment Target gespecificeerd in Package.swift in de parameter platforms. Een bibliotheek met platforms: [.iOS(.v16)] is alleen beschikbaar voor apps met Deployment Target iOS 16.0+. Bij het koppelen van een dergelijke bibliotheek aan een project met Target 15.0 geeft Xcode een compatibiliteitsfout. In CocoaPods wordt Deployment Target ingesteld in Podfile: platform :ios, '16.0'.
// Package.swift — Deployment Target voor SPM-bibliotheek
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")
]
)
]
)
// Compatibiliteitscontrole in code
#if swift(>=5.9)
// Swift 5.9+ functies (Xcode 15+)
#endifIn het voorbeeld Package.swift zijn de platformen iOS 16+, macOS 13+, watchOS 9+, tvOS 16+ ingesteld. Elk project met een Deployment Target onder iOS 16.0 kan deze bibliotheek niet koppelen. De parameter swiftSettings bevat upcoming features voor een specifieke Swift-versie. SPM controleert automatisch de compatibiliteit van platforms bij het toevoegen van afhankelijkheden.
Podfile gebruikt de richtlijn platform :ios, '16.0'. Na pod install controleert CocoaPods het Deployment Target van elke pod-bibliotheek: als er minstens één een hoger Target heeft dan het project, eindigt de installatie met de fout "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". Oplossing — verlaag het Target van de problematische pod of verhoog het Target van het project.
# Podfile — voorbeeld met Deployment Target
platform :ios, '16.0'
# Waarschuwingen over Deployment Target negeren
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
endDe post_install hook in Podfile forceert Deployment Target 16.0 voor alle pod-bibliotheken. Dit is handig wanneer een van de pods een hoger Target specificeert dan nodig is voor de functionaliteit. Gebruik dit alleen als u zeker weet dat de pod geen API's van een hogere iOS-versie gebruikt.
@available en #available — richtlijnen van Swift en Objective-C voor het veilig aanroepen van API's die alleen beschikbaar zijn op bepaalde OS-versies. Als het Deployment Target van het project iOS 16.0 is en een methode vereist iOS 17.0, leidt een directe aanroep tot een runtime-crash op apparaten met iOS 16.0-16.x. Beschikbaarheidscontroles — verplicht hulpmiddel voor ondersteuning van meerdere iOS-versies.
De @available-richtlijn wordt toegepast op klassen, methoden of hele bestanden. Als @available(iOS 17.0, *) voor een klasse is gespecificeerd, is de hele klasse alleen beschikbaar op iOS 17.0+. Poging om de klasse op iOS 16.0 aan te roepen leidt tot een runtime-fout. Gebruik @available voor het isoleren van hele functionaliteitsmodules die specifiek zijn voor een bepaalde OS-versie. Voor methoden binnen een klasse maakt @available het mogelijk individuele functies te verbergen.
De #available-richtlijn (if #available) controleert de OS-versie in runtime en voert code alleen uit bij overeenkomst. Wordt gebruikt binnen functies om te kiezen tussen nieuwe en oude implementaties. In Objective-C is het equivalent @available(iOS 17.0, *) binnen if. Voor complexere controles gebruikt u ProcessInfo.processInfo.isOperatingSystemAtLeast om versiecomponenten (major, minor, patch) te vergelijken.
import UIKit
import SwiftUI
// 1. @available — hele klasse alleen voor iOS 17+
@available(iOS 17.0, *)
class ObservationViewModel: ObservableObject {
@Published var name: String = "User"
// Gebruikt Observation-framework — alleen beschikbaar iOS 17+
func updateWithObservation() {
let newName = "Updated via Observation"
name = newName
}
}
// 2. #available — voorwaardelijke aanroep binnen functie
func configureLiveActivity() {
if #available(iOS 16.1, *) {
// Live Activities API — beschikbaar vanaf iOS 16.1
let activity = Activity<MyAttributes>(
attributes: MyAttributes(name: "Live"),
contentState: MyContentState(value: 42)
)
Task {
await activity.activate()
}
} else {
// Fallback: pushmelding of niets
print("Live Activities niet beschikbaar")
}
}
// 3. ProcessInfo — exacte versiecontrole
func checkOSVersion() {
let osVersion = ProcessInfo.processInfo.operatingSystemVersion
print("iOS \(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)")
// Vergelijking van componenten
if osVersion.majorVersion >= 17 {
print("iOS 17+ gedetecteerd")
}
}
// 4. Objective-C @available
// In Objective-C wordt @available gebruikt:
// if (@available(iOS 17.0, *)) { }
// 5. @available met argument unavailable
@available(*, unavailable, message: "Use configureWithSwiftUI instead")
func legacyConfigureMethod() { }De klasse ObservationViewModel gebruikt @available om iOS 17-functionaliteit te isoleren. De functie configureLiveActivity gebruikt #available om Live Activities (iOS 16.1+) te controleren met een fallback-implementatie. ProcessInfo controleert de exacte OS-versie. @available(*, unavailable) markeert een methode als niet beschikbaar op alle versies — voor migratie naar een nieuwe API. Zonder deze controles zal een app met Deployment Target 16.0 crashen op apparaten met iOS 16.0 bij het aanroepen van een iOS 17 API.
Objective-C gebruikt @available(iOS 17.0, *) met dezelfde semantiek als Swift #available. Verschil: Objective-C controleert in runtime, Swift #available — ook runtime, maar met hints voor de compiler om vertakkingen te optimaliseren. Voor Objective-C-code die samenwerkt met Swift, zijn beschikbaarheidscontroles aan de Objective-C-kant noodzakelijk — Swift-bridging voegt geen automatische controles toe.
De keuze van iOS Deployment Target — een strategische beslissing die drie aspecten beïnvloedt: publieksbereik, beschikbare API's en complexiteit van code-onderhoud. Er is geen enkele juiste waarde — de keuze hangt af van de doelgroep van de app, minimaal vereiste functies en teamresources voor backward compatibility-ondersteuning.
Eerste factor — statistieken van iOS-versiegebruik. Apple publiceert iOS-installatiegegevens op WWDC en in Apple Developer Dashboard. Per juni 2025 is de verdeling: iOS 15 — ~7%, iOS 16 — ~48%, iOS 17 — ~35%, iOS 18 — ~10%. Keuze voor Target 16.0 geeft 83% bereik, Target 17.0 — 35%. Voor een massale app (sociale media, messengers, e-commerce) wordt Target 16.0 aanbevolen. Voor een niche B2B-app met specifieke API-vereisten — Target 17.0.
Tweede factor — vereiste API's. Als een kernfunctie van de app SwiftData (iOS 17+), Observation (iOS 17+) of Live Activities (iOS 16.1+) vereist, kan Target niet lager zijn dan de vereiste versie. Analyse van vereiste API's in de ontwerpfase voorkomt de situatie waarin halverwege de ontwikkeling blijkt dat een hoger Target nodig is. Gebruik Availability Checks als back-upoptie, maar niet als hoofdplan.
Derde factor — resources voor testen. Ondersteuning van oude iOS-versies vereist testen op simulators en echte apparaten met deze versies. iOS 15 wordt getest op iPhone 6s/7, iOS 16 — op iPhone 8/X, iOS 17 — op iPhone XS/XR. Elke extra backward compatibility-versie verhoogt de QA-tijd. Als het team klein is, is het verstandig om een Target 2–3 versies onder de huidige (16.0) te kiezen — balans tussen bereik en inspanning.
| App-type | Aanbevolen Target | Bereik | Motivatie |
|---|---|---|---|
| Massaal (sociale media, marketplace) | iOS 16.0 | ~83% | Maximaal publiek |
| Enterprise / B2B | iOS 16.0 | ~83% | Bedrijfsapparaten worden langzaam bijgewerkt |
| Startup / MVP | iOS 17.0 | ~35% | Snelle ontwikkeling op nieuwe API's |
| Games (Metal 3+) | iOS 17.0 | ~35% | Vereisen nieuwe grafische API's |
| Bibliotheek/SDK | iOS 15.0 | ~90% | Maximale compatibiliteit voor klanten |
Bibliotheken en SDK's moeten het laagst mogelijke Deployment Target hebben (15.0 of zelfs 14.0) — consumenten van de bibliotheek kunnen elk hoger Target hebben dan u. Als een bibliotheek iOS 17.0 vereist, kan de helft van de projecten deze niet koppelen. Voor apps kunt u daarentegen een hoger Target veroorloven voor toegang tot nieuwe API's.
Het verlagen van iOS Deployment Target — een taak die ontstaat bij de noodzaak het publiek uit te breiden of bij publicatie van een bibliotheek met compatibiliteit met oude projecten. In tegenstelling tot verhogen, vereist verlagen actief werk met de code: alle directe aanroepen van API's die niet beschikbaar zijn in het nieuwe (lagere) Target moeten worden vervangen door #available-controles met fallback-implementaties.
Eerste stap — API-inventarisatie. Xcode geeft geen compilatiefouten bij het verlagen van Target — het waarschuwt alleen met gele waarschuwingen. U moet alle methoden en klassen vinden die zijn gemarkeerd met @available(iOS N+, *), waarbij N hoger is dan het nieuwe Target. Gebruik projectzoekopdracht (Cmd+Shift+F) met het patroon "available(iOS". Elke dergelijke aanroep — kandidaat voor refactoring.
Tweede stap — vervangen door #available-controles. Elke API-aanroep van een hogere versie wordt ingepakt in if #available(iOS N+, *) { } else { }. Voor hele klassen gebruikt u #if os(iOS) met @available op typeniveau. Als een API geen redelijke fallback heeft (bijv. Live Activities), wordt de functionaliteit uitgeschakeld voor oude versies met melding aan de gebruiker.
import UIKit
import SwiftUI
// Deployment Target verlagen van 17.0 naar 16.0
// VOOR (@available iOS 17.0):
@available(iOS 17.0, *)
func setupObservation() {
// Observation framework — alleen iOS 17+
let model = ObservationViewModel()
// ...
}
// NA (#available controle):
func setupObservationCompatible() {
if #available(iOS 17.0, *) {
// iOS 17+: Observation framework
let model = ObservationViewModel()
// ...
} else {
// iOS 16.x: ObservableObject met @Published
let model = LegacyObservableViewModel()
// ...
}
}
// Voor UIKit iOS 17+ API:
@available(iOS 17.0, *)
class ModernViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Gebruikt UIKit TraitChanges (iOS 17+)
registerForTraitChanges([UITraitVerticalSizeClass.self]) { _, _ in }
}
}
// Fallback voor iOS 16:
class LegacyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Geen registerForTraitChanges — we gebruiken traitCollectionDidChange
}
override func traitCollectionDidChange(_: UITraitCollection?) {
super.traitCollectionDidChange(nil)
// Verwerking van traits-wijzigingen voor iOS 16
}
}
// Factory voor implementatiekeuze op basis van iOS-versie
func makeViewController() -> UIViewController {
if #available(iOS 17.0, *) {
return ModernViewController()
} else {
return LegacyViewController()
}
}De code demonstreert het verlagen van Target van iOS 17.0 naar 16.0. De functie setupObservation is vervangen door setupObservationCompatible met een #available-controle. ViewController is opgesplitst in Modern (iOS 17+) en Legacy (iOS 16) met een factory makeViewController die de implementatie kiest op basis van de OS-versie. Zo'n architectuur maakt het mogelijk twee Deployment Targets te onderhouden zonder de hele codebase te dupliceren — alleen geversioneerde modules.
Na het verlagen van het Deployment Target markeert Xcode alle API-aanroepen die niet beschikbaar zijn in het nieuwe Target geel. De waarschuwing "In iOS 16.0 and later" betekent dat de methode een hogere versie vereist. Oplossingen: voeg @available of if #available toe (aanbevolen), onderdruk via @available(*, deprecated) voor geleidelijke migratie, of verwijder de aanroep. De instelling "Treat Warnings as Errors" in het project verandert deze waarschuwingen in compilatiefouten — schakel deze optie in voor controle.
Veelgestelde vragen
iOS Deployment Target — de minimale iOS-versie waarop een app kan draaien. Wordt gespecificeerd in Xcode Project → Info → iOS Deployment Target. Een app met Target 16.0 installeert niet op iOS 15.0 en lager. De App Store filtert apps op deze parameter — gebruikers met een niet-ondersteunde versie zien de app niet. Equivalent in Android — minSdkVersion.
Beide parameters stellen de minimale OS-versie in voor app-installatie. iOS Deployment Target wordt opgeslagen in Info.plist (MinimumOSVersion), minSdkVersion — in AndroidManifest.xml. iOS heeft geen equivalenten voor targetSdkVersion en compileSdkVersion — alle gedragsveranderingen worden toegepast bij compilatie met de nieuwe Base SDK. In Android worden gedragsveranderingen gecontroleerd via targetSdkVersion. Controle in code: @available in Swift vs Build.VERSION.SDK_INT in Android.
iOS 16.0 wordt aanbevolen voor massa-apps (83% apparaten) en iOS 17.0 voor startups en projecten met SwiftUI Observation/SwiftData (35% apparaten). iOS 16.0 wordt ondersteund op iPhone 8 en nieuwer, inclusief SwiftUI Layout, NavigationStack, Live Activities. iOS 17.0 biedt Observation, SwiftData, TipKit. Voor bibliotheken en SDK's — iOS 15.0 voor maximale compatibiliteit.
In Swift gebruikt u #available(iOS 17.0, *) binnen functies voor voorwaardelijke uitvoering of @available(iOS 17.0, *) op klas-/methodeniveau voor declaratieve controle. Voor de exacte versie — ProcessInfo.processInfo.operatingSystemVersion, die OperatingSystemVersion retourneert. In Objective-C gebruikt u @available(iOS 17.0, *) binnen if. Zonder controles leidt aanroep van een API boven het Deployment Target tot een runtime-crash.
iOS Deployment Target verlagen is mogelijk, maar vereist vervanging van alle directe API-aanroepen van hogere versies door #available-controles met fallback-implementaties. Xcode waarschuwt met gele meldingen maar geeft geen fout. API's zonder redelijke fallback (Live Activities, SwiftData) worden uitgeschakeld op oude versies. Het wordt aanbevolen te beginnen met een Target 2 versies onder de huidige om complexe migratie te voorkomen.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook