.xcconfig ایک Xcode ترتیب فائل ہے جو “کلید=قدر” کی شکل میں پروجیکٹ کے Build Settings کو مرکزی طور پر منظم کرتی ہے۔ ہر ترتیب کے لیے Xcode انٹرفیس میں دستی طور پر پیرامیٹرز تبدیل کرنے کے بجائے، ڈویلپر انہیں ایک ٹیکسٹ فائل میں بیان کرتے ہیں جسے ورژن کیا جا سکتا ہے اور پروجیکٹس کے درمیان دوبارہ استعمال کیا جا سکتا ہے۔ Apple Developer Documentation, 2025 کے مطابق، .xcconfig کا استعمال پروجیکٹ سیٹ اپ کے وقت کو 70% تک کم کرتا ہے اور ڈویلپرز کے درمیان ترتیب کے فرق کو ختم کرتا ہے۔ .xcconfig فائلیں ایک دوسرے سے وراثت حاصل کر سکتی ہیں، ترتیب کی ایک زنجیر تشکیل دیتی ہیں۔
اہم نکات
.xcconfig (Xcode ترتیب فائل) ایک سادہ ٹیکسٹ فائل ہے جس میں PARAMETER_NAME = value کی شکل میں Build Settings ہوتے ہیں۔ .xcconfig فائلیں Xcode بلڈ ترتیبات کے مرکزی انتظام کے لیے استعمال ہوتی ہیں: یہ Build Settings انٹرفیس میں فیلڈز کی دستی تدوین کو تبدیل کرتی ہیں۔ ہر .xcconfig ایک Build Configuration (Debug, Release) یا پورے پروجیکٹ سے منسلک ہوتی ہے اور کسی بھی build setting کو زیر کر سکتی ہے: SWIFT_VERSION, IPHONEOS_DEPLOYMENT_TARGET, PRODUCT_BUNDLE_IDENTIFIER, CODE_SIGN_STYLE, PROVISIONING_PROFILE_SPECIFIER۔
.xcconfig کے آنے سے پہلے، بلڈ سیٹنگز صرف project.pbxproj میں محفوظ تھیں — ایک بائنری/plist فائل جسے diff میں پڑھنا مشکل ہے اور جس پر تبصرہ کرنا ناممکن ہے۔ .xcconfig نے اس مسئلے کو حل کیا: ڈویلپر پیرامیٹرز پر تبصرہ کر سکتے ہیں، انہیں معنی کے مطابق گروپ کر سکتے ہیں، مختلف ماحول کے لیے ورژن قابل فائلیں بنا سکتے ہیں، اور فائلوں کے درمیان پیرامیٹرز وراثت میں لے سکتے ہیں۔ اس نے .xcconfig کو iOS پروجیکٹس میں ترتیب کے انتظام کا حقیقی معیار بنا دیا۔
.xcconfig فائلیں پروجیکٹ کے اندر، عام طور پر Configurations/ یا BuildConfig/ فولڈر میں واقع ہوتی ہیں۔ ہر فائل ایک Build Configuration سے مطابقت رکھتی ہے: Debug.xcconfig, Release.xcconfig, Staging.xcconfig۔ اس کے علاوہ، ایک مشترکہ Shared.xcconfig فائل بنائی جاتی ہے، جو #include کے ذریعے تمام ترتیبوں میں شامل ہوتی ہے۔ یہ مشترکہ پیرامیٹرز کو ایک بار متعین کرنے اور ترتیب فائلوں میں مخصوص پیرامیٹرز کو زیر کرنے کی اجازت دیتا ہے۔
Diff پڑھنے کی اہلیت: .xcconfig میں تبدیلیاں Git diff میں عام لائنوں کے طور پر نظر آتی ہیں۔ project.pbxproj کے برعکس، جہاں فیلڈ کی ترتیب تبدیل کرنے سے ایک پیرامیٹر کی تدوین پر 50 لائنیں تبدیلیاں دکھائی دیتی ہیں۔ تبصرے: .xcconfig میں آپ بتا سکتے ہیں کہ ہر پیرامیٹر کی ضرورت کیوں ہے۔ وراثت: آپ مشترکہ ترتیبات کے ساتھ ایک بنیادی ترتیب بنا سکتے ہیں اور صرف Debug اور Release کے لیے ضروری پیرامیٹرز کو زیر کر سکتے ہیں۔
.xcconfig کا نحو جتنا ممکن ہو سکے آسان ہے: ہر لائن ایک پیرامیٹر ہے، نام اور قدر مساوی نشان سے الگ کی گئی ہے۔ = کے ارد گرد خالی جگہوں کو نظر انداز کیا جاتا ہے۔ قدروں میں $(VARIABLE_NAME) یا ${VARIABLE_NAME} کی شکل میں متغیرات ہو سکتے ہیں۔ تبصرے // یا # سے شروع ہوتے ہیں اور لائن کے آخر تک لاگو ہوتے ہیں۔ لائنیں بیک سلیش \ کا استعمال کرتے ہوئے اگلی لائن پر جاری رہتی ہیں۔ خالی لائنوں کو نظر انداز کیا جاتا ہے۔
.xcconfig میں متغیرات دوسرے متغیرات کا حوالہ دے سکتے ہیں، مرکب قدریں بنا سکتے ہیں۔ مثال کے طور پر: PRODUCT_NAME = MyApp، PRODUCT_BUNDLE_IDENTIFIER = com.example.$(PRODUCT_NAME)۔ Xcode بلڈ کے وقت قدر کا اندازہ لگاتا ہے، متغیرات کی اصل قدروں کو تبدیل کرتا ہے۔ AGP سسٹم متغیرات کو بھی سپورٹ کرتا ہے: ARCHS, SDK_NAME, CONFIGURATION, PLATFORM_NAME، جو بلڈ ماحول کے ذریعے متعین ہوتے ہیں۔
مشروط ترتیب کے لیے، مربع بریکٹ میں پلیٹ فارم کی ہدایات استعمال ہوتی ہیں: PARAMETER[sdk=iphoneos*] = value۔ مثال کے طور پر، SUPPORTED_PLATFORMS[sdk=iphoneos*] = iphoneos پیرامیٹر کو صرف iOS بلڈز کے لیے متعین کرتا ہے۔ وائلڈ کارڈ معاونت یافتہ ہیں: * (کوئی بھی حرف)، ? (ایک حرف)۔ مشروط ہدایات متعدد پلیٹ فارمز کے لیے ایک .xcconfig رکھنے اور ایک فائل میں iOS اور macOS کے لیے مختلف قدریں متعین کرنے کی اجازت دیتی ہیں۔
// Shared.xcconfig — مشترکہ پروجیکٹ کی ترتیبات
SWIFT_VERSION = 5.0
IPHONEOS_DEPLOYMENT_TARGET = 16.0
SDKROOT = iphoneos
TARGETED_DEVICE_FAMILY = 1,2
// بنڈل شناخت کنندہ — سابقہ اور نام سے بنتا ہے
BUNDLE_ID_PREFIX = com.example
PRODUCT_NAME = MyApp
PRODUCT_BUNDLE_IDENTIFIER = $(BUNDLE_ID_PREFIX).$(PRODUCT_NAME)
// macOS کے لیے مشروط ترتیب
SUPPORTED_PLATFORMS[sdk=macosx*] = macosx
PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*] = $(BUNDLE_ID_PREFIX).$(PRODUCT_NAME).mac
// ورژن بندی
MARKETING_VERSION = 2.4.1
CURRENT_PROJECT_VERSION = 37
#include ایک .xcconfig پری پروسیسر ہدایت ہے جو کسی دوسری .xcconfig فائل کے مواد کو شامل کرتی ہے۔ ہدایات کو نیسٹ کیا جا سکتا ہے: Shared.xcconfig “Base.xcconfig” کو #include کر سکتا ہے، Debug.xcconfig “Shared.xcconfig” کو #include کر سکتا ہے۔ وراثت کی زنجیر ترتیبات کا ایک درجہ بندی بنانے کی اجازت دیتی ہے، جہاں ہر سطح پچھلی سطح کے پیرامیٹرز کو زیر کرتی ہے۔ #include آخری تحریر کے اصول پر کام کرتا ہے: اگر ایک ہی پیرامیٹر شامل اور مرکزی فائل دونوں میں متعین ہو، تو مرکزی فائل کی قدر کو ترجیح دی جاتی ہے۔
ایک عام iOS پروجیکٹ کے لیے صحیح درجہ بندی: Base.xcconfig (سب سے عام پیرامیٹرز) ← Shared.xcconfig (پروجیکٹ کی ترتیبات) ← Debug.xcconfig یا Release.xcconfig۔ Base.xcconfig معیارات متعین کرتا ہے (SWIFT_VERSION, DEPLOYMENT_TARGET)، Shared.xcconfig — پروجیکٹ کی خصوصیات (PRODUCT_NAME, PREPROCESSOR_DEFINITIONS)، Debug/Release — ماحول (DEBUG_INFORMATION_FORMAT, OPTIMIZATION_CFLAGS)۔ #include چکروں کی اجازت نہیں دیتا — چکری انحصار پائے جانے پر Xcode خرابی دکھائے گا۔
مثال: Config/Base.xcconfig ← Config/iOS/Shared.xcconfig ← Config/iOS/Debug.xcconfig۔ یہ ساخت Base کو iOS، macOS اور tvOS پروجیکٹس کے لیے اور Shared کو صرف iOS کے لیے دوبارہ استعمال کرنے کی اجازت دیتی ہے۔ نوٹ: #include جڑ .xcconfig کے مقام سے فائل کا نام یا رشتہ دار راستہ استعمال کرتا ہے۔ مطلق راستے تجویز نہیں کیے جاتے — وہ دوسری مشینوں اور CI/CD میں بلڈ کو توڑ دیتے ہیں۔
// --- Config/Base.xcconfig ---
SWIFT_VERSION = 5.0
ENABLE_MODULE_VERIFIER = YES
CLANG_ENABLE_MODULES = YES
// --- Config/iOS/Shared.xcconfig ---
#include "../Base.xcconfig"
IPHONEOS_DEPLOYMENT_TARGET = 16.0
PRODUCT_BUNDLE_IDENTIFIER = com.example.myapp
// --- Config/iOS/Debug.xcconfig ---
#include "Shared.xcconfig"
OPTIMIZATION_CFLAGS = -O0
DEBUG_INFORMATION_FORMAT = dwarf
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG
ENABLE_TESTABILITY = YES
// --- Config/iOS/Release.xcconfig ---
#include "Shared.xcconfig"
OPTIMIZATION_CFLAGS = -Osize
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
SWIFT_COMPILATION_MODE = wholemodule
.xcconfig کو پروجیکٹ سے جوڑنا Project Info ← Configurations میں کیا جاتا ہے۔ ہر Build Configuration (Debug, Release, AdHoc) کے لیے “Based on Configuration File” ڈراپ ڈاؤن سے متعلقہ .xcconfig منتخب کی جاتی ہے۔ اگر کوئی ترتیب فائل سے منسلک نہیں ہے، تو Xcode project.pbxproj کی قدریں استعمال کرتا ہے۔ .xcconfig منتخب کرنے کے بعد، فائل کے تمام پیرامیٹرز اس ترتیب کے لیے فعال ہو جاتے ہیں۔
پروجیکٹ کی سطح اور ہدف کی سطح کی ترتیبات میں فرق کرنا ضروری ہے۔ پروجیکٹ کی سطح کا .xcconfig تمام اہداف کے لیے طے شدہ پیرامیٹرز متعین کرتا ہے۔ ہدف کی سطح کا .xcconfig انہیں ایک مخصوص ہدف کے لیے زیر کرتا ہے۔ اگر کوئی پیرامیٹر ہدف کی سطح کے .xcconfig میں متعین نہیں ہے، تو پروجیکٹ کی سطح سے قدر استعمال ہوتی ہے۔ اگر وہاں بھی متعین نہیں ہے، تو project.pbxproj سے قدر استعمال ہوتی ہے۔ عملی اصول: مشترکہ پیرامیٹرز (بلڈ، ورژن) پروجیکٹ کی سطح پر رکھیں، اور ہدف کی خصوصیات (بنڈل شناخت کنندہ، پروویژننگ) ہدف کی سطح پر رکھیں۔
.xcconfig اور UI Build Settings کے درمیان تصادم کی صورت میں، UI کی قدر کو ترجیح دی جاتی ہے (یہ .xcconfig کو زیر کرتا ہے)۔ یہ الجھن کا سبب بن سکتا ہے: ایک ڈویلپر UI میں Build Setting تبدیل کرتا ہے، یہ نہیں جانتے کہ .xcconfig ایک مختلف قدر متعین کرتی ہے۔ یہ تجویز کیا جاتا ہے کہ مکمل طور پر .xcconfig پر سوئچ کریں اور UI Build Settings کو ہاتھ نہ لگائیں۔ یہ جانچنے کے لیے کہ کون سا پیرامیٹر لاگو ہو رہا ہے، xcrun xcodebuild -showBuildSettings استعمال کریں — یہ کمانڈ تمام سطحوں کو حل کرنے کے بعد تمام پیرامیٹرز کی حتمی قدریں دکھائے گی۔
تین سطحی ترتیب پر غور کریں: Dev (مقامی ترقی)، Staging (جانچ سرور)، Production (اجرا)۔ ہر ماحول کے لیے ایک علیحدہ .xcconfig بنائی جاتی ہے، جو مختلف API_URL، لاگنگ اور سرٹیفکیٹ قدریں متعین کرتی ہے۔ Dev localhost استعمال کرتا ہے، Staging staging.api.example.com استعمال کرتا ہے، Production api.example.com استعمال کرتا ہے۔ تینوں #include کے ذریعے مشترکہ Shared.xcconfig کو وراثت میں لیتے ہیں۔
ماحول کے درمیان فرق کرنے والا اہم پیرامیٹر PRODUCT_BUNDLE_IDENTIFIER ہے۔ Dev کے لیے: com.example.myapp.dev، Staging کے لیے: com.example.myapp.staging، Production کے لیے: com.example.myapp۔ مختلف بنڈل ID ایک ہی آلے پر تینوں ورژن بیک وقت انسٹال کرنے کی اجازت دیتی ہیں۔ CODE_SIGN_IDENTITY (Dev کے لیے Apple Development، Production کے لیے Apple Distribution) اور PROVISIONING_PROFILE_SPECIFIER بھی مختلف ہوتے ہیں۔
کوڈ میں قدریں منتقل کرنے کے لیے، INFOPLIST_PREFIX_HEADER یا -D پری پروسیسر کے ساتھ OTHER_SWIFT_FLAGS استعمال ہوتا ہے۔ Swift میں پری پروسیسر نہیں ہے، اس لیے Active Compilation Conditions استعمال ہوتی ہیں: SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEV۔ کوڈ میں: #if DEV; #elseif STAGING; #else; #endif۔ Objective-C کے لیے GCC_PREPROCESSOR_DEFINITIONS استعمال ہوتا ہے۔ یہ سورس فائلوں کو تبدیل کیے بغیر مختلف ماحول کے لیے مختلف کوڈ مرتب کرنے کی اجازت دیتا ہے۔
// --- Config/Dev.xcconfig ---
#include "Shared.xcconfig"
PRODUCT_BUNDLE_IDENTIFIER = $(BUNDLE_ID_PREFIX).$(PRODUCT_NAME).dev
CODE_SIGN_IDENTITY = Apple Development
PROVISIONING_PROFILE_SPECIFIER = Dev Profile
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG DEV
OTHER_SWIFT_FLAGS = -D DEV
// Info.plist کے ذریعے API URL — قدر تبدیل ہوتی ہے
API_BASE_URL = http://localhost:3000/api
// --- Config/Staging.xcconfig ---
#include "Shared.xcconfig"
PRODUCT_BUNDLE_IDENTIFIER = $(BUNDLE_ID_PREFIX).$(PRODUCT_NAME).staging
CODE_SIGN_IDENTITY = Apple Development
PROVISIONING_PROFILE_SPECIFIER = Staging Profile
SWIFT_ACTIVE_COMPILATION_CONDITIONS = STAGING
OTHER_SWIFT_FLAGS = -D STAGING
API_BASE_URL = https://staging.api.example.com/v2
// --- Config/Production.xcconfig ---
#include "Shared.xcconfig"
PRODUCT_BUNDLE_IDENTIFIER = $(BUNDLE_ID_PREFIX).$(PRODUCT_NAME)
CODE_SIGN_IDENTITY = Apple Distribution
PROVISIONING_PROFILE_SPECIFIER = AppStore Distribution
SWIFT_ACTIVE_COMPILATION_CONDITIONS = RELEASE
API_BASE_URL = https://api.example.com/v3
.xcconfig کی قدریں متغیرات $(PARAMETER_NAME) کے ذریعے Info.plist میں منتقل کی جا سکتی ہیں۔ اگر .xcconfig میں کوئی پیرامیٹر متعین ہے (مثال کے طور پر، API_BASE_URL)، تو اسے Info.plist میں استعمال کیا جا سکتا ہے: <key>ApiBaseUrl</key><string>$(API_BASE_URL)</string>۔ بلڈ کے وقت، Xcode $(API_BASE_URL) کو .xcconfig کی قدر سے تبدیل کر دیتا ہے۔ یہ کوڈ تبدیل کیے بغیر ایپلیکیشن کو ترتیب دینے کی اجازت دیتا ہے — بس سکیم تبدیل کریں۔
Info.plist میں استعمال ہونے والے .xcconfig پیرامیٹرز عوامی ہونے چاہئیں — وہ بائنری میں جاتے ہیں اور ڈی کمپائل شدہ ایپلیکیشن میں نظر آتے ہیں۔ خفیہ قدروں (ٹوکن، پاس ورڈ) کے لیے .xcconfig استعمال نہ کریں — سرور پر چلنے والی Firebase Remote Config جیسی خدمات استعمال کریں۔ Info.plist کے لیے .xcconfig اس کے لیے موزوں ہے: سرور URLs، ہستیوں کے نام، ٹریکر شناخت کنندگان، feature flags۔
کوڈ میں Info.plist کی قدروں تک رسائی: Objective-C/Swift کے لیے Bundle.main.object(forInfoDictionaryKey: “ApiBaseUrl”)۔ اگر قدر .xcconfig کے ذریعے متعین کی گئی ہے، تو اسے تبدیل کر دیا جائے گا اور Bundle main.infoDictionary میں دستیاب ہو گی۔ یہ طریقہ BuildConfigField (جیسا کہ Android میں ہے) سے بہتر ہے، کیونکہ Info.plist ایک معیاری iOS طریقہ کار ہے، اور اس کی قدریں سسٹم کے تمام اجزاء بشمول extensions، widgets اور Siri Intents کے لیے دستیاب ہیں۔
اکثر پوچھے گئے سوالات
User-Defined Setting ایک حسب ضرورت پیرامیٹر ہے جو UI Build Settings کے ذریعے شامل کیا گیا ہے۔ یہ .xcconfig کی طرح کام کرتا ہے، لیکن اسے ورژن، تبصرہ یا پروجیکٹس کے درمیان دوبارہ استعمال نہیں کیا جا سکتا۔ .xcconfig ڈسک پر ایک فائل ہے، User-Defined Setting project.pbxproj میں ایک اندراج ہے۔
ہاں، CocoaPods ہر ترتیب کے لیے Pods-*.xcconfig فائلیں تیار کرتا ہے۔ ان فائلوں میں پوڈز کو جوڑنے کی ترتیبات ہوتی ہیں۔ Pods.xcconfig جنریٹر فائل میں #include کے ذریعے آپ کے .xcconfig سے خود بخود منسلک ہو جاتا ہے۔ Pods.xcconfig کو دستی طور پر ترمیم نہ کریں — یہ pod install کے دوران اوور رائٹ ہو جاتا ہے۔
Info.plist کے ذریعے: .xcconfig میں ایک پیرامیٹر متعین کریں اور Info.plist میں $(PARAM) استعمال کریں۔ کوڈ میں: Bundle.main.infoDictionary[“PARAM”]۔ پری پروسیسر فلیگ کے لیے، SWIFT_ACTIVE_COMPILATION_CONDITIONS اور #if CONDITION استعمال کریں۔
وجوہات: آپ نے UI Build Settings میں قدر تبدیل کر دی (UI .xcconfig کو زیر کرتا ہے)؛ فائل ترتیب سے منسلک نہیں ہے (Project ← Info ← Configurations چیک کریں)؛ غلط #include راستہ؛ پیرامیٹر کے نام میں ٹائپو۔ تشخیص: xcodebuild -showBuildSettings تمام فعال پیرامیٹرز دکھائے گا۔
ہاں، .xcconfig UI فریم ورک پر منحصر نہیں ہے۔ SwiftUI پروجیکٹس کے لیے، .xcconfig اتنا ہی مفید ہے: بنڈل ID، ورژن، ماحول کی ترتیبات، feature flags کے لیے SWIFT_ACTIVE_COMPILATION_CONDITIONS کا انتظام۔ SwiftUI .xcconfig کا کوئی متبادل فراہم نہیں کرتا، اس لیے کسی بھی پروجیکٹ کے ساتھ اس کے استعمال کی سفارش کی جاتی ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں