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 — параметар конфигурације 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-а заснива се на провери верзије ОС-а током инсталације. iOS App Store упоређује вредност Deployment Target-а из Info.plist-а (кључ MinimumOSVersion) са верзијом ОС-а на уређају корисника. Ако је верзија уређаја нижа — дугме "Преузми" је блокирано, а App Store API не враћа апликацију у резултатима претраге за овај уређај. Аналогно понашање важи за 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 виши, то је публика мања, али су новији SwiftUI и UIKit API-ји приступачнији.
| 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% | Нови Apple Intelligence API-ји, побољшани SwiftUI |
Свако ново издање iOS-а додаје не само корисничке функције, већ и API-је за програмере. Нови SwiftUI модификатори, UIKit методи, оквири попут SwiftData и Observation доступни су само при одређеном Deployment Target-у. Програмер мора да балансира између покривености публике и доступности модерних алата.
iOS Deployment Target и Android-ов minSdkVersion обављају идентичну функцију — постављају минималну верзију ОС-а за апликацију. Међутим, механизми имплементације и пратећи алати се разликују. Разумевање ових разлика корисно је програмерима који раде на обе платформе и помаже у избегавању забуне при преласку између екосистема.
У 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) и верзијом ОС-а на уређају.
| Параметар | iOS | Android |
|---|---|---|
| Минимална верзија | Deployment Target (IPHONEOS_DEPLOYMENT_TARGET) | minSdkVersion |
| Где се наводи | Xcode Build Settings → Info.plist | build.gradle → AndroidManifest.xml |
| Провера у коду | @available / #available / if #available | Build.VERSION.SDK_INT |
| Циљана верзија | Base SDK (увек најновији) | compileSdkVersion + targetSdkVersion |
| Филтрирање у продавници | App Store: MinimumOSVersion | Google Play: minSdkVersion |
Кључна разлика — Base SDK у iOS-у је увек најновија верзија инсталирана у Xcode-у. Програмер не може да изабере compileSdkVersion као у Android-у — апликација се увек компајлира против најновијег доступног SDK-а. Нове промене понашања у iOS-у примењују се на све апликације компајлиране са новим Base SDK-ом, без обзира на Deployment Target. У Android-у targetSdkVersion даје контролу над променама понашања, у iOS-у такве поделе нема.
За разлику од 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 верзије испод тренутне ради равнотеже између покривености и функционалности.
Подешавање iOS Deployment Target-а се врши на неколико места у пројекту: главни Target, Pods пројекат (ако се користи CocoaPods), Swift Package Manager зависности и Widget/Extension targetи. Ако се вредности разликују између главне апликације и екстензија, App Store користи максималну од свих — то значи да екстензија не може имати нижи Target од главне апликације.
Отворите Xcode пројекат → изаберите Target → картица General → секција Minimum iOS Deployment. Падајућа листа приказује све доступне верзије iOS SDK-а инсталиране у Xcode-у. Промена се примењује на све шеме изградње. Алтернативно — картица Build Settings → iOS Deployment Target (IPHONEOS_DEPLOYMENT_TARGET). Ако пројекат садржи више Target-екстензија (Widget, Watch), свака има сопствени Deployment Target.
За библиотеке које се дистрибуирају кроз 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'.
// 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 при додавању зависности.
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 пројекта.
# 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
endpost_install hook у Podfile-у принудно поставља Deployment Target 16.0 за све pod библиотеке. Ово је корисно када један од pod-ова наводи виши Target него што је потребно за његову функционалност. Користите ово само ако сте сигурни да pod не користи API-је из више верзије iOS-а.
@available и #available — директиве Swift-а и Objective-C-а за безбедно позивање API-ја доступних само на одређеним верзијама ОС-а. Ако је Deployment Target пројекта iOS 16.0, а метод захтева iOS 17.0, директно позивање ће изазвати runtime crash на уређајима са iOS 16.0-16.x. Провере доступности — обавезан алат за подршку више верзија iOS-а.
Директива @available се примењује на класе, методе или целе датотеке. Ако је @available(iOS 17.0, *) наведен испред класе, цела класа је доступна само на iOS 17.0+. Покушај позивања класе на iOS 16.0 ће довести до runtime грешке. Користите @available за изолацију целих модула функционалности специфичних за одређену верзију ОС-а. За методе унутар класе, @available омогућава скривање појединачних функција.
Директива #available (if #available) проверава верзију ОС-а у runtime-у и извршава код само при њеној усаглашености. Користи се унутар функција за избор између нове и старе имплементације. У Objective-C-у аналогон је @available(iOS 17.0, *) унутар if. За сложеније провере користите ProcessInfo.processInfo.isOperatingSystemAtLeast за поређење компоненти верзије (major, minor, patch).
import UIKit
import SwiftUI
// 1. @available — цела класа само за iOS 17+
@available(iOS 17.0, *)
class ObservationViewModel: ObservableObject {
@Published var name: String = "User"
// Користи Observation оквир — доступан само 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(iOS 17.0, *) са истом семантиком као Swift #available. Разлика: Objective-C проверава у runtime-у, Swift #available — такође runtime, али са саветима компајлеру за оптимизацију гранања. За Objective-C код који сарађује са Swift-ом, провере доступности су неопходне на Objective-C страни — Swift-bridging не додаје аутоматске провере.
Избор 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 апликацију са специфичним 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. Свака додатна верзија backward compatibility повећава време QA. Ако је тим мали, разумно је изабрати Target 2–3 верзије испод тренутне (16.0) — равнотежа између покривености и утрошка рада.
| Тип апликације | Препоручени Target | Покривеност | Образложење |
|---|---|---|---|
| Масовна (друштвене мреже, маркетплејс) | iOS 16.0 | ~83% | Максимална публика |
| Enterprise / B2B | iOS 16.0 | ~83% | Корпоративни уређаји се споро ажурирају |
| Стартап / MVP | iOS 17.0 | ~35% | Брз развој на новим API-јима |
| Игре (Metal 3+) | iOS 17.0 | ~35% | Захтевају нове графичке API-је |
| Библиотека/SDK | iOS 15.0 | ~90% | Максимална компатибилност за клијенте |
Библиотеке и SDK-ови треба да имају најнижи могући Deployment Target (15.0 или чак 14.0) — потрошачи библиотеке могу имати било који Target виши од вашег. Ако библиотека захтева iOS 17.0, половина пројеката неће моћи да је повеже. За апликације, напротив, можете себи приуштити виши Target ради приступа новим API-јима.
Смањење 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), функционалност се искључује за старе верзије уз обавештавање корисника.
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-а без дуплирања целе кодовне базе — само верзионисани модули.
Након смањења Deployment Target-а, Xcode ће жуто означити све позиве API-ја недоступне у новом Target-у. Упозорење "In iOS 16.0 and later" значи да метод захтева вишу верзију. Решења: додати @available или if #available (препоручује се), потиснути кроз @available(*, deprecated) за постепену миграцију, или уклонити позив. Подешавање "Treat Warnings as Errors" у пројекту ће претворити ова упозорења у грешке компајлирања — укључите ову опцију за контролу.
Често постављана питања
iOS Deployment Target — минимална верзија iOS-а на којој апликација може да ради. Наводи се у Xcode Project → Info → iOS Deployment Target. Апликација са Target 16.0 не инсталира се на iOS 15.0 и ниже. App Store филтрира апликације према овом параметру — корисници са неподржаном верзијом не виде апликацију. Аналогон у Android-у — 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 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 за максималну компатибилност.
У Swift-у користите #available(iOS 17.0, *) унутар функција за условно извршење кода или @available(iOS 17.0, *) на нивоу класе/метода за декларативну проверу. За тачну верзију — ProcessInfo.processInfo.operatingSystemVersion, која враћа OperatingSystemVersion. У Objective-C-у користите @available(iOS 17.0, *) унутар if. Без провера, позив API-ја изнад Deployment Target-а доводи до runtime crash-а.
Смањити iOS Deployment Target може, али захтева замену свих директних позива API-ја из виших верзија на #available провере са fallback имплементацијама. Xcode ће упозорити жутим упозорењима, али неће дати грешку. API-ји без разумног fallback-а (Live Activities, SwiftData) се искључују на старијим верзијама. Препоручује се почети са Target-ом 2 верзије испод тренутне како би се избегла сложена миграција.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође