Το Scheme στο Xcode είναι μια διαμόρφωση που καθορίζει πώς θα δημιουργηθεί, δοκιμαστεί, προφιλαριστεί και αρχειοθετηθεί η εφαρμογή για iOS, macOS, watchOS ή tvOS. Κάθε Scheme περιέχει ένα σύνολο ενεργειών (Build, Run, Test, Profile, Analyze, Archive) με δικές του παραμέτρους, ορίσματα και μεταβλητές περιβάλλοντος. Σύμφωνα με το Apple Developer Documentation, 2025, το Scheme είναι το κύριο εργαλείο διαχείρισης των διαμορφώσεων μεταγλώττισης στο Xcode, αντικαθιστώντας τη χειροκίνητη εναλλαγή παραμέτρων. Το Xcode δημιουργεί αυτόματα ένα σχήμα για κάθε target στο πρώτο άνοιγμα του έργου.
Βασικά σημεία
Το Scheme στο Xcode είναι ένα αρχείο XML (με επέκταση .xcscheme) που περιγράφει την ακολουθία ενεργειών και τις παραμέτρους τους για τη δημιουργία και την ανάλυση της εφαρμογής. Κάθε Scheme συνδέεται με ένα ή περισσότερα target και καθορίζει με ποια διαμόρφωση (Debug, Release, AdHoc) θα εκτελεστεί κάθε ενέργεια. Το Scheme είναι το αντίστοιχο του Build Variant στο Android, αλλά με πιο ευέλικτη δομή: ένα σχήμα μπορεί να περιέχει διαφορετικά target για διαφορετικές ενέργειες.
Το Xcode δημιουργεί αυτόματα ένα σχήμα για κάθε target στο πρώτο άνοιγμα του έργου. Το προεπιλεγμένο όνομα του σχήματος συμπίπτει με το όνομα του target. Αν το έργο έχει target δοκιμών, το Xcode το προσθέτει αυτόματα στην ενέργεια Test του σχήματος του κύριου target. Για έργα με πολλά target (κύρια εφαρμογή + watchOS + extension) το Xcode δημιουργεί ξεχωριστό σχήμα για το καθένα, αλλά μπορεί να δημιουργηθεί ένα ενιαίο σχήμα που χτίζει όλα τα target ταυτόχρονα.
Τα σχήματα αποθηκεύονται στον κατάλογο xcshareddata/xcschemes/ (για shared) ή xcuserdata/<user>/xcschemes/ (για private). Τα shared σχήματα περνούν στο Git και χρησιμοποιούνται από όλη την ομάδα. Τα private σχήματα αποθηκεύονται τοπικά και δεν συγχρονίζονται. Το αρχείο .xcscheme έχει μορφή XML με ριζικό στοιχείο το <Scheme>. Στο εσωτερικό υπάρχουν μπλοκ για κάθε ενέργεια: BuildAction, TestAction, LaunchAction, ProfileAction, AnalyzeAction, ArchiveAction.
Το .xcscheme είναι ένα αρχείο XML που μπορεί να επεξεργαστεί χειροκίνητα ή μέσω του Xcode. Κύρια στοιχεία: <BuildAction> (λίστα των target που θα χτιστούν), <TestAction> (αναφορές στα target δοκιμών), <LaunchAction> (διαμόρφωση εκκίνησης), <ProfileAction>, <AnalyzeAction>, <ArchiveAction>. Κάθε μπλοκ περιέχει το χαρακτηριστικό buildConfiguration, το οποίο καθορίζει ποια διαμόρφωση (Debug/Release) θα χρησιμοποιηθεί για αυτή την ενέργεια.
Το Scheme αποτελείται από έξι ενέργειες, καθεμία από τις οποίες μπορεί να ρυθμιστεί ανεξάρτητα. Η Build Action καθορίζει ποια target χτίζονται και με ποια σειρά. Η Run Action — πώς εκκινείται η εφαρμογή: με ποια ορίσματα, μεταβλητές περιβάλλοντος και διαμόρφωση. Η Test Action — ποια tests εκτελούνται και ποιες επιλογές code coverage είναι ενεργοποιημένες. Η Profile Action — εκκίνηση με τα εργαλεία Instruments για προφιλάρισμα. Η Analyze Action — στατική ανάλυση κώδικα με το Clang Static Analyzer. Η Archive Action — δημιουργία για δημοσίευση στο App Store ή διανομή AdHoc.
Για κάθε ενέργεια μπορεί να οριστεί ξεχωριστή build configuration. Συνήθως για Run και Test χρησιμοποιείται Debug, για Archive — Release. Η build configuration καθορίζει το σύνολο των σημαιών μεταγλωττιστή, τις βελτιστοποιήσεις και τις πληροφορίες εντοπισμού σφαλμάτων. Το Xcode παρέχει δύο τυπικές διαμορφώσεις: Debug (χωρίς βελτιστοποιήσεις, με σύμβολα εντοπισμού) και Release (με βελτιστοποιήσεις, χωρίς πληροφορίες εντοπισμού). Ο προγραμματιστής μπορεί να προσθέσει προσαρμοσμένες διαμορφώσεις μέσω του project.xcconfig.
Η ενέργεια Archive είναι ιδιαίτερα σημαντική — δημιουργεί ένα .xcarchive, το οποίο στη συνέχεια εξάγεται σε .ipa για το App Store ή AdHoc. Η Archive Action χρησιμοποιεί από προεπιλογή τη διαμόρφωση Release, αλλά μπορεί να αλλάξει σε AdHoc ή Distribution. Στην Archive Action είναι διαθέσιμη και η σημαία revealArchiveInOrganizer — μετά την ολοκλήρωση της αρχειοθέτησης το Xcode ανοίγει το Organiser για περαιτέρω ενέργειες με το αρχείο.
<!-- Παράδειγμα .xcscheme για εφαρμογή iOS -->
<Scheme
LastUpgradeVersion = "1500"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ABCD1234"
BuildableName = "MyApp.app"
BlueprintName = "MyApp"
ReferencedContainer = "container:MyApp.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
enableAddressSanitizer = "YES">
</LaunchAction>
</Scheme>
Η δημιουργία ενός νέου σχήματος γίνεται μέσω του μενού του Xcode: Product → Scheme → New Scheme ή με το κουμπί “+” στον πίνακα Scheme (δίπλα στο κουμπί Run). Κατά τη δημιουργία επιλέγεται το target για το οποίο δημιουργείται το σχήμα. Αν το σχήμα έχει επιλεγεί ως “duplicate”, το Xcode αντιγράφει αυτόματα τις ρυθμίσεις από το υπάρχον σχήμα. Τα νέα σχήματα αποθηκεύονται από προεπιλογή ως private — για δημοσίευση στην ομάδα πρέπει να ενεργοποιηθεί το Shared στο Manage Schemes.
Το παράθυρο Edit Scheme (Product → Scheme → Edit Scheme) περιέχει έξι καρτέλες όσες και οι ενέργειες. Σε κάθε καρτέλα μπορούν να αλλάξουν η build configuration, τα ορίσματα εκκίνησης, οι μεταβλητές περιβάλλοντος και οι διαγνωστικές σημαίες. Στην καρτέλα Run είναι διαθέσιμες οι επιλογές: executable (ποιο δυαδικό θα εκκινηθεί), wait for executable to be launched (για τον εντοπισμό σφαλμάτων εκκινηθέντων διεργασιών), debugger (LLDB ή None), launch arguments, environment variables και οι προηγμένες επιλογές (Address Sanitizer, Thread Sanitizer, Main Thread Checker, Memory Management).
Για διάγνωση: Address Sanitizer (ASan) — ανιχνεύει έξοδο πέρα από τα όρια του πίνακα, use-after-free και άλλα σφάλματα μνήμης σε κώδικα C/C++/ObjC. Thread Sanitizer (TSan) — ανιχνεύει συνθήκες ανταγωνισμού (data races) σε πολυνηματικό κώδικα. Undefined Behavior Sanitizer (UBSan) — αποκαλύπτει μη καθορισμένη συμπεριφορά, όπως υπερχείλιση ενός signed int. Αυτές οι επιλογές είναι διαθέσιμες στο Edit Scheme → Run → Diagnostics και λειτουργούν μόνο για builds Debug. Η ενεργοποίηση όλων των sanitizer μπορεί να επιβραδύνει την εκκίνηση 2-3 φορές, γι' αυτό συνιστάται επιλεκτική ενεργοποίηση.
Τυπική πρακτική — δημιουργία ξεχωριστών σχημάτων για κάθε περιβάλλον: Dev, Staging, Production. Κάθε σχήμα χρησιμοποιεί την ίδια Build Configuration (Debug για Dev, Release για Production), αλλά διαφορετικά ορίσματα εκκίνησης: -FIRAnalyticsDebugEnabled, -com.apple.CoreData.SQLDebug 1 για Dev και την απουσία τους για Production. Τα ορίσματα εκκίνησης μεταβιβάζονται στο UserDefaults (ProcessInfo.processInfo.arguments) και είναι διαθέσιμα για ανάγνωση κατά την εκκίνηση της εφαρμογής. Αυτό επιτρέπει την εναλλαγή του URL διακομιστή, του επιπέδου καταγραφής και των λειτουργιών χωρίς αλλαγή κώδικα.
Τα shared σχήματα αποθηκεύονται στο <project>.xcworkspace/xcshareddata/xcschemes/ ή στο <project>.xcodeproj/xcshareddata/xcschemes/ και περνούν στο αποθετήριο Git. Όλοι οι προγραμματιστές της ομάδας βλέπουν αυτά τα σχήματα στο Xcode. Τα shared σχήματα είναι ο μόνος τρόπος διάδοσης των σχημάτων στην ομάδα. Αν ένας προγραμματιστής δημιούργησε ένα σημαντικό σχήμα (π.χ. “Staging Archive”) αλλά δεν το σημείωσε ως Shared, η υπόλοιπη ομάδα δεν θα το δει, γεγονός που οδηγεί σε σύγχυση: ο καθένας θα δημιουργεί το δικό του σχήμα με τις δικές του ρυθμίσεις.
Τα private σχήματα αποθηκεύονται στο xcuserdata/<user>/xcschemes/ και δεν περνούν στο Git. Είναι χρήσιμα για προσωπικές διαμορφώσεις: π.χ. ένα σχήμα με όλα τα sanitizer ενεργοποιημένα για έναν συγκεκριμένο προγραμματιστή. Τα private σχήματα δεν πρέπει να περιέχουν κρίσιμες ρυθμίσεις από τις οποίες εξαρτάται το χτίσιμο του έργου — αν ο προγραμματιστής φύγει από το έργο, τα private σχήματά του θα χαθούν. Σύσταση: όλα τα σχήματα που χρησιμοποιούνται στο CI/CD και από τουλάχιστον δύο προγραμματιστές πρέπει να γίνουν Shared.
Η διαχείριση των σχημάτων γίνεται μέσω του Manage Schemes (Product → Scheme → Manage Schemes). Στο παράθυρο εμφανίζονται όλα τα σχήματα του έργου, η κατάστασή τους (Shared/Private) και τα κουμπιά +/— για προσθήκη/διαγραφή. Το πλαίσιο ελέγχου Shared αλλάζει την ορατότητα του σχήματος για την ομάδα. Σε σύγκρουση Git (αλλαγές στο .xcscheme από δύο προγραμματιστές) πρέπει να επιλυθεί προσεκτικά η συγχώνευση — τα αρχεία XML μπορεί να περιέχουν διαφορετικά αναγνωριστικά target. Συνιστάται να προστεθεί το .xcscheme στα αρχεία που κλειδώνονται κατά τη συγχώνευση (git lfs ή .gitattributes).
Τα Arguments στο Scheme είναι οι συμβολοσειρές που μεταβιβάζονται στην εφαρμογή κατά την εκκίνηση (ProcessInfo.processInfo.arguments) και οι μεταβλητές περιβάλλοντος (ProcessInfo.processInfo.environment). Τα ορίσματα χρησιμοποιούνται για σημαίες: -AppleLanguages (ru), -AppleLocale ru_RU για προσομοίωση ρωσικής τοπικής ρύθμισης ή -FIRDebugEnabled για ενεργοποίηση εντοπισμού Firebase. Οι μεταβλητές περιβάλλοντος εφαρμόζονται για διαμόρφωση: API_BASE_URL=http://localhost:3000, LOG_LEVEL=debug.
Για τη διαχείριση λειτουργιών (feature flags) σε διαφορετικά περιβάλλοντα χρησιμοποιείται ο συνδυασμός Arguments + Build Configuration. Στο σχήμα Dev ορίζεται το όρισμα -FeatureFlagNewOnboarding YES, ενώ στο Production — -FeatureFlagNewOnboarding NO (ή το όρισμα λείπει). Στον κώδικα, ο έλεγχος: UserDefaults.standard.bool(forKey: “FeatureFlagNewOnboarding”). Αυτή η προσέγγιση επιτρέπει τη σταδιακή ενεργοποίηση λειτουργιών στο staging χωρίς αλλαγή κώδικα και χωρίς commit των τιμών production.
Σημαντικό: τα ορίσματα και οι μεταβλητές περιβάλλοντος του Scheme παρακάμπτουν τις τιμές από το Info.plist. Αν στο Info.plist έχει οριστεί API_URL, και στο Scheme — API_URL=http://localhost για Run Action, κατά την εκκίνηση από το Xcode θα χρησιμοποιηθεί η τιμή από το Scheme. Κατά την εκκίνηση από τη συσκευή (όχι από το Xcode) — η τιμή από το Info.plist. Αυτό είναι βολικό για τοπική ανάπτυξη, αλλά πρέπει να θυμάστε ότι οι μεταβλητές Scheme δεν μπαίνουν στο build — δρουν μόνο κατά την εκκίνηση μέσω Xcode.
import Foundation
struct AppEnvironment {
var apiBaseURL: String {
ProcessInfo.processInfo.environment["API_BASE_URL"]
?? Bundle.main.object(forInfoDictionaryKey: "API_BASE_URL") as? String
?? "https://api.production.com"
}
var isDebugMode: Bool {
ProcessInfo.processInfo.arguments.contains("-DebugModeEnabled")
}
var isNewOnboardingEnabled: Bool {
UserDefaults.standard.bool(forKey: "FeatureFlagNewOnboarding")
}
}
// Χρήση κατά την εκκίνηση
let env = AppEnvironment()
NetworkConfig.shared.configure(baseURL: env.apiBaseURL)
Στο CI/CD (GitHub Actions, Jenkins, GitLab CI) το Scheme χρησιμοποιείται ως κύριο όρισμα της εντολής xcodebuild. Παράδειγμα: xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -configuration Release -sdk iphoneos archive. Η σημαία -scheme υποδεικνύει ποιο σχήμα να χρησιμοποιηθεί. Το xcodebuild διαβάζει όλες τις ρυθμίσεις από το αρχείο .xcscheme, συμπεριλαμβανομένης της build configuration, των target και της σειράς χτισίματος. Αυτό διασφαλίζει ότι το CI/CD χτίζει την εφαρμογή με τις ίδιες παραμέτρους με το τοπικό IDE.
Για το CI/CD είναι κρίσιμα τα shared σχήματα. Αν ένα σχήμα δεν είναι Shared, το xcodebuild δεν θα το βρει στο αποθετήριο και το build θα αποτύχει με σφάλμα “Scheme not found”. Κανόνας: πριν τη διαμόρφωση του CI/CD βεβαιωθείτε ότι όλα τα χρησιμοποιούμενα σχήματα είναι σημειωμένα ως Shared. Δεύτερος κανόνας: στο CI/CD μην χρησιμοποιείτε το προεπιλεγμένο σχήμα (το Xcode επιλέγει αυτόματα το πρώτο σχήμα) — πάντα μεταβιβάζετε ρητά το όνομα του σχήματος μέσω της σημαίας -scheme.
Για παράλληλο χτίσιμο πολλών σχημάτων (π.χ. η εφαρμογή και η επέκταση watchOS) το xcodebuild μπορεί να εκτελείται διαδοχικά ή παράλληλα. Τα σύγχρονα συστήματα CI επιτρέπουν την παραλληλοποίηση του χτισίματος διαφορετικών σχημάτων μέσω μήτρας: το ένα job χτίζει την εφαρμογή iOS, το δεύτερο — την επέκταση watchOS. Αυτό μειώνει τον συνολικό χρόνο χτισίματος από 15 σε 8 λεπτά με δύο παράλληλους agents. Στο τέλος τα τεχνουργήματα ενοποιούνται σε ένα ενιαίο .xcarchive με το xcodebuild -exportArchive.
#!/bin/bash — δημιουργία CI/CD με xcodebuild
# 1. Εκκαθάριση και χτίσιμο
xcodebuild clean archive \
-workspace "MyApp.xcworkspace" \
-scheme "MyApp Production" \
-configuration Release \
-sdk iphoneos \
-archivePath "build/MyApp.xcarchive" \
CODE_SIGN_STYLE="Manual" \
PROVISIONING_PROFILE_SPECIFIER="match AppStore"
# 2. Εξαγωγή σε IPA
xcodebuild -exportArchive \
-archivePath "build/MyApp.xcarchive" \
-exportPath "build/ipa" \
-exportOptionsPlist "ExportOptions.plist"
Συχνές ερωτήσεις
Συνήθως αρκούν 2-3 σχήματα: Development (Debug), Staging (με ορίσματα για τον διακομιστή δοκιμών) και Production (Release). Για αρθρωτές βιβλιοθήκες — ένα σχήμα με ρυθμίσεις για δοκιμές. Μην πολλαπλασιάζετε τα σχήματα — κάθε νέο σχήμα απαιτεί συντήρηση.
Η Build Configuration (Debug/Release) — είναι το σύνολο σημαιών μεταγλωττιστή που ορίζονται στο .xcconfig. Το Scheme — είναι ένα σύνολο ενεργειών, καθεμία από τις οποίες αναφέρεται σε μια Build Configuration. Το σχήμα λέει “κατά την εκκίνηση χρησιμοποίησε Debug”, η διαμόρφωση ορίζει ότι “Debug σημαίνει χωρίς βελτιστοποιήσεις, με σύμβολα”.
Τα ορίσματα μπαίνουν στα ProcessInfo.processInfo.arguments και UserDefaults (αν το όρισμα αρχίζει με παύλα). Οι μεταβλητές περιβάλλοντος — στα ProcessInfo.processInfo.environment. Στον κώδικα: UserDefaults.standard.bool(forKey: “FeatureFlag”) για ορίσματα της μορφής -FeatureFlag YES.
Ναι, στην Build Action μπορούν να προστεθούν πολλά target. Για παράδειγμα, το σχήμα “App + Watch + Widget” θα χτίσει και τα τρία target διαδοχικά (αν parallelizeBuildables=NO) ή παράλληλα (YES). Για την αρχειοθέτηση της εφαρμογής αρκεί το κύριο target — τα υπόλοιπα χτίζονται ως εξαρτήσεις.
Το Swift Package Manager δεν αντικαθιστά τα σχήματα — το σχήμα εξακολουθεί να καθορίζει με ποια διαμόρφωση θα χτιστούν οι εξαρτήσεις SPM, ποια tests θα εκτελεστούν και πώς θα γίνει η αρχειοθέτηση. Τα πακέτα SPM μπορούν να έχουν τα δικά τους σχήματα, τα οποία εισάγονται αυτόματα στο έργο κατά την προσθήκη του πακέτου.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης