Οι μεταβλητές περιβάλλοντος είναι δυναμικές τιμές που μεταβιβάζονται στην εφαρμογή κατά την εκκίνηση για τη διαμόρφωση της συμπεριφοράς χωρίς αλλαγή του κώδικα. Επιτρέπουν τον διαχωρισμό των ρυθμίσεων ανάπτυξης, δοκιμών και παραγωγής. Σύμφωνα με Twelve-Factor App, 2025, οι ρυθμίσεις πρέπει να αποθηκεύονται σε μεταβλητές περιβάλλοντος και όχι στον κώδικα. Οι μεταβλητές περιβάλλοντος εξασφαλίζουν την ασφαλή διαχείριση των API κλειδιών, του URL του backend και των σημαιών λειτουργικότητας.
Βασικά σημεία
Οι μεταβλητές περιβάλλοντος είναι ένα ζεύγος κλειδιού-τιμής, διαθέσιμο στη διεργασία της εφαρμογής μέσω του API του λειτουργικού συστήματος. Μεταβιβάζονται στη διεργασία κατά τη δημιουργία της και υπάρχουν μόνο κατά τη διάρκεια της εκτέλεσής της. Σε αντίθεση με τις παραμέτρους ρυθμίσεων που είναι ενσωματωμένες στον πηγαίο κώδικα, οι μεταβλητές περιβάλλοντος δεν απαιτούν εκ νέου μεταγλώττιση για την αλλαγή των τιμών. Αυτή είναι μια θεμελιώδης αρχή του Twelve-Factor App, η οποία εξασφαλίζει σαφή διαχωρισμό μεταξύ κώδικα και ρυθμίσεων.
Στην ανάπτυξη εφαρμογών για κινητά, οι μεταβλητές περιβάλλοντος επιλύουν το πρόβλημα των διαφορετικών ρυθμίσεων για τα περιβάλλοντα: ο προγραμματιστής χρησιμοποιεί τον τοπικό διακομιστή, ο δοκιμαστής το staging, οι χρήστες το production. Αντί να αποθηκεύονται τρία URL backend στον κώδικα με υπό συνθήκη εντολές if-else, ο προγραμματιστής μεταβιβάζει ένα URL μέσω μεταβλητής περιβάλλοντος στο στάδιο κατασκευής. Αυτό απλοποιεί τον κώδικα και αποκλείει τον κίνδυνο τυχαίας χρήσης του διακομιστή παραγωγής στο περιβάλλον δοκιμών.
Το κύριο πλεονέκτημα είναι η ασφάλεια: τα ευαίσθητα δεδομένα δεν καταλήγουν στο αποθετήριο κώδικα. Τα API κλειδιά, τα μυστικά του Firebase, τα token πρόσβασης στο backend και τα πιστοποιητικά φορτώνονται μέσω CI/CD απευθείας στο περιβάλλον κατασκευής. Αν ένας εισβολέας αποκτήσει πρόσβαση στο αποθετήριο κώδικα, δεν θα βρει μυστικά εκεί, καθώς αυτά αποθηκεύονται σε προστατευμένες αποθήκες του συστήματος CI και μεταβιβάζονται μόνο στο στάδιο κατασκευής του δυαδικού αρχείου.
Τα έργα για κινητά έχουν τουλάχιστον τρία περιβάλλοντα: development, staging και production. Κάθε περιβάλλον απαιτεί το δικό του σύνολο ρυθμίσεων: URL διακομιστή, όνομα πακέτου, σχήμα υπογραφής και πιστοποιητικά push ειδοποιήσεων. Χωρίς μεταβλητές περιβάλλοντος, ο προγραμματιστής πρέπει να αλλάζει χειροκίνητα τη ρύθμιση πριν από κάθε κατασκευή, κάτι που οδηγεί σε σφάλματα: ένα ξεχασμένο κλειδί παραγωγής σε μια δοκιμαστική κατασκευή μπορεί να προκαλέσει την αποστολή ειδοποιήσεων σε πραγματικούς χρήστες ή την κατανάλωση πληρωμένου API.
Οι μεταβλητές περιβάλλοντος επιτρέπουν την εναλλαγή του backend χωρίς αλλαγή κώδικα: αρκεί να αντικατασταθεί η τιμή στη μεταβλητή API_BASE_URL. Οι σημαίες λειτουργικότητας (feature flags) διαχειρίζονται μέσω μεταβλητών τύπου FEATURE_CHAT_ENABLED=true, επιτρέποντας την ενεργοποίηση νέων δυνατοτήτων στο staging χωρίς να επηρεάζεται το production. Για κάθε περιβάλλον δημιουργείται ένα δικό του αρχείο .env, το οποίο φορτώνεται στο στάδιο κατασκευής.
class AppConfig {
static final String apiBaseUrl =
const String.fromEnvironment('API_BASE_URL',
defaultValue: 'http://localhost:8080');
}
Τα σκληρά κωδικοποιημένα κλειδιά είναι μια συνηθισμένη ευπάθεια των εφαρμογών για κινητά. Ένας εισβολέας αποσυμπιέζει το APK ή το IPA με εργαλεία όπως το jadx ή το Hopper και εξάγει τα μυστικά από το δυαδικό αρχείο. Ακόμα και η συσκότιση δεν προστατεύει τα string literals — βρίσκονται εύκολα στον κώδικα μετά την αποσυμπίεση. Οι μεταβλητές περιβάλλοντος λύνουν αυτό το πρόβλημα μεταβιβάζοντας τα κλειδιά στο στάδιο κατασκευής μέσω CI/CD, όπου καλύπτονται στα αρχεία καταγραφής.
object Config {
val apiKey: String =
System.getenv("API_KEY") ?: throw
IllegalStateException("API_KEY not set")
}
Οι μεταβλητές περιβάλλοντος ενσωματώνονται στα pipelines κατασκευής: τα GitHub Actions, GitLab CI, Bitrise και CircleCI υποστηρίζουν μυστικές μεταβλητές που δεν εμφανίζονται στα αρχεία καταγραφής. Στο στάδιο κατασκευής, το CI αντικαθιστά τις κατάλληλες τιμές ανάλογα με τον κλάδο ή την ετικέτα: για τον κλάδο develop χρησιμοποιείται το staging, για την ετικέτα v* — το production. Αυτό αυτοματοποιεί τη διαδικασία και αποκλείει τον ανθρώπινο παράγοντα, διασφαλίζοντας ότι κάθε κατασκευή λαμβάνει το σωστό σύνολο ρυθμίσεων.
Το αρχείο .env είναι ο τυπικός τρόπος αποθήκευσης μεταβλητών περιβάλλοντος σε μορφή KEY=VALUE. Δεν περιλαμβάνεται στο αποθετήριο, αντίθετα στο αποθετήριο προστίθεται το .env.example με το πρότυπο όλων των μεταβλητών και κενές τιμές. Κάθε προγραμματιστής δημιουργεί το δικό του αρχείο .env με τοπικές ρυθμίσεις, χωρίς να επηρεάζει τη διαμόρφωση των άλλων μελών της ομάδας. Για διαφορετικά περιβάλλοντα χρησιμοποιούνται ξεχωριστά αρχεία: .env.dev, .env.stage, .env.prod.
# .env.example — πρότυπο για προγραμματιστές
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=
Για έργα για κινητά υπάρχουν εξειδικευμένες βιβλιοθήκες για την εργασία με αρχεία .env:
Οι ρυθμίσεις διακλάδωσης στο CI/CD επιτρέπουν την αντικατάσταση διαφορετικών αρχείων .env: .env.dev για διακομιστές δοκιμών, .env.stage για την προ-κυκλοφορία και .env.prod για τη δημοσίευση στα καταστήματα εφαρμογών. Τα αρχεία με μυστικά φορτώνονται από ασφαλή αποθήκη (Vault, AWS Secrets Manager) και δεν αποθηκεύονται στο αποθετήριο. Αυτό διασφαλίζει ότι ακόμα και σε περίπτωση παραβίασης του συστήματος ελέγχου εκδόσεων, τα μυστικά παραμένουν προστατευμένα.
Το οικοσύστημα iOS χρησιμοποιεί αρχεία xcconfig για τη διαχείριση μεταβλητών σε επίπεδο κατασκευής. Συνδέονται με τα σχήματα του Xcode και επιτρέπουν την αντικατάσταση τιμών για τις διαμορφώσεις Debug και Release. Τα αρχεία xcconfig υποστηρίζουν κληρονομικότητα: μπορείτε να δημιουργήσετε ένα βασικό αρχείο με κοινές ρυθμίσεις και ειδικά αρχεία για κάθε περιβάλλον.
Τα αρχεία xcconfig αποθηκεύουν μεταβλητές σε μορφή KEY = VALUE και συνδέονται με το σχήμα κατασκευής στο Xcode μέσω των ρυθμίσεων Configuration. Οι μεταβλητές από το xcconfig είναι διαθέσιμες στο Info.plist μέσω της σύνταξης $(VARIABLE_NAME), επιτρέποντας τη χρήση διαφορετικών αναγνωριστικών bundle και ονομάτων εφαρμογής για διαφορετικά σχήματα. Για ταχύτερη αναγνώριση του περιβάλλοντος, στο όνομα της εφαρμογής προστίθεται το επίθημα Dev ή Staging.
# Config/Dev.xcconfig — διαμόρφωση ανάπτυξης
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev
Για πρόσβαση στις μεταβλητές στο runtime στο iOS χρησιμοποιείται το αρχείο Configuration.swift, το οποίο διαβάζει τιμές από το Info.plist μέσω του Bundle.main.object(forInfoDictionaryKey:). Αυτή η προσέγγιση διασφαλίζει ότι οι μεταβλητές ορίζονται στο στάδιο κατασκευής και είναι διαθέσιμες στην εφαρμογή αμέσως μετά την εκκίνηση. Οι τιμές διαβάζονται μία φορά κατά την αρχικοποίηση της μονάδας και αποθηκεύονται σε κρυφή μνήμη για γρήγορη πρόσβαση κατά τη διάρκεια του κύκλου ζωής της εφαρμογής.
enum AppEnvironment {
static var apiBaseURL: URL {
guard let urlString = Bundle.main
.object(forInfoDictionaryKey: "API_BASE_URL"),
let url = URL(string: urlString as! String)
else { fatalError("API_BASE_URL is not configured") }
return url
}
static var isChatEnabled: Bool {
Bundle.main.object(
forInfoDictionaryKey: "FEATURE_CHAT_ENABLED"
) as? Bool ?? false
}
}
Το Android υποστηρίζει μεταβλητές περιβάλλοντος μέσω του BuildConfig — μιας αυτόματα δημιουργούμενης κλάσης, τα πεδία της οποίας ορίζονται στο αρχείο build.gradle της μονάδας. Το BuildConfig δημιουργείται στο στάδιο μεταγλώττισης για κάθε flavor και τύπο κατασκευής ξεχωριστά. Αυτό επιτρέπει να έχουμε διαφορετικές τιμές για debug και release χωρίς τη χρήση υπό συνθήκη εντολών στον κώδικα, αυξάνοντας την απόδοση και την ασφάλεια.
Τα πεδία BuildConfig ορίζονται μέσω του buildConfigField στο defaultConfig ή σε συγκεκριμένα buildTypes. Για κάθε περιβάλλον δημιουργείται ξεχωριστό buildType ή productFlavor. Αυτό εξασφαλίζει αυστηρή απομόνωση των ρυθμίσεων: το debug χρησιμοποιεί τον τοπικό διακομιστή, το release — το production. Τα πεδία BuildConfig είναι στατικά τυποποιημένα, γεγονός που αποκλείει σφάλματα κατά την πρόσβαση σε αυτά στον κώδικα.
// build.gradle (Module: app)
android {
defaultConfig {
buildConfigField "String", "API_BASE_URL",
"\"http://localhost:8080\""
}
buildTypes {
debug {
buildConfigField "String", "API_BASE_URL",
"\"http://dev.api.itsectr.com\""
}
release {
buildConfigField "String", "API_BASE_URL",
"\"https://api.itsectr.com\""
}
}
}
Το αρχείο gradle.properties στη ρίζα του έργου αποθηκεύει καθολικές μεταβλητές του Gradle. Είναι διαθέσιμες σε όλες τις μονάδες μέσω της σύνταξης $variableName και χρησιμοποιούνται για τον καθορισμό εκδόσεων εξαρτήσεων, σημαιών κατασκευής και API κλειδιών. Σε αντίθεση με το BuildConfig, το gradle.properties λειτουργεί μόνο στο στάδιο διαμόρφωσης του Gradle και όχι στο runtime της εφαρμογής. Γι' αυτό οι κωδικοί πρόσβασης και τα API κλειδιά που αναγράφονται στο gradle.properties δεν είναι ορατά στον αποσυμπιεσμένο κώδικα, καθώς χρησιμοποιούνται μόνο για τη δημιουργία του BuildConfig στο στάδιο μεταγλώττισης.
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...
Για την ασφαλή μεταβίβαση μυστικών σε έργα Android συνιστάται η χρήση του local.properties (εξαιρείται από το VCS) ή η φόρτωση τιμών από μεταβλητές CI/CD στο build.gradle μέσω του System.getenv(). Αυτό διασφαλίζει ότι τα κλειδιά δεν θα καταλήξουν στο αποθετήριο. Κατά τη δημοσίευση στο Google Play Console βεβαιωθείτε ότι όλα τα κλειδιά εντοπισμού σφαλμάτων έχουν αντικατασταθεί με εκδόσεις παραγωγής μέσω διαφορετικών buildTypes ή productFlavors με τις αντίστοιχες τιμές BuildConfig.
Συχνές ερωτήσεις
Ναι, το Flutter υποστηρίζει μεταβλητές περιβάλλοντος μέσω του πακέτου flutter_dotenv για πρόσβαση στο runtime ή μέσω native καναλιών για μεταβλητές πλατφόρμας. Στο Dart είναι επίσης διαθέσιμος ο κατασκευαστής String.fromEnvironment για τη μεταβίβαση τιμών στο στάδιο μεταγλώττισης μέσω του --dart-define, που είναι ο προτιμώμενος τρόπος για έργα Flutter.
Το BuildConfig είναι μια κλάση Java με τυποποιημένα πεδία, που δημιουργείται στο στάδιο μεταγλώττισης για κάθε buildType και flavor. Το gradle.properties είναι ένα αρχείο κειμένου με ζεύγη κλειδιού-τιμής, διαθέσιμο σε όλες τις μονάδες του Gradle στο στάδιο διαμόρφωσης της κατασκευής. Το BuildConfig λειτουργεί στο runtime της εφαρμογής, ενώ το gradle.properties — μόνο στα scripts του Gradle.
Προσθέστε το .env στο αρχείο .gitignore του αποθετηρίου σας. Στο αποθετήριο κάντε commit μόνο το .env.example με κενές τιμές και περιγραφή κάθε μεταβλητής. Για το CI/CD χρησιμοποιήστε κρυπτογραφημένα μυστικά στις ρυθμίσεις των GitHub Actions, GitLab CI ή Bitrise, τα οποία καλύπτονται στα αρχεία καταγραφής και δεν είναι προσβάσιμα για ανάγνωση μετά την ολοκλήρωση της κατασκευής.
Τα περισσότερα συστήματα CI υποστηρίζουν μυστικές μεταβλητές περιβάλλοντος. Στο GitHub Actions είναι τα Secrets, στο GitLab CI — οι CI/CD Variables, στο Bitrise — τα Secrets. Στο στάδιο κατασκευής μεταβιβάζονται στο script κατασκευής μέσω του process.env ή του System.getenv(). Οι μυστικές μεταβλητές δεν εμφανίζονται στα αρχεία καταγραφής της κατασκευής και δεν είναι διαθέσιμες σε forks του αποθετηρίου.
Τα feature flags είναι δυαδικές μεταβλητές που ελέγχουν την ενεργοποίηση ή απενεργοποίηση λειτουργιών χωρίς εκ νέου μεταγλώττιση του κώδικα. Παράδειγμα: το FEATURE_NEW_PAYMENT=true ενεργοποιεί το νέο σύστημα πληρωμών στο staging για δοκιμές. Στο production το ίδιο flag έχει οριστεί σε false μέχρι την πλήρη ανάπτυξη του backend. Αυτό επιτρέπει την ασφαλή σταδιακή εφαρμογή αλλαγών και την ανάκλησή τους σε περίπτωση προβλημάτων.
Συμπεράσματα
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης