iOS Deployment Target (juga iOS Target, Deployment Target) — versi minimum sistem operasi Apple tempat aplikasi dapat dijalankan. Parameter ini diatur dalam proyek Xcode dan menentukan batas kompatibilitas: saat memilih iOS 16.0, aplikasi hanya diinstal pada perangkat dengan iOS 16.0 dan lebih baru. Menurut Apple Developer Documentation, pemilihan Deployment Target yang tepat memengaruhi cakupan audiens dan akses ke API baru framework Swift dan Objective-C.
Poin utama
iOS Deployment Target — parameter konfigurasi Xcode yang menunjukkan versi paling awal dari iOS, iPadOS, tvOS, watchOS, atau visionOS tempat aplikasi dapat berjalan. Setiap proyek Xcode berisi pengaturan ini untuk setiap platform secara terpisah. Misalnya, aplikasi iOS dapat memiliki Deployment Target 16.0, dan ekstensi watchOS — 9.0. Jika perangkat pengguna menjalankan iOS 15.0, aplikasi dengan Target 16.0 tidak akan ditampilkan di App Store dan tidak akan diinstal melalui distribusi langsung.
Mekanisme kerja Deployment Target didasarkan pada pemeriksaan versi OS selama instalasi. App Store iOS membandingkan nilai Deployment Target dari Info.plist (kunci MinimumOSVersion) dengan versi OS pada perangkat pengguna. Jika versi perangkat lebih rendah — tombol "Unduh" diblokir, dan API App Store tidak mengembalikan aplikasi dalam hasil pencarian untuk perangkat ini. Perilaku serupa berlaku untuk TestFlight, distribusi ad-hoc, dan enterprise.
Menurut data StatCounter per Juni 2025, iOS 16 menempati sekitar 48% perangkat iPhone aktif, iOS 17 — 35%, iOS 18 — 12%, versi yang lebih lama — sekitar 5%. Pemilihan Deployment Target 16.0 mencakup 83% perangkat, Target 17.0 — 35% (hanya iOS 17+). Angka-angka ini sangat penting untuk pengambilan keputusan: semakin tinggi Target, semakin kecil audiens, tetapi semakin mudah diakses API SwiftUI dan UIKit terbaru.
| Deployment Target | Pangsa perangkat (Juni 2025) | Fungsi yang tersedia |
|---|---|---|
| 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 baru, SwiftUI yang ditingkatkan |
Setiap rilis iOS baru tidak hanya menambahkan fitur pengguna, tetapi juga API untuk pengembang. Modifier SwiftUI baru, metode UIKit, framework seperti SwiftData dan Observation hanya tersedia pada Deployment Target tertentu. Pengembang harus menyeimbangkan antara cakupan audiens dan ketersediaan alat modern.
iOS Deployment Target dan minSdkVersion Android menjalankan fungsi yang identik — menetapkan versi OS minimum untuk aplikasi. Namun, mekanisme implementasi dan alat pendukungnya berbeda. Memahami perbedaan ini berguna bagi pengembang yang bekerja di kedua platform dan membantu menghindari kebingungan saat beralih antar ekosistem.
Di iOS, versi minimum diatur melalui pengaturan build Xcode (IPHONEOS_DEPLOYMENT_TARGET) dan disimpan di Info.plist (MinimumOSVersion). Di Android — melalui build.gradle (minSdkVersion) dan AndroidManifest.xml (<uses-sdk android:minSdkVersion>). iOS tidak memiliki analog untuk targetSdkVersion dan compileSdkVersion — perubahan perilaku di iOS dikelola oleh SDK tempat aplikasi dikompilasi (Base SDK) dan versi OS pada perangkat.
| Parameter | iOS | Android |
|---|---|---|
| Versi minimum | Deployment Target (IPHONEOS_DEPLOYMENT_TARGET) | minSdkVersion |
| Di mana ditentukan | Xcode Build Settings → Info.plist | build.gradle → AndroidManifest.xml |
| Pemeriksaan dalam kode | @available / #available / if #available | Build.VERSION.SDK_INT |
| Versi target | Base SDK (selalu terbaru) | compileSdkVersion + targetSdkVersion |
| Pemfilteran di toko | App Store: MinimumOSVersion | Google Play: minSdkVersion |
Perbedaan utama — Base SDK di iOS selalu merupakan versi terbaru yang diinstal di Xcode. Pengembang tidak dapat memilih compileSdkVersion seperti di Android — aplikasi selalu dikompilasi terhadap SDK terbaru yang tersedia. Perubahan perilaku baru di iOS diterapkan pada semua aplikasi yang dikompilasi dengan Base SDK baru, terlepas dari Deployment Target. Di Android, targetSdkVersion memberikan kontrol atas perubahan perilaku, di iOS tidak ada pemisahan seperti itu.
Tidak seperti Android, di mana perubahan perilaku terikat pada targetSdkVersion, iOS menerapkan perubahan perilaku ke semua aplikasi yang dikompilasi dengan versi baru Xcode dan Base SDK. Misalnya, iOS 13 memperkenalkan Dark Mode — semua aplikasi yang dibangun dengan Xcode 11 dan iOS 13 SDK secara otomatis menerima dukungan tema gelap, terlepas dari Deployment Target. Di Android, perubahan serupa (Scoped Storage) hanya diterapkan pada targetSdk >= 29. Pengembang iOS harus siap menghadapi perubahan perilaku dengan setiap Xcode baru, tanpa kemungkinan penundaan.
Pengetahuan tentang kedua platform memungkinkan memprediksi konsekuensi pemilihan versi minimum dan merencanakan pembaruan kode untuk API baru. Di IT Sectr kami menggunakan kedua ekosistem sejak 2017 — praktik menunjukkan bahwa iOS Deployment Target sebaiknya dipilih 2–3 versi di bawah versi saat ini untuk keseimbangan antara cakupan dan fungsionalitas.
Konfigurasi iOS Deployment Target dilakukan di beberapa tempat proyek: Target utama, proyek Pods (jika CocoaPods digunakan), dependensi Swift Package Manager, dan target Widget/Extension. Jika nilai berbeda antara aplikasi utama dan ekstensi, App Store menggunakan nilai maksimum dari semuanya — artinya ekstensi tidak dapat memiliki Target lebih rendah dari aplikasi utama.
Buka proyek Xcode → pilih Target → tab General → bagian Minimum iOS Deployment. Daftar drop-down menunjukkan semua versi iOS SDK yang tersedia yang diinstal di Xcode. Perubahan diterapkan ke semua skema build. Alternatif — tab Build Settings → iOS Deployment Target (IPHONEOS_DEPLOYMENT_TARGET). Jika proyek berisi beberapa target ekstensi (Widget, Watch), masing-masing memiliki Deployment Target sendiri.
Untuk pustaka yang didistribusikan melalui SPM, Deployment Target ditentukan dalam Package.swift di parameter platforms. Pustaka dengan platforms: [.iOS(.v16)] hanya akan tersedia untuk aplikasi dengan Deployment Target iOS 16.0+. Saat menghubungkan pustaka semacam itu ke proyek dengan Target 15.0, Xcode akan memberikan kesalahan ketidakcocokan. Di CocoaPods, Deployment Target diatur dalam Podfile: platform :ios, '16.0'.
// Package.swift — Deployment Target untuk pustaka 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")
]
)
]
)
// Pemeriksaan kompatibilitas dalam kode
#if swift(>=5.9)
// Fitur Swift 5.9+ (Xcode 15+)
#endifDalam contoh Package.swift, platform diatur ke iOS 16+, macOS 13+, watchOS 9+, tvOS 16+. Proyek apa pun dengan Deployment Target di bawah iOS 16.0 tidak akan dapat menghubungkan pustaka ini. Parameter swiftSettings mencakup upcoming features untuk versi Swift tertentu. SPM secara otomatis memeriksa kompatibilitas platforms saat menambahkan dependensi.
Podfile menggunakan direktif platform :ios, '16.0'. Setelah pod install, CocoaPods memeriksa Deployment Target setiap pustaka pod: jika setidaknya satu memiliki Target lebih tinggi dari proyek, instalasi akan berakhir dengan kesalahan "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". Solusi — turunkan Target pod yang bermasalah atau naikkan Target proyek.
# Podfile — contoh dengan Deployment Target
platform :ios, '16.0'
# Abaikan peringatan tentang 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 di Podfile memaksa pengaturan Deployment Target 16.0 untuk semua pustaka pod. Ini berguna ketika salah satu pod menentukan Target yang lebih tinggi dari yang diperlukan untuk fungsionalitasnya. Gunakan ini hanya jika Anda yakin pod tidak menggunakan API dari versi iOS yang lebih tinggi.
@available dan #available — direktif Swift dan Objective-C untuk memanggil API dengan aman yang hanya tersedia pada versi OS tertentu. Jika Deployment Target proyek adalah iOS 16.0 dan metode memerlukan iOS 17.0, panggilan langsung akan menyebabkan crash runtime pada perangkat dengan iOS 16.0-16.x. Pemeriksaan ketersediaan — alat wajib untuk mendukung beberapa versi iOS.
Direktif @available diterapkan pada kelas, metode, atau seluruh file. Jika @available(iOS 17.0, *) ditentukan sebelum kelas, seluruh kelas hanya tersedia di iOS 17.0+. Upaya memanggil kelas di iOS 16.0 akan menyebabkan kesalahan runtime. Gunakan @available untuk mengisolasi seluruh modul fungsionalitas yang spesifik untuk versi OS tertentu. Untuk metode di dalam kelas, @available memungkinkan menyembunyikan fungsi individual.
Direktif #available (if #available) memeriksa versi OS saat runtime dan menjalankan kode hanya jika cocok. Digunakan di dalam fungsi untuk memilih antara implementasi baru dan lama. Di Objective-C, analognya adalah @available(iOS 17.0, *) di dalam if. Untuk pemeriksaan yang lebih kompleks, gunakan ProcessInfo.processInfo.isOperatingSystemAtLeast untuk membandingkan komponen versi (major, minor, patch).
import UIKit
import SwiftUI
// 1. @available — seluruh kelas hanya untuk iOS 17+
@available(iOS 17.0, *)
class ObservationViewModel: ObservableObject {
@Published var name: String = "User"
// Menggunakan framework Observation — hanya tersedia iOS 17+
func updateWithObservation() {
let newName = "Updated via Observation"
name = newName
}
}
// 2. #available — panggilan bersyarat di dalam fungsi
func configureLiveActivity() {
if #available(iOS 16.1, *) {
// Live Activities API — tersedia sejak iOS 16.1
let activity = Activity<MyAttributes>(
attributes: MyAttributes(name: "Live"),
contentState: MyContentState(value: 42)
)
Task {
await activity.activate()
}
} else {
// Fallback: pemberitahuan push atau tidak ada
print("Live Activities tidak tersedia")
}
}
// 3. ProcessInfo — pemeriksaan versi yang tepat
func checkOSVersion() {
let osVersion = ProcessInfo.processInfo.operatingSystemVersion
print("iOS \(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)")
// Perbandingan komponen
if osVersion.majorVersion >= 17 {
print("iOS 17+ terdeteksi")
}
}
// 4. Objective-C @available
// Di Objective-C, @available digunakan:
// if (@available(iOS 17.0, *)) { }
// 5. @available dengan argumen unavailable
@available(*, unavailable, message: "Use configureWithSwiftUI instead")
func legacyConfigureMethod() { }Kelas ObservationViewModel menggunakan @available untuk mengisolasi fungsionalitas iOS 17. Fungsi configureLiveActivity menggunakan #available untuk memeriksa Live Activities (iOS 16.1+) dengan implementasi fallback. ProcessInfo memeriksa versi OS yang tepat. @available(*, unavailable) menandai metode sebagai tidak tersedia di semua versi — untuk migrasi ke API baru. Tanpa pemeriksaan ini, aplikasi dengan Deployment Target 16.0 akan crash pada perangkat iOS 16.0 saat memanggil API iOS 17.
Objective-C menggunakan @available(iOS 17.0, *) dengan semantik yang sama dengan Swift #available. Perbedaan: Objective-C memeriksa saat runtime, Swift #available — juga runtime, tetapi dengan petunjuk ke compiler untuk mengoptimalkan percabangan. Untuk kode Objective-C yang berinteraksi dengan Swift, pemeriksaan ketersediaan diperlukan di sisi Objective-C — Swift-bridging tidak menambahkan pemeriksaan otomatis.
Pemilihan iOS Deployment Target — keputusan strategis yang memengaruhi tiga aspek: cakupan audiens, API yang tersedia, dan kompleksitas pemeliharaan kode. Tidak ada nilai tunggal yang benar — pilihan tergantung pada audiens target aplikasi, fungsi minimal yang diperlukan, dan sumber daya tim untuk mendukung kompatibilitas mundur.
Faktor pertama — statistik penggunaan versi iOS. Apple mempublikasikan data instalasi iOS di WWDC dan Apple Developer Dashboard. Per Juni 2025 distribusi: iOS 15 — ~7%, iOS 16 — ~48%, iOS 17 — ~35%, iOS 18 — ~10%. Pemilihan Target 16.0 memberikan cakupan 83%, Target 17.0 — 35%. Untuk aplikasi massal (media sosial, messenger, e-commerce) direkomendasikan Target 16.0. Untuk aplikasi B2B khusus dengan API spesifik — Target 17.0.
Faktor kedua — API yang diperlukan. Jika fungsi utama aplikasi memerlukan SwiftData (iOS 17+), Observation (iOS 17+), atau Live Activities (iOS 16.1+), Target tidak boleh lebih rendah dari versi yang diperlukan. Analisis API yang diperlukan pada tahap desain mencegah situasi di mana di tengah pengembangan ternyata diperlukan Target yang lebih tinggi. Gunakan Availability Checks sebagai opsi cadangan, bukan sebagai rencana utama.
Faktor ketiga — sumber daya pengujian. Dukungan untuk versi iOS lama memerlukan pengujian pada simulator dan perangkat nyata dengan versi tersebut. iOS 15 diuji pada iPhone 6s/7, iOS 16 — pada iPhone 8/X, iOS 17 — pada iPhone XS/XR. Setiap versi backward compatibility tambahan meningkatkan waktu QA. Jika tim kecil, masuk akal untuk memilih Target 2–3 versi di bawah versi saat ini (16.0) — keseimbangan antara cakupan dan biaya tenaga kerja.
| Tipe aplikasi | Target yang direkomendasikan | Cakupan | Alasan |
|---|---|---|---|
| Massal (sosial media, marketplace) | iOS 16.0 | ~83% | Audiens maksimal |
| Enterprise / B2B | iOS 16.0 | ~83% | Perangkat perusahaan diperbarui lambat |
| Startup / MVP | iOS 17.0 | ~35% | Pengembangan cepat di API baru |
| Game (Metal 3+) | iOS 17.0 | ~35% | Memerlukan API grafis baru |
| Pustaka/SDK | iOS 15.0 | ~90% | Kompatibilitas maksimal untuk klien |
Pustaka dan SDK harus memiliki Deployment Target serendah mungkin (15.0 atau bahkan 14.0) — konsumen pustaka dapat memiliki Target apa pun yang lebih tinggi dari Anda. Jika pustaka memerlukan iOS 17.0, setengah dari proyek tidak akan dapat menghubungkannya. Untuk aplikasi, sebaliknya, Anda dapat membiarkan Target yang lebih tinggi untuk akses ke API baru.
Penurunan iOS Deployment Target — tugas yang muncul saat kebutuhan untuk memperluas audiens atau saat menerbitkan pustaka dengan kompatibilitas dengan proyek lama. Tidak seperti menaikkan, menurunkan memerlukan kerja aktif dengan kode: Anda harus mengganti semua panggilan langsung API yang tidak tersedia di Target baru (lebih rendah) dengan pemeriksaan #available dengan implementasi fallback.
Langkah pertama — inventarisasi API. Xcode tidak memberikan kesalahan kompilasi saat menurunkan Target — hanya memperingatkan dengan peringatan kuning. Anda perlu menemukan semua metode dan kelas yang ditandai dengan @available(iOS N+, *), di mana N lebih tinggi dari Target baru. Gunakan pencarian proyek (Cmd+Shift+F) dengan pola "available(iOS". Setiap panggilan tersebut — kandidat untuk refactoring.
Langkah kedua — penggantian dengan pemeriksaan #available. Setiap panggilan API dari versi yang lebih tinggi dibungkus dalam if #available(iOS N+, *) { } else { }. Untuk seluruh kelas, gunakan #if os(iOS) dengan @available di tingkat tipe. Jika API tidak memiliki fallback yang masuk akal (misalnya, Live Activities), fungsionalitas dinonaktifkan untuk versi lama dengan pemberitahuan kepada pengguna.
import UIKit
import SwiftUI
// Penurunan Deployment Target dari 17.0 ke 16.0
// SEBELUM (@available iOS 17.0):
@available(iOS 17.0, *)
func setupObservation() {
// Observation framework — hanya iOS 17+
let model = ObservationViewModel()
// ...
}
// SETELAH (pemeriksaan #available):
func setupObservationCompatible() {
if #available(iOS 17.0, *) {
// iOS 17+: Observation framework
let model = ObservationViewModel()
// ...
} else {
// iOS 16.x: ObservableObject dengan @Published
let model = LegacyObservableViewModel()
// ...
}
}
// Untuk UIKit iOS 17+ API:
@available(iOS 17.0, *)
class ModernViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Menggunakan UIKit TraitChanges (iOS 17+)
registerForTraitChanges([UITraitVerticalSizeClass.self]) { _, _ in }
}
}
// Fallback untuk iOS 16:
class LegacyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Tidak ada registerForTraitChanges — kami menggunakan traitCollectionDidChange
}
override func traitCollectionDidChange(_: UITraitCollection?) {
super.traitCollectionDidChange(nil)
// Pemrosesan perubahan traits untuk iOS 16
}
}
// Pabrik untuk memilih implementasi berdasarkan versi iOS
func makeViewController() -> UIViewController {
if #available(iOS 17.0, *) {
return ModernViewController()
} else {
return LegacyViewController()
}
}Kode mendemonstrasikan penurunan Target dari iOS 17.0 ke 16.0. Fungsi setupObservation diganti dengan setupObservationCompatible dengan pemeriksaan #available. ViewController dibagi menjadi Modern (iOS 17+) dan Legacy (iOS 16) dengan pabrik makeViewController yang memilih implementasi berdasarkan versi OS. Arsitektur semacam itu memungkinkan mempertahankan dua Deployment Target tanpa menduplikasi seluruh basis kode — hanya modul yang diberi versi.
Setelah menurunkan Deployment Target, Xcode akan menyorot kuning semua panggilan API yang tidak tersedia di Target baru. Peringatan "In iOS 16.0 and later" berarti metode memerlukan versi yang lebih tinggi. Solusi: tambahkan @available atau if #available (direkomendasikan), tekan melalui @available(*, deprecated) untuk migrasi bertahap, atau hapus panggilan. Pengaturan "Treat Warnings as Errors" dalam proyek akan mengubah peringatan ini menjadi kesalahan kompilasi — aktifkan opsi ini untuk kontrol.
Pertanyaan yang sering diajukan
iOS Deployment Target — versi minimum iOS tempat aplikasi dapat berjalan. Ditentukan di Xcode Project → Info → iOS Deployment Target. Aplikasi dengan Target 16.0 tidak diinstal pada iOS 15.0 dan lebih rendah. App Store memfilter aplikasi berdasarkan parameter ini — pengguna dengan versi yang tidak didukung tidak melihat aplikasi. Analog di Android — minSdkVersion.
Kedua parameter menetapkan versi OS minimum untuk instalasi aplikasi. iOS Deployment Target disimpan di Info.plist (MinimumOSVersion), minSdkVersion — di AndroidManifest.xml. iOS tidak memiliki analog untuk targetSdkVersion dan compileSdkVersion — semua perubahan perilaku diterapkan saat kompilasi dengan Base SDK baru. Di Android, perubahan perilaku dikendalikan melalui targetSdkVersion. Pemeriksaan dalam kode: @available di Swift vs Build.VERSION.SDK_INT di Android.
Direkomendasikan iOS 16.0 untuk aplikasi massal (83% perangkat) dan iOS 17.0 untuk startup dan proyek SwiftUI Observation/SwiftData (35% perangkat). iOS 16.0 didukung di iPhone 8 dan lebih baru, termasuk SwiftUI Layout, NavigationStack, Live Activities. iOS 17.0 memberikan Observation, SwiftData, TipKit. Untuk pustaka dan SDK — iOS 15.0 untuk kompatibilitas maksimal.
Di Swift, gunakan #available(iOS 17.0, *) di dalam fungsi untuk eksekusi kode bersyarat atau @available(iOS 17.0, *) di tingkat kelas/metode untuk pemeriksaan deklaratif. Untuk versi yang tepat — ProcessInfo.processInfo.operatingSystemVersion, yang mengembalikan OperatingSystemVersion. Di Objective-C, gunakan @available(iOS 17.0, *) di dalam if. Tanpa pemeriksaan, memanggil API di atas Deployment Target menyebabkan crash runtime.
Menurunkan iOS Deployment Target dimungkinkan, tetapi memerlukan penggantian semua panggilan langsung API dari versi yang lebih tinggi dengan pemeriksaan #available dengan implementasi fallback. Xcode akan memperingatkan dengan peringatan kuning, tetapi tidak akan memberikan kesalahan. API tanpa fallback yang masuk akal (Live Activities, SwiftData) dinonaktifkan pada versi lama. Disarankan untuk memulai dengan Target 2 versi di bawah versi saat ini untuk menghindari migrasi yang rumit.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga