.xcconfig হল একটি Xcode কনফিগারেশন ফাইল যা "কী=মান" ফরম্যাটে প্রকল্পের Build Settings কেন্দ্রীয়ভাবে পরিচালনা করে। প্রতিটি কনফিগারেশনের জন্য Xcode UI-তে ম্যানুয়ালি প্যারামিটার পরিবর্তন করার পরিবর্তে, ডেভেলপাররা সেগুলি একটি টেক্সট ফাইলে বর্ণনা করে যা ভার্সন করা যায় এবং প্রকল্পগুলির মধ্যে পুনরায় ব্যবহার করা যায়। Apple Developer Documentation, 2025 অনুসারে, .xcconfig ব্যবহার প্রকল্প সেটআপের সময় 70% কমিয়ে দেয় এবং ডেভেলপারদের মধ্যে কনফিগারেশন অসঙ্গতি দূর করে। .xcconfig ফাইলগুলি একে অপরের থেকে ইনহেরিট করতে পারে, কনফিগারেশনের একটি চেইন তৈরি করে।
মূল বিষয়
.xcconfig (Xcode কনফিগারেশন ফাইল) হল একটি প্লেইন-টেক্সট ফাইল যা PARAMETER_NAME = value ফরম্যাটে Build Settings ধারণ করে। .xcconfig ফাইলগুলি Xcode বিল্ড কনফিগারেশনগুলির কেন্দ্রীভূত ব্যবস্থাপনার জন্য ব্যবহৃত হয়: এগুলি Build Settings UI-তে ফিল্ডের ম্যানুয়াল এডিটিং প্রতিস্থাপন করে। প্রতিটি .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-এর বিপরীতে, যেখানে ফিল্ড অর্ডার পরিবর্তনের ফলে একটি প্যারামিটার সম্পাদনায় diff 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 থেকে মান Info.plist-এ ভেরিয়েবল $(PARAMETER_NAME)-এর মাধ্যমে পাস করা যেতে পারে। যদি .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 এর জন্য উপযুক্ত: সার্ভার URL, এন্টিটি নাম, ট্র্যাকার আইডেন্টিফায়ার, 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন