ماحولیاتی متغیرات: موبائل پروجیکٹس میں یہ کیا ہیں، استعمال اور ترتیب

مصنف: IT Sectr اشاعت: 2026-05-31 مطالعے کا وقت: 8 منٹ

ماحولیاتی متغیرات متحرک اقدار ہیں جو کوڈ کو تبدیل کیے بغیر رویے کی ترتیب دینے کے لیے ایپلیکیشن کو اسٹارٹ اپ پر منتقل کی جاتی ہیں۔ یہ ڈویلپمنٹ، ٹیسٹنگ اور پروڈکشن کنفیگریشنز کو الگ کرنے کی اجازت دیتے ہیں۔ Twelve-Factor App، 2025 کے مطابق، کنفیگریشن کو کوڈ میں نہیں بلکہ ماحولیاتی متغیرات میں محفوظ کیا جانا چاہیے۔ ماحولیاتی متغیرات API کیز، بیک اینڈ URL اور فیچر فلیگ کے محفوظ انتظام کو یقینی بناتے ہیں۔

اہم نکات

  • ماحولیاتی متغیرات مختلف رن ٹائم ماحول کے لیے ایپلیکیشن کنفیگریشن کو سورس کوڈ سے الگ کرتے ہیں
  • .env فائلیں KEY=VALUE فارمیٹ میں متغیرات محفوظ کرتی ہیں اور .gitignore کے ذریعے ریپوزٹری سے خارج کی جاتی ہیں
  • iOS کمپائل وقت پر متغیرات منتقل کرنے کے لیے xcconfig اور Build Settings استعمال کرتا ہے
  • Android کنفیگریشن فیلڈز بنانے کے لیے BuildConfig اور gradle.properties استعمال کرتا ہے
  • سیکیورٹی: کیز اور ٹوکن CI/CD کے ذریعے لوڈ کیے جانے چاہئیں، کوڈ یا ریپوزٹری میں محفوظ نہیں کیے جانے چاہئیں

ماحولیاتی متغیرات کیا ہیں

ماحولیاتی متغیرات کلید-قدر کے جوڑے ہوتے ہیں جو آپریٹنگ سسٹم API کے ذریعے ایپلیکیشن کے عمل کے لیے قابل رسائی ہوتے ہیں۔ یہ عمل بننے پر اسے منتقل کیے جاتے ہیں اور صرف اس کے چلنے کے دوران موجود رہتے ہیں۔ سورس کوڈ میں شامل کنفیگریشن پیرامیٹرز کے برعکس، ماحولیاتی متغیرات کو قدریں تبدیل کرنے کے لیے دوبارہ کمپائل کرنے کی ضرورت نہیں ہوتی۔ یہ Twelve-Factor App کا ایک بنیادی اصول ہے، جو کوڈ اور کنفیگریشن کے درمیان واضح علیحدگی کو یقینی بناتا ہے۔

موبائل ڈویلپمنٹ میں، ماحولیاتی متغیرات مختلف ماحول کے لیے مختلف کنفیگریشنز کا مسئلہ حل کرتے ہیں: ڈویلپر لوکل سرور استعمال کرتا ہے، ٹیسٹر اسٹیجنگ استعمال کرتا ہے، اور صارفین پروڈکشن استعمال کرتے ہیں۔ کوڈ میں if-else شرائط کے ساتھ تین بیک اینڈ URLs محفوظ کرنے کے بجائے، ڈویلپر بلڈ وقت پر ماحولیاتی متغیر کے ذریعے ایک URL منتقل کرتا ہے۔ یہ کوڈ کو آسان بناتا ہے اور ٹیسٹ ماحول میں غلطی سے پروڈکشن سرور استعمال کرنے کے خطرے کو ختم کرتا ہے۔

بنیادی فائدہ سیکیورٹی ہے: حساس ڈیٹا کوڈ ریپوزٹری میں نہیں جاتا۔ API کیز، Firebase راز، بیک اینڈ تک رسائی کے ٹوکن اور سرٹیفکیٹ CI/CD کے ذریعے براہ راست بلڈ ماحول میں لوڈ کیے جاتے ہیں۔ اگر حملہ آور کوڈ ریپوزٹری تک رسائی حاصل کر لے تو اسے وہاں راز نہیں ملیں گے، کیونکہ وہ CI سسٹم کے محفوظ ذخیروں میں محفوظ ہوتے ہیں اور صرف بائنری فائل بلڈ مرحلے پر منتقل کیے جاتے ہیں۔

موبائل ڈویلپمنٹ میں ماحولیاتی متغیرات کیوں ضروری ہیں

موبائل پروجیکٹس میں کم از کم تین ماحول ہوتے ہیں: ڈویلپمنٹ، اسٹیجنگ اور پروڈکشن۔ ہر ماحول کو کنفیگریشنز کے اپنے سیٹ کی ضرورت ہوتی ہے: سرور URL، پیکیج کا نام، دستخطی اسکیم اور پش نوٹیفکیشن سرٹیفکیٹ۔ ماحولیاتی متغیرات کے بغیر، ڈویلپر کو ہر بلڈ سے پہلے دستی طور پر کنفیگریشن تبدیل کرنی پڑتی ہے، جس سے غلطیاں ہوتی ہیں: ٹیسٹ بلڈ میں بھولی ہوئی پروڈکشن کلید حقیقی صارفین کو نوٹیفکیشن بھیج سکتی ہے یا پیمنٹ API استعمال کر سکتی ہے۔

ماحول کی علیحدگی

ماحولیاتی متغیرات کوڈ کو تبدیل کیے بغیر بیک اینڈ تبدیل کرنے کی اجازت دیتے ہیں: بس API_BASE_URL متغیر میں قدر تبدیل کریں۔ فیچر فلیگز FEATURE_CHAT_ENABLED=true جیسے متغیرات کے ذریعے منظم کیے جاتے ہیں، جو پروڈکشن کو متاثر کیے بغیر اسٹیجنگ میں نئی خصوصیات کو فعال کرنے کی اجازت دیتے ہیں۔ ہر ماحول کی اپنی .env فائل ہوتی ہے جو بلڈ وقت پر لوڈ ہوتی ہے۔

dart
class AppConfig {
  static final String apiBaseUrl =
    const String.fromEnvironment('API_BASE_URL',
      defaultValue: 'http://localhost:8080');
}

کلیدی سیکیورٹی

ہارڈ کوڈڈ کیز موبائل ایپلیکیشنز میں ایک عام کمزوری ہیں۔ حملہ آور jadx یا Hopper جیسے ٹولز کا استعمال کرتے ہوئے APK یا IPA کو ڈی کمپائل کرتا ہے اور بائنری فائل سے راز نکالتا ہے۔ یہاں تک کہ اوبفسکیشن بھی سٹرنگ لٹرلز کی حفاظت نہیں کرتا — ڈی کمپائلیشن کے بعد یہ کوڈ میں آسانی سے مل جاتے ہیں۔ ماحولیاتی متغیرات CI/CD کے ذریعے بلڈ وقت پر کیز منتقل کر کے اس مسئلے کو حل کرتے ہیں، جہاں وہ لاگز میں ماسک ہو جاتی ہیں۔

kotlin
object Config {
    val apiKey: String =
        System.getenv("API_KEY") ?: throw
            IllegalStateException("API_KEY not set")
}

CI/CD انضمام

ماحولیاتی متغیرات بلڈ پائپ لائنز کے ساتھ ضم ہوتے ہیں: GitHub Actions، GitLab CI، Bitrise اور CircleCI خفیہ متغیرات کو سپورٹ کرتے ہیں جو لاگز میں ظاہر نہیں ہوتے۔ بلڈ وقت پر، CI برانچ یا ٹیگ کے مطابق مناسب اقدار تبدیل کرتا ہے: ڈیویلپ برانچ کے لیے اسٹیجنگ استعمال ہوتی ہے، v* ٹیگ کے لیے پروڈکشن استعمال ہوتی ہے۔ یہ عمل کو خودکار بناتا ہے اور انسانی عنصر کو ختم کرتا ہے، اس بات کو یقینی بناتا ہے کہ ہر بلڈ کو کنفیگریشن کا صحیح سیٹ ملے۔

.env فائلیں اور انتظامی لائبریریاں

.env فائل KEY=VALUE فارمیٹ میں ماحولیاتی متغیرات کو محفوظ کرنے کا ایک معیاری طریقہ ہے۔ یہ ریپوزٹری میں شامل نہیں کی جاتی؛ اس کے بجائے، تمام متغیرات کے ٹیمپلیٹ اور خالی اقدار کے ساتھ .env.example شامل کیا جاتا ہے۔ ہر ڈویلپر ٹیم کے دیگر اراکین کی کنفیگریشنز کو متاثر کیے بغیر اپنی .env فائل لوکل سیٹنگز کے ساتھ بناتا ہے۔ مختلف ماحول کے لیے علیحدہ فائلیں استعمال ہوتی ہیں: .env.dev، .env.stage، .env.prod۔

bash
# .env.example — ڈویلپرز کے لیے ٹیمپلیٹ
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=

موبائل پروجیکٹس کے لیے .env فائلوں کے ساتھ کام کرنے کے لیے خصوصی لائبریریاں موجود ہیں:

  • flutter_dotenv (Flutter) — dotenv.load() کے ذریعے رن ٹائم پر .env سے متغیرات لوڈ کرتا ہے
  • BuildConfig (Android) — build.gradle اقدار سے ٹائپ شدہ فیلڈز بناتا ہے
  • xcconfig (iOS) — کنفیگریشن فائلوں کو مختلف Xcode بلڈ اسکیموں سے جوڑتا ہے
  • react-native-config (React Native) — .env فائلوں کے ذریعے متغیرات کا انتظام

CI/CD میں برانچنگ کی ترتیبات مختلف .env فائلوں کو تبدیل کرنے کی اجازت دیتی ہیں: ٹیسٹ سرورز کے لیے .env.dev، پری ریلیز کے لیے .env.stage اور ایپ اسٹورز پر اشاعت کے لیے .env.prod۔ رازوں والی فائلیں محفوظ ذخائر (Vault، AWS Secrets Manager) سے لوڈ کی جاتی ہیں اور ریپوزٹری میں محفوظ نہیں کی جاتیں۔ یہ اس بات کو یقینی بناتا ہے کہ ورژن کنٹرول سسٹم سے سمجھوتہ ہونے پر بھی، راز محفوظ رہیں۔

iOS پروجیکٹس میں ماحولیاتی متغیرات

iOS ایکو سسٹم بلڈ سطح پر متغیرات کے انتظام کے لیے xcconfig فائلیں استعمال کرتا ہے۔ یہ Xcode اسکیموں سے منسلک ہوتی ہیں اور ڈیبگ اور ریلیز کنفیگریشنز کے لیے اقدار کو اوور رائڈ کرنے کی اجازت دیتی ہیں۔ xcconfig فائلیں وراثت کو سپورٹ کرتی ہیں: مشترکہ سیٹنگز کے ساتھ ایک بیس فائل اور ہر ماحول کے لیے مخصوص فائلیں بنائی جا سکتی ہیں۔

xcconfig فائلوں کی ترتیب

xcconfig فائلیں KEY = VALUE فارمیٹ میں متغیرات محفوظ کرتی ہیں اور کنفیگریشن سیٹنگز کے ذریعے Xcode میں بلڈ اسکیم سے منسلک ہوتی ہیں۔ xcconfig سے متغیرات $(متغیر_کا_نام) نحو کے ذریعے Info.plist میں دستیاب ہوتے ہیں، جو مختلف اسکیموں کے لیے مختلف بنڈل شناخت کنندگان اور ایپ ناموں کی اجازت دیتے ہیں۔ فوری ماحول کی شناخت کے لیے، ایپ کے نام میں Dev یا Staging کا لاحقہ شامل کیا جاتا ہے۔

bash
# Config/Dev.xcconfig — ڈویلپمنٹ کنفیگریشن
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev

متغیرات پڑھنے کے لیے Swift کوڈ

iOS میں رن ٹائم پر متغیرات تک رسائی کے لیے Configuration.swift فائل استعمال ہوتی ہے، جو Bundle.main.object(forInfoDictionaryKey:) کے ذریعے Info.plist سے اقدار پڑھتی ہے۔ یہ طریقہ اس بات کی ضمانت دیتا ہے کہ متغیرات بلڈ وقت پر متعین ہوتے ہیں اور لانچ کے فوراً بعد ایپلیکیشن کے لیے دستیاب ہوتے ہیں۔ اقدار ماڈیول انیشیلائزیشن کے دوران ایک بار پڑھی جاتی ہیں اور ایپلیکیشن کی زندگی کے دوران تیز رسائی کے لیے کیش کی جاتی ہیں۔

swift
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 پروجیکٹس میں ماحولیاتی متغیرات

Android BuildConfig کے ذریعے ماحولیاتی متغیرات کو سپورٹ کرتا ہے — ایک خودکار طور پر بنائی جانے والی کلاس جس کے فیلڈز ماڈیول کی build.gradle فائل میں متعین ہوتے ہیں۔ BuildConfig ہر فلیور اور بلڈ ٹائپ کے لیے الگ الگ کمپائل وقت پر بنائی جاتی ہے۔ یہ کوڈ میں مشروط آپریٹرز استعمال کیے بغیر ڈیبگ اور ریلیز کے لیے مختلف اقدار رکھنے کی اجازت دیتا ہے، کارکردگی اور سیکیورٹی کو بہتر بناتا ہے۔

BuildConfig فیلڈز کی ترتیب

BuildConfig کے فیلڈز defaultConfig یا مخصوص buildTypes میں buildConfigField کے ذریعے سیٹ کیے جاتے ہیں۔ ہر ماحول کے لیے الگ buildType یا productFlavor بنایا جاتا ہے۔ یہ سخت کنفیگریشن علیحدگی کو یقینی بناتا ہے: ڈیبگ لوکل سرور استعمال کرتا ہے، ریلیز پروڈکشن استعمال کرتی ہے۔ BuildConfig فیلڈز سٹیٹک طور پر ٹائپ شدہ ہوتے ہیں، جو کوڈ میں ان تک رسائی کے دوران غلطیوں کو ختم کرتا ہے۔

groovy
// 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.properties فائل گلوبل Gradle متغیرات کو محفوظ کرتی ہے۔ یہ $variableName نحو کے ذریعے تمام ماڈیولز میں دستیاب ہوتے ہیں اور انحصار کے ورژن، بلڈ فلیگز اور API کیز بتانے کے لیے استعمال ہوتے ہیں۔ BuildConfig کے برعکس، gradle.properties صرف Gradle کنفیگریشن مرحلے پر کام کرتا ہے، ایپلیکیشن رن ٹائم پر نہیں۔ لہٰذا، gradle.properties میں بتائے گئے پاس ورڈز اور API کیز ڈی کمپائلڈ کوڈ میں نظر نہیں آتے، کیونکہ وہ صرف کمپائل وقت پر BuildConfig بنانے کے لیے استعمال ہوتے ہیں۔

groovy
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...

Android پروجیکٹس میں رازوں کی محفوظ منتقلی کے لیے، local.properties (VCS سے خارج) استعمال کرنے یا System.getenv() کے ذریعے build.gradle میں CI/CD متغیرات سے اقدار لوڈ کرنے کی سفارش کی جاتی ہے۔ یہ اس بات کو یقینی بناتا ہے کہ کیز ریپوزٹری میں نہ جائیں۔ Google Play Console پر شائع کرتے وقت، یقینی بنائیں کہ تمام ڈیبگ کیز کو متعلقہ BuildConfig اقدار کے ساتھ مختلف buildTypes یا productFlavors کے ذریعے پروڈکشن ورژن سے تبدیل کر دیا گیا ہے۔

اکثر پوچھے گئے سوالات

کیا Flutter میں ماحولیاتی متغیرات استعمال کیے جا سکتے ہیں؟

جی ہاں، Flutter رن ٹائم رسائی کے لیے flutter_dotenv پیکیج کے ذریعے یا پلیٹ فارم متغیرات کے لیے نیٹیو چینلز کے ذریعے ماحولیاتی متغیرات کو سپورٹ کرتا ہے۔ Dart میں --dart-define کے ذریعے کمپائل وقت پر اقدار منتقل کرنے کے لیے String.fromEnvironment کنسٹرکٹر بھی دستیاب ہے، جو Flutter پروجیکٹس کے لیے ترجیحی طریقہ ہے۔

BuildConfig اور gradle.properties میں کیا فرق ہے؟

BuildConfig ایک Java کلاس ہے جس میں ہر buildType اور flavor کے لیے کمپائل وقت پر بنائے گئے ٹائپ شدہ فیلڈز ہوتے ہیں۔ gradle.properties کلید-قدر کے جوڑوں والی ایک ٹیکسٹ فائل ہے جو بلڈ کنفیگریشن مرحلے پر تمام Gradle ماڈیولز کے لیے قابل رسائی ہوتی ہے۔ BuildConfig ایپلیکیشن رن ٹائم پر کام کرتا ہے، gradle.properties — صرف Gradle اسکرپٹس میں۔

.env فائل کو ریپوزٹری میں لیک ہونے سے کیسے روکا جائے؟

اپنی ریپوزٹری کی .gitignore فائل میں .env شامل کریں۔ ریپوزٹری میں صرف خالی اقدار اور ہر متغیر کی وضاحت کے ساتھ .env.example شامل کریں۔ CI/CD کے لیے، GitHub Actions، GitLab CI یا Bitrise کی ترتیبات میں انکرپٹڈ سیکرٹس استعمال کریں، جو لاگز میں ماسک ہوتے ہیں اور بلڈ مکمل ہونے کے بعد پڑھنے کے لیے دستیاب نہیں ہوتے۔

CI/CD کے ذریعے ماحولیاتی متغیرات کیسے منتقل کیے جائیں؟

زیادہ تر CI سسٹم خفیہ ماحولیاتی متغیرات کو سپورٹ کرتے ہیں۔ GitHub Actions میں یہ Secrets ہیں، GitLab CI میں — CI/CD Variables، Bitrise میں — Secrets۔ بلڈ وقت پر، یہ process.env یا System.getenv() کے ذریعے بلڈ اسکرپٹ کو منتقل کیے جاتے ہیں۔ خفیہ متغیرات بلڈ لاگز میں ظاہر نہیں ہوتے اور ریپوزٹری فورکس میں دستیاب نہیں ہوتے۔

ماحولیاتی متغیرات کے ذریعے فیچر فلیگز کیا ہیں؟

فیچر فلیگز بولین متغیرات ہیں جو کوڈ کو دوبارہ کمپائل کیے بغیر فعالیت کو فعال یا غیر فعال کرنے کو کنٹرول کرتے ہیں۔ مثال: FEATURE_NEW_PAYMENT=true ٹیسٹنگ کے لیے اسٹیجنگ میں ایک نیا پیمنٹ سسٹم فعال کرتا ہے۔ پروڈکشن میں، وہی فلیگ false پر سیٹ ہوتا ہے جب تک بیک اینڈ مکمل طور پر تعینات نہ ہو جائے۔ یہ تبدیلیوں کو مرحلہ وار محفوظ طریقے سے لاگو کرنے اور مسائل ہونے پر انہیں واپس لینے کی اجازت دیتا ہے۔

خلاصہ

  • ماحولیاتی متغیرات مختلف ڈویلپمنٹ ماحول کے لیے کنفیگریشن کو سورس کوڈ سے الگ کرتے ہیں
  • .env فائلیں .env.example ٹیمپلیٹ کے ساتھ — ماحول کی علیحدگی والی ٹیموں میں متغیرات کے انتظام کا معیار
  • iOS xcconfig وراثت کی حمایت اور Info.plist انضمام کے ساتھ کنفیگریشن فائلوں کو Xcode اسکیموں سے جوڑتا ہے
  • Android BuildConfig ہر buildType کے لیے الگ الگ build.gradle سے ٹائپ شدہ فیلڈز بناتا ہے
  • CI/CD راز ریپوزٹری میں محفوظ کیے بغیر بلڈ وقت پر حساس ڈیٹا منتقل کرتے ہیں
  • فیچر فلیگز متغیرات کے ذریعے دوبارہ کمپائلیشن کے بغیر مخصوص ماحول میں فعالیت کو فعال کرنے کی اجازت دیتے ہیں
  • سیکیورٹی: کیز CI میں انکرپٹ ہوتی ہیں اور ایپلیکیشن کی ڈی کمپائل ہونے والی بائنری فائل میں نہیں جاتیں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں