مدیریت پیکربندی در توسعه موبایل: چیست، چه گزینه‌هایی دارد و چگونه تنظیم کنیم

نویسنده: IT Sectr منتشر شده: 2026-05-30 زمان مطالعه: 8 دقیقه

مدیریت پیکربندی یکی از کم‌توجه‌ترین جنبه‌های توسعه موبایل است. طبق CloudBees (2025)، 47% از حوادث production به پیکربندی‌های نادرست build مربوط می‌شوند. تنظیم صحیح Build Variant، Scheme و فایل‌های .env کلید CI/CD پایدار و انتشار قابل پیش‌بینی است.

نکات کلیدی

  • مدیریت پیکربندی در برنامه‌های موبایل بر Build Variant (Android)، Scheme (iOS) و .env (چندپلتفرمی) استوار است — 47% از حوادث production به تنظیمات نادرست مربوط می‌شوند.
  • iOS از Scheme + .xcconfig استفاده می‌کند. Scheme ساخت، آزمایش و بایگانی را مدیریت می‌کند. .xcconfig تنظیمات build را به فایل‌ها منتقل می‌کند.
  • ابزارهای چندپلتفرمی — pubspec.yaml (Flutter)، Podfile (CocoaPods)، .env (متغیرهای محیطی) — پیکربندی را متمرکز می‌کنند.
  • کامپایل شرطی — شامل/خارج کردن کد در زمان کامپایل. #if DEBUG، BuildConfig.DEBUG — برای اشکال‌زدایی بدون تغییر رفتار انتشار.
  • کلیدهای API و اسرار را نمی‌توان در کد ذخیره کرد. از .env، Build Config یا سرور پروکسی استفاده کنید. دی‌کامپایل .apk/.ipa ساده است.

مدیریت پیکربندی در Android: Build Variant و build.gradle

Build Variant — ترکیبی از Build Type (debug/release/staging) و Product Flavor (free/paid، demo/full). Gradle به طور خودکار برای هر ترکیب variant ایجاد می‌کند: freeDebug، freeRelease، paidDebug، paidRelease. هر variant می‌تواند کد، منابع و وابستگی‌های خود را داشته باشد — این اساس مدیریت پیکربندی در برنامه‌های موبایل در Android است.

Build Variant در مقابل Product Flavor

Build Type — تنظیمات build: آیا اشکال‌زدایی فعال است، امضا، بهینه‌سازی ProGuard. debug به طور پیش‌فرض شامل debuggable=true است، release — minifyEnabled=true.

Product Flavor — نوع برنامه: رایگان (free)، پولی (paid)، دمو (demo). flavorها می‌توانند applicationId، منابع، وابستگی‌های SDK متفاوتی داشته باشند.

groovy
// build.gradle — پیکربندی flavorهای محصول در Android
android {
    productFlavors {
        free {
            applicationId "com.example.app.free"
            versionName "1.0-free"
        }
        paid {
            applicationId "com.example.app.paid"
            versionName "1.0-paid"
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }
}

مثال دو flavor ایجاد می‌کند: free و paid. یک applicationId جداگانه برای free تنظیم شده است — این امکان نصب هر دو برنامه روی یک دستگاه را فراهم می‌کند. BuildConfig برای هر variant تولید می‌شود: BuildConfig.FLAVOR = "free"، BuildConfig.BUILD_TYPE = "debug". برای منطق شرطی از BuildConfig در کد استفاده کنید.

settings.gradle و Gradle KTS

settings.gradle — فایل ریشه Gradle که ماژول‌های پروژه را توصیف می‌کند.

Gradle KTS — جایگزینی برای Groovy با استفاده از Kotlin DSL. KTS تکمیل خودکار در Android Studio و بررسی نوع را فراهم می‌کند. برای پروژه‌های جدید توصیه می‌شود.

مدیریت پیکربندی در iOS: Scheme و .xcconfig

مدیریت پیکربندی در iOS بر Scheme استوار است — پیکربندی Xcode که مشخص می‌کند چه چیزی و چگونه ساخته شود: Build Configuration (Debug/Release)، آزمایش‌ها، تحلیل، بایگانی. Schemeها را می‌توان برای محیط‌های مختلف (Development، Staging، Production) کپی کرد. Schemeها در پوشه xcshareddata در فایل‌های .xcscheme ذخیره می‌شوند.

فایل‌های .xcconfig

.xcconfig — فایل پیکربندی Xcode که تنظیمات build را به صورت متنی ذخیره می‌کند. برای مدیریت پیکربندی برنامه‌های موبایل، iOS از .xcconfig استفاده می‌کند: نسخه‌گذاری در Git، استفاده مجدد بین پروژه‌ها، تنظیمات دستی کمتر. در .xcconfig مقادیر SWIFT_ACTIVE_COMPILATION_CONDITIONS، PRODUCT_BUNDLE_IDENTIFIER، CODE_SIGN_IDENTITY تنظیم می‌شوند.

Info.plist — فایل متادیتای برنامه. نسخه، شناسه، مجوزها را ذخیره می‌کند. Info.plist می‌تواند برای هر Scheme متفاوت باشد — از طریق Info.plist File در Build Settings.

AndroidManifest.xml — معادل Android: مجوزها، کامپوننت‌ها، متادیتا را ذخیره می‌کند.

Scheme در مقابل Build Configuration

Scheme — سناریوی build (چه کاری انجام دهیم). Build Configuration — مجموعه تنظیمات (چگونه انجام دهیم). یک Scheme از یک Build Configuration (Debug یا Release) استفاده می‌کند. برای CI/CD: اکشن Archive را روی Release و اکشن Test را روی Debug در یک Scheme تنظیم کنید.

مدیریت پیکربندی در Flutter و React Native: pubspec.yaml، Podfile، .env

pubspec.yaml — فایل پیکربندی پروژه Flutter. شامل وابستگی‌ها، نسخه‌ها، منابع است. از متغیرهای محیطی از طریق --dart-define پشتیبانی می‌کند.

Podfile — مدیر وابستگی CocoaPods برای iOS. نسخه‌های کتابخانه و پلتفرم را مشخص می‌کند.

.env — فایلی با متغیرهای محیطی برای همه پلتفرم‌ها. Flutter و React Native از رویکرد متفاوتی برای مدیریت پیکربندی استفاده می‌کنند: dart-define در Flutter، react-native-config در React Native. مدیریت پیکربندی در پروژه‌های چندپلتفرمی بسته به stack شامل ابزارهای مختلفی می‌شود.

.env و متغیرهای محیطی

.env — فایل متنی با جفت‌های کلید=مقدار. در Git commit نمی‌شود (به .gitignore اضافه کنید). برای Flutter — flutter_dotenv، برای iOS — Config.xcconfig با #include، برای Android — BuildConfig. متغیرهای env: API_URL، SENTRY_DSN، APP_SECRET. در مدیریت پیکربندی توسعه موبایل، .env استاندارد دوفاکتو برای ذخیره اسرار خارج از مخزن است.

Podfile و pubspec.yaml

Podfile وابستگی‌های CocoaPods و پلتفرم را توصیف می‌کند (platform :ios, '15.0'). pubspec.yaml برای Flutter — dependencies و dev_dependencies. هر دو از وابستگی‌های شرطی پشتیبانی می‌کنند: pod 'Analytics', :configs => ['Release'] یا flutter pub add --flavor free. در IT Sectr، ما از .env + BuildConfig برای اسرار و Podfile برای وابستگی‌های بومی در پروژه‌های موبایل استفاده می‌کنیم.

پارامتر Android iOS Flutter
واحد پیکربندیBuild VariantSchemeFlavor (--flavor)
فایل buildbuild.gradle.xcconfigpubspec.yaml
کد شرطیBuildConfigActive Compilation Conditionsdart-define
اسرارBuildConfig/NDK.xcconfig.env/dart-define
مدیر وابستگیGradle (Maven)SPM/CocoaPodspub (dart)

جدول تفاوت‌های اصلی در مدیریت پیکربندی بین پلتفرم‌های موبایل را نشان می‌دهد. Android انعطاف‌پذیری بیشتری از طریق Build Variant ارائه می‌دهد. iOS ساده‌تر است اما انعطاف‌پذیری کمتری دارد. Flutter پیکربندی را در dart-define متمرکز می‌کند، اما وابستگی‌های بومی هنوز نیاز به پیکربندی Podfile/build.gradle دارند.

کامپایل شرطی در مدیریت پیکربندی

کامپایل شرطی — شامل یا خارج کردن کد در زمان کامپایل بسته به پرچم‌ها. این بخشی از مدیریت پیکربندی است: امکان جاسازی ابزارهای اشکال‌زدایی (لاگینگ، بازرس) در buildهای debug و حذف آنها از release را فراهم می‌کند. پیاده‌سازی در پلتفرم‌های مختلف متفاوت است.

کامپایل شرطی در Swift

#if DEBUG — دستور پیش‌پردازنده Swift. کد داخل بلوک فقط در پیکربندی Debug کامپایل می‌شود. پرچم‌های دیگر: #if !RELEASE، #if targetEnvironment(simulator). Active Compilation Conditions در Build Settings — پرچم‌های سفارشی خود را از طریق -D FLAG_NAME اضافه کنید. مدیریت پیکربندی build از طریق شرایط کامپایل در iOS یک روش استاندارد است.

کامپایل شرطی در Kotlin

BuildConfig.DEBUG — فیلد بولی، در build debug true است. BuildConfig به طور خودکار توسط Gradle تولید می‌شود. برای پرچم‌های سفارشی از buildConfigField در build.gradle استفاده کنید: buildConfigField "boolean"، "REPORT_CRASHES"، "true". در کد: if (BuildConfig.REPORT_CRASHES) { ... }.

کامپایل شرطی در Flutter

dart-define — پرچم‌های کامپایل Flutter: flutter run --dart-define=ENV=staging. در کد: const env = String.fromEnvironment('ENV', defaultValue: 'production'). برای buildهای شرطی برنامه‌های موبایل، از پلاگین build_runner با تولید کد استفاده کنید.

سوالات متداول

تفاوت Build Variant با Product Flavor در Android چیست؟

Build Variant = Build Type (debug/release) + Product Flavor. Flavor نوع برنامه است (پولی/رایگان، مشتری/سرور)، Build Type تنظیمات build است (اشکال‌زدایی/بهینه‌سازی). ترکیب flavour + type variant را تشکیل می‌دهد: به عنوان مثال، paidDebug.

.xcconfig چیست و چرا در iOS به آن نیاز داریم؟

.xcconfig یک فایل پیکربندی Xcode است که تنظیمات build را به صورت متنی ذخیره می‌کند. این امکان را فراهم می‌کند تا تنظیمات را از پروژه Xcode به فایل‌های سازگار با Git منتقل کرده، CI/CD و کار تیمی را در پروژه‌های موبایل ساده‌تر کند.

چگونه کلیدهای API را به صورت امن در برنامه موبایل ذخیره کنیم؟

کلیدهای API را نمی‌توان در کد ذخیره کرد — هر .apk یا .ipa قابل دی‌کامپایل است. از فایل‌های .env، پروکسی بک‌اند یا مبهم‌سازی از طریق Build Config استفاده کنید. IT Sectr توصیه می‌کند اسرار را روی سرور ذخیره کرده و پس از احراز هویت به مشتری تحویل دهید.

کامپایل شرطی چیست و چه زمانی از آن استفاده کنیم؟

کامپایل شرطی شامل/خارج کردن کد در زمان کامپایل بسته به پرچم‌ها است. در Swift — #if DEBUG، در Kotlin — BuildConfig.DEBUG. برای فعال کردن لاگینگ در debug و غیرفعال کردن در release استفاده می‌شود. این یک عنصر کلیدی مدیریت پیکربندی در توسعه موبایل است.

آیا Podfile در پروژه بدون CocoaPods لازم است؟

Podfile فقط هنگام کار با CocoaPods استفاده می‌شود. برای SPM یا Carthage لازم نیست. اگر از CocoaPods صرف‌نظر کرده‌اید، Podfile را در پروژه رها نکنید — این باعث سردرگمی تیم و سیستم CI/CD می‌شود.

خلاصه

  • مدیریت پیکربندی در برنامه‌های موبایل اساس CI/CD پایدار است. Android از Build Variant استفاده می‌کند، iOS از Scheme استفاده می‌کند، Flutter از dart-define استفاده می‌کند.
  • Android: Build Variant = Build Type × Product Flavor. BuildConfig برای هر variant تولید می‌شود.
  • iOS: Scheme + .xcconfig پیکربندی را مدیریت می‌کنند. Info.plist — متادیتای برنامه.
  • Flutter: dart-define برای متغیرهای build. pubspec.yaml برای وابستگی‌ها.
  • کامپایل شرطی (#if DEBUG، BuildConfig.DEBUG) — بخشی از مدیریت پیکربندی، روش استاندارد برای حذف کد اشکال‌زدایی در release.
  • .env — ذخیره امن اسرار خارج از مخزن. .env را در Git commit نکنید.
  • مدیریت پیکربندی در پروژه‌های موبایل از اولین commit نیاز به توجه دارد — تنظیم صحیح build در هر انتشار ساعت‌ها اشکال‌زدایی را ذخیره می‌کند.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه