iOS XCode: How to switch Environment with Configurations

Image Credit: burst.shopify.com

আমার career শুরু হয় web-developer হিসাবে। Inovio-তে জয়েন করার পর iOS এ হাতেখড়ি। এখানে সাধারণত যে কোন project এ কমপক্ষে দুটি environment তৈরি করা হয়। একটি development (dev), আরেকটি production (prod), অনেক সময় staging (stage) সার্ভার থাকে। নাম শুনেই ধারনা করা যায় কোনটার কাজ কী?

এইবার আসি আসল কথায়, সাধারণত বিভিন্ন environment অনুযায়ী কিছু key-value / environment-variable এর মান (value) আলাদা হয়ে থাকে। যেমনঃ
apiUrl, googleKey, facebook_app_key ইত্যাদি।
আমাদের কোড এ নিম্নক্ত উপায়ে লিখতে হয়ঃ

// Mark: production
let BASE_API_URL = "https://api.mysite.com"
let GOOGLE_KEY = "prod-google-api-key"
let FACEBOOK_KEY = "prod-facebook-key"
//Mark: development
// let BASE_API_URL = "https://dev-api.mysite.com"
// let GOOGLE_KEY = "dev-google-api-key"
// let FACEBOOK_KEY = "dev-facebook-key"

এখন যখন আমরা ডেভেলপমেন্ট এর কাজ করি তখন dev environment এর variable গুলো একটিভ থাকে, production এর গুলো inactive থাকে । iTunes-এ আপলোড এর সময়ে উল্টা কাজ করতে হয়। তখন dev environment এর base URL, API KEY ইত্যাদি ভেরিয়েবলগুলো inactive থাকে আর production environment এরগুলো active থাকে। আমরা কোডের মধ্যে কমেন্ট করে একেকটা পার্টকে inactive করে থাকি। প্রত্যেকবার iTunes এ আপলোড এর সময়ে একই কাজ বার বার করা লাগে। যা অবশ্যই বিরক্তিকর।
এই বিরক্তিকর কাজ থেকে রেহাই পাওয়ার অনেকগুলো উপায় রয়েছে। তার মধ্যে আমি সহজ এবং সরল উপায়টি নিম্নে বর্ণনা করব।

ধাপ ১ঃ প্রজেক্ট খোলা

XCode-এ একটি নতুন প্রজেক্ট খুলি

create new `Single View App` from XCode

প্রজেক্টের একটি নাম দেই। অন্যান্য কনফিগারেশন গুলো পূরণ করি (language, team etc.)

Setup others configurations

ধাপ ২ঃ কনফিগারেশন ঠিক করা

প্রত্যেক xCode প্রজেক্ট এ দুটি default configuration থাকে, Debug এবং Release.
ধরে নিই, আমি যে প্রজেক্ট এ কাজ করব তার দুই ধরনের API-Server রয়েছে। একটি Development (dev) অপরটি Production (prod) সার্ভার।

After Creating the project

এখন Debug কনফিগারেশন এর একটা copy তৈরি করতে হবে।

Click [+] button

কাজের সুবিধার্থে চিত্র অনুযায়ী, `+` বাটন এ ক্লিক করে Debug এর ডুপ্লিকেশন তৈরি করে re-name করে দেই।

rename configuration

ধাপ ৩ঃ Info.plist - এ কনফিগার করা

Xcode এর navigation area থেকে Info.plist ফাইলটি সিলেক্ট করি। Track pad এর ডাবল ট্যাপ অথবা mouse এর right button ক্লিক করে নতুন ROW তৈরি করি (add new row)। নতুন row তে কী (key) এর নাম এবং ভ্যালু(value) দেই।

Info.plist

আমি এইখানে key এর নাম দিলাম AppEnv এবং ভ্যালু হিসাবে $(Configuration). অ্যাপ বিল্ডের সময়ে আমারা এখান থেকে environment ভ্যালু পাব।

ধাপ ৪ঃ Schemes ঠিক করা

এখন টুলবার থেকে active scheme ক্লিক করে manage scheme ক্লিক করি। তাহলে আরেকটি উইন্ডো আসবে। + বাটন ক্লিক করে দুটি ডুপ্লিকেট scheme তৈরি করি।

Scheme কনফিগারেশন

এখন নতুন দুটি scheme এ গিয়ে edit বাটন ক্লিক করে environment অনুযায়ী build configuration ঠিক করি।

Set Build configuration

শেষ ধাপঃ বিল্ডের সময় environment ভ্যালু পাওয়া

আমাদের প্রজেক্ট কনফিগারেশন এর কাজ সব শেষ। এখন আমরা দেখবো কিভাবে কোড এর মাধ্যমে environment অনুযায়ী KEY-VALUE পাব।

একটি নতুন সুইফট (swift) ফাইল খুলি। ফাইলের নাম দেই AppEnv.swift সেইখানে নিম্নের কোডটি করিঃ

enum Environment: String {
case Dev = "dev"
case Prod = "prod"
var baseURL: String {
switch self {
case .Dev: return "http://www.dev-api.com/"
case .Prod: return "https://www.prod-api.com/"
}
}
var key: String {
switch self {
case .Dev: return "dev-key"
case .Prod: return "prod-key"
}
}
}

আমি এইখানে environment অনুযায়ী value সেট করে দিয়েছি। এই কাজটি বিভিন্ন ভাবে করা যায়। কিন্তু আমার কাছে এই পদ্ধতি সহজতর মনে হয়েছে।

এখন আমাদের জানা উচিত, কোন environment এ অ্যাপ রান হচ্ছে। যা আমরা নিচের কোড এর মাধ্যমে বের করতে পারিঃ

এই কোডের মাধ্যমে আমরা কোন enviornment এ অ্যাপ রান হচ্ছে তা detect করতে পারব। forInfoDictionaryKey: "AppEnv" এইখানে আমি info.plist - এ যে নাম দিব তা-ই দিতে হবে।

এখন আমরা viewController যে কোড টা করতে হবে তা হলঃ

var configuration = Configuration()
print(configuration.environment.baseURL)
app run with Dev environment
app run with Prod environment

এইভাবে আমরা সহজেই একাধিক environment এ সহজেই অ্যাপ বিল্ড করতে পারব।

উপসংহার

একটি প্রজেক্ট আমাকে তিনটি environment এ কাজ করতে হয়। সেইখানে অনেকগুলো 3rd-party service ব্যবহার করা হয়। যেহেতু ওই প্রজেক্টই এইভাবে সাজানো হয়নি তাই প্রত্যেকবার কোড পরিবর্তন করে কাজ করতে হত। আশাকরি সবাই উপকৃত হবেন।
ধন্যবাদ

Demo Project
https://github.com/zahedul/ios-multiple-environment

Reference:
https://cocoacasts.com/switching-environments-with-configurations

For more read:

--

--