iOS XCode: How to switch Environment with Configurations
আমার 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-এ একটি নতুন প্রজেক্ট খুলি
প্রজেক্টের একটি নাম দেই। অন্যান্য কনফিগারেশন গুলো পূরণ করি (language, team etc.)
ধাপ ২ঃ কনফিগারেশন ঠিক করা
প্রত্যেক xCode প্রজেক্ট এ দুটি default configuration থাকে, Debug এবং Release.
ধরে নিই, আমি যে প্রজেক্ট এ কাজ করব তার দুই ধরনের API-Server রয়েছে। একটি Development (dev) অপরটি Production (prod) সার্ভার।
এখন Debug কনফিগারেশন এর একটা copy তৈরি করতে হবে।
কাজের সুবিধার্থে চিত্র অনুযায়ী, `+` বাটন এ ক্লিক করে Debug এর ডুপ্লিকেশন তৈরি করে re-name করে দেই।
ধাপ ৩ঃ Info.plist - এ কনফিগার করা
Xcode এর navigation area থেকে Info.plist ফাইলটি সিলেক্ট করি। Track pad এর ডাবল ট্যাপ অথবা mouse এর right button ক্লিক করে নতুন ROW তৈরি করি (add new row)। নতুন row তে কী (key) এর নাম এবং ভ্যালু(value) দেই।
আমি এইখানে key এর নাম দিলাম AppEnv
এবং ভ্যালু হিসাবে $(Configuration)
. অ্যাপ বিল্ডের সময়ে আমারা এখান থেকে environment ভ্যালু পাব।
ধাপ ৪ঃ Schemes ঠিক করা
এখন টুলবার থেকে active scheme
ক্লিক করে manage scheme
ক্লিক করি। তাহলে আরেকটি উইন্ডো আসবে। + বাটন ক্লিক করে দুটি ডুপ্লিকেট scheme তৈরি করি।
এখন নতুন দুটি scheme এ গিয়ে edit বাটন ক্লিক করে environment অনুযায়ী 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)
এইভাবে আমরা সহজেই একাধিক 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: