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 βασίζεται στον έλεγχο της έκδοσης OS κατά την εγκατάσταση. Το iOS App Store συγκρίνει την τιμή Deployment Target από το Info.plist (κλειδί MinimumOSVersion) με την έκδοση OS στη συσκευή του χρήστη. Εάν η έκδοση της συσκευής είναι χαμηλότερη — το κουμπί "Λήψη" μπλοκάρεται και το 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 για προγραμματιστές. Νέοι modifier SwiftUI, μέθοδοι UIKit, πλαίσια όπως SwiftData και Observation είναι διαθέσιμα μόνο σε συγκεκριμένο Deployment Target. Ο προγραμματιστής πρέπει να ισορροπήσει μεταξύ κάλυψης κοινού και διαθεσιμότητας σύγχρονων εργαλείων.
Το iOS Deployment Target και το minSdkVersion του Android εκτελούν την ίδια λειτουργία — ορίζουν την ελάχιστη έκδοση OS για μια εφαρμογή. Ωστόσο, οι μηχανισμοί υλοποίησης και τα συνοδευτικά εργαλεία διαφέρουν. Η κατανόηση αυτών των διαφορών είναι χρήσιμη για προγραμματιστές που εργάζονται και στις δύο πλατφόρμες και βοηθά στην αποφυγή σύγχυσης κατά τη μετάβαση μεταξύ οικοσυστημάτων.
Στο 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) και την έκδοση OS στη συσκευή.
| Παράμετρος | 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 και target επεκτάσεων Widget/Extension. Εάν οι τιμές διαφέρουν μεταξύ της κύριας εφαρμογής και των επεκτάσεων, το App Store χρησιμοποιεί τη μέγιστη από όλες — δηλαδή η επέκταση δεν μπορεί να έχει χαμηλότερο Target από την κύρια εφαρμογή.
Ανοίξτε το έργο Xcode → επιλέξτε Target → καρτέλα General → ενότητα Minimum iOS Deployment. Η αναπτυσσόμενη λίστα εμφανίζει όλες τις διαθέσιμες εκδόσεις iOS SDK που είναι εγκατεστημένες στο Xcode. Η αλλαγή εφαρμόζεται σε όλα τα σχήματα build. Εναλλακτικά — καρτέλα 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
endΤο post_install hook στο Podfile επιβάλλει το Deployment Target 16.0 για όλες τις βιβλιοθήκες pod. Αυτό είναι χρήσιμο όταν ένα από τα pod καθορίζει υψηλότερο Target από ό,τι απαιτείται για τη λειτουργικότητά του. Χρησιμοποιήστε το μόνο εάν είστε βέβαιοι ότι το pod δεν χρησιμοποιεί API από υψηλότερη έκδοση iOS.
@available και #available — οδηγίες Swift και Objective-C για ασφαλή κλήση API που είναι διαθέσιμα μόνο σε συγκεκριμένες εκδόσεις OS. Εάν το Deployment Target του έργου είναι iOS 16.0 και μια μέθοδος απαιτεί iOS 17.0, η άμεση κλήση θα προκαλέσει crash σε runtime σε συσκευές με iOS 16.0-16.x. Οι έλεγχοι διαθεσιμότητας — υποχρεωτικό εργαλείο για υποστήριξη πολλαπλών εκδόσεων iOS.
Η οδηγία @available εφαρμόζεται σε κλάσεις, μεθόδους ή ολόκληρα αρχεία. Εάν το @available(iOS 17.0, *) έχει καθοριστεί πριν από μια κλάση, ολόκληρη η κλάση είναι διαθέσιμη μόνο σε iOS 17.0+. Η προσπάθεια κλήσης της κλάσης σε iOS 16.0 θα οδηγήσει σε σφάλμα runtime. Χρησιμοποιήστε το @available για απομόνωση ολόκληρων μονάδων λειτουργικότητας που είναι συγκεκριμένες για μια έκδοση OS. Για μεθόδους εντός της κλάσης, το @available επιτρέπει την απόκρυψη μεμονωμένων λειτουργιών.
Η οδηγία #available (if #available) ελέγχει την έκδοση OS σε 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 ελέγχει την ακριβή έκδοση OS. Το @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%. Για μαζική εφαρμογή (κοινωνικά δίκτυα, messengers, 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% | Οι εταιρικές συσκευές ενημερώνονται αργά |
| Startup / 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 που επιλέγει υλοποίηση ανάλογα με την έκδοση OS. Αυτή η αρχιτεκτονική επιτρέπει τη διατήρηση δύο 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.
Και οι δύο παράμετροι ορίζουν την ελάχιστη έκδοση OS για εγκατάσταση εφαρμογής. Το 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 για startups και έργα 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 οδηγεί σε crash runtime.
Η μείωση iOS Deployment Target είναι δυνατή, αλλά απαιτεί αντικατάσταση όλων των άμεσων κλήσεων API από υψηλότερες εκδόσεις με ελέγχους #available με υλοποιήσεις fallback. Το Xcode θα προειδοποιήσει με κίτρινες προειδοποιήσεις, αλλά δεν θα δώσει σφάλμα. API χωρίς λογικό fallback (Live Activities, SwiftData) απενεργοποιούνται σε παλιές εκδόσεις. Συνιστάται να ξεκινήσετε με Target 2 εκδόσεις κάτω από την τρέχουσα για να αποφύγετε περίπλοκη μετεγκατάσταση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης