সুতির প্রথম সাবমিশনের জন্য Flutter রিলিজ রেডিনেস চেকলিস্ট
এই Flutter রিলিজ রেডিনেস চেকলিস্ট ব্যবহার করে সাইনিং, ফ্লেভার, ক্র্যাশ রিপোর্টিং, পারমিশন কপি এবং স্টোর অ্যাসেটগুলো প্রস্তুত করুন যাতে প্রথম সাবমিশন শান্তিপূর্ণ এবং সম্পূর্ণ হয়।

“রিলিজ-রেডি” বলে আসলে কি বোঝায়
“রিলিজ-রেডি” মানে শুধু “অ্যাপ আমার ফোনে চলে” নয়। এর অর্থ আপনি একটি প্রোডাকশন বিল্ড তৈরি করতে পারবেন, সেটি একটি পরিচ্ছন্ন ডিভাইসে ইনস্টল করবেন, এবং স্টোরে জমা দেওয়ার সময় শেষ মুহূর্তে কোনো সমস্যা হবে না।
প্রথম সাবমিশনের ঠিক আগেই যা ভেঙে যায় সেগুলো সাধারণত বিরক্তিকর কিন্তু ব্যথাজনক: হারানো সাইনিং কী, দুর্ঘটনাক্রমে আপলোড করা ডিবাগ বিল্ড, লজ না থাকা ক্র্যাশ, সন্দেহজনক মনে হওয়া পারমিশন প্রম্পট, বা অ্যাপের সঙ্গে মিল না থাকা স্টোর অ্যাসেট (ভুল আইকন, পুরাতন স্ক্রিনশট, অনুপস্থিত প্রাইভেসি টেক্সট)।
প্রথম Flutter সাবমিশনের জন্য “রিলিজ-রেডি” চারটি ফলাফলের উপর নীচে সংক্ষেপে নির্ভর করে:
- আপনি একটি পুনরাবৃত্তিযোগ্য প্রোডাকশন বিল্ড তৈরি করতে পারেন এবং আপনি যে আর্টিফ্যাক্টটি সাবমিট করছেন তা নিশ্চিন্তে চিহ্নিত করতে পারেন।
- আপনার সাইনিং ক্রেডেনশিয়ালগুলোর মালিকানা আছে, ব্যাকআপ রয়েছে, এবং সেগুলো এক ব্যক্তির ল্যাপটপে আটকে নেই।
- যদি অ্যাপ লাইভে ক্র্যাশ করে, আপনি দ্রুত যথেষ্ট বিস্তারিত রিপোর্ট দেখবেন যাতে তা ঠিক করা যায়।
- আপনার স্টোর লিস্টিং সম্পূর্ণ: টেক্সট, আইকন, স্ক্রিনশট, এবং প্রয়োজনীয় ঘোষণাগুলো আছে।
এটি প্রথম সাবমিশনের অপরিহার্য বিষয়গুলোর উপর ফোকাস করে: সাইনিং, ফ্লেভার, ক্র্যাশ রিপোর্টিং, পারমিশন কপি ও টাইমিং, এবং স্টোর অ্যাসেট। এটি পুরো QA পরিকল্পনা, পারফরম্যান্স অডিট বা আইনি রিভিউ নয়।
কমপক্ষে কয়েকটি ফোকাসড সেশন পরিকল্পনা করুন। একজন একক ডেভেলপার সাধারণত ১–২ দিনে এটি কভার করতে পারেন। একটি টিমে, স্পষ্ট দায়িত্ব নির্ধারণ করুন (সাইনিং/বিল্ডস, ক্র্যাশ রিপোর্টিং, স্টোর লিস্টিং ও কপি) যাতে কিছুই শেষ মিনিটে পড়ে না যায়।
বিল্ড করার আগে লক করে নেওয়ার জন্য প্রি-ফ্লাইট সিদ্ধান্তসমূহ
অধিকাংশ “শেষ মুহূর্তের” রিলিজ সমস্যা শুরুতেই না নেওয়া সিদ্ধান্ত থেকেই হয়। এখন কয়েকটি বেসিক সিদ্ধান্ত লক করে নিন, তাহলে পরের সব কাজ সহজ হবে।
আইডেন্টিটির সঙ্গে শুরু করুন: ব্যবহারকারীরা যে নামটি দেখবে সেটি এবং স্টোর যে অভ্যন্তরীণ ID গুলো ব্যবহার করে (Android-এর package name, iOS-এর bundle identifier) ঠিক করে নিন। এগুলো পরে বদলে গেলে আপডেট, ডিপ লিঙ্ক এবং অ্যানালিটিক্স ইত্যাদি ভেঙে যেতে পারে। রিলিজ ভার্সন কিভাবে নির্ধারণ করবেন তাও ঠিক করে নিন, যাতে প্রতিটি বিল্ডের একটি স্পষ্ট নাম্বার থাকে এবং কখনো আন্দাজ করতে না হয় কোন ভার্সন লাইভ।
তারপর প্ল্যাটফর্ম সীমা নির্ধারণ করুন: দিন একে Android, iOS, বা দুইটিই হবে কি না, এবং ন্যূনতম OS ভার্সনগুলো কি হবে যা আপনার ব্যবহারকারীদের সাথে মিলবে। পরে ন্যূনতম উন্নীত করলে ডিজাইন পরিবর্তন বা এমন ডিভাইস বাদ পড়তে পারে যা আপনি ধরে নিয়েছিলেন সাপোর্ট করছেন।
এই সিদ্ধান্তগুলো কোথাও দল সহজে খুঁজে পাবে এমনভাবে লিখে রাখুন:
- অ্যাপ নাম, package/bundle ID, এবং একটি সহজ ভার্সনিং রুল
- সাপোর্টেড প্ল্যাটফর্ম এবং ন্যূনতম OS ভার্সন
- এনভায়রনমেন্টস (dev, staging, production) এবং তাদের মধ্যে কী ভিন্ন
- কে চূড়ান্ত “ship” বা “hold” কলের মালিক
- স্টোর অ্যাকাউন্ট অ্যাক্সেস: লগইন, রোল এবং 2FA পুনরুদ্ধার পদ্ধতি
সবশেষে, নিশ্চিত করুন আপনার স্টোর অ্যাকাউন্টগুলো আছে এবং আপনি পাবলিশ করতে পারবেন। অ্যাকাউন্ট অনুমোদনের জন্য অপেক্ষা, অনুপস্থিত ট্যাক্স ফর্ম বা আপলোড অনুমতি না থাকা লঞ্চ আটকে দেয়। আপনি যদি কোনো টুল যেমন Koder.ai দিয়ে অ্যাপ জেনারেট করেন বা হাতে কোড করেন, এই সিদ্ধান্তগুলো তখনও প্রযোজ্য।
অ্যাপ সাইনিং: কী, মালিকানা, এবং নিরাপদ সংরক্ষণ
অ্যাপ সাইনিং হলো প্রমাণ যে একটি অ্যাপ আপডেটে আসলেই আপনার পক্ষ থেকেই এসেছে। যদি সাইনিং ভুলভাবে কনফিগার করা থাকে, স্টোর আপলোড রিজেক্ট করতে পারে, বা ভবিষ্যতে আপডেট পাঠানোই অসম্ভব হতে পারে।
Android-এ, সাইনিং সাধারণত একটি keystore ফাইলে (পাসওয়ার্ডসহ) সংরক্ষিত আপলোড কী বোঝায়। iOS-এ, এটি certificates এবং provisioning profiles যা Apple Developer অ্যাকাউন্টের সাথে জড়িত। যদিও আপনি Koder.ai দিয়ে বিল্ড করে সোর্স এক্সপোর্ট করেন, প্রথম সাবমিশনের আগে স্টোর অ্যাকাউন্ট এবং সাইনিং অ্যাসেটের পরিষ্কার মালিকানা থাকা আবশ্যক।
মালিকানা ও অ্যাক্সেস নির্ধারণ করুন
প্রতিটি প্ল্যাটফর্মের জন্য একটি system-of-record মালিক নির্ধারণ করুন, সম্ভব হলে কোম্পানির অ্যাকাউন্টে। অ্যাক্সেস নিয়ম এমনভাবে সেট করুন যাতে আপনি একজন কম্পিউটার বা একজন ব্যক্তির উপর নির্ভর না করে থাকেন।
সংক্ষিপ্ত এক রেকর্ড রাখুন যা উত্তর দেয়:
- কোন অ্যাকাউন্টগুলো সাইনিং কী ধারণ করে (Google Play, Apple Developer)
- keystore এবং iOS সাইনিং ফাইলগুলো কোথায় আছে (ভল্ট, এনক্রিপ্টেড স্টোরেজ)
- কে রিলিজ কাটতে পারে এবং কে ক্রেডেনশিয়াল রোটেট করতে পারে
- কিভাবে অ্যাক্সেস পুনরুদ্ধার করবেন (2FA রিকভারি কোড, অ্যাডমিন রোল)
ব্যাকআপ এবং “হারানো কী” পরিকল্পনা
একটি হারানো Android কী একই প্যাকেজে ভবিষ্যত আপডেট ব্লক করতে পারে। আলাদা স্থানে এনক্রিপ্টেড ব্যাকআপ রাখুন এবং রিস্টোর টেস্ট করুন। iOS-এ অ্যাক্সেস হারালে অ্যাকাউন্ট রিকভারি কষ্টসাধ্য হয়ে দাঁড়াতে পারে, তাই একাধিক বিশ্বস্ত অ্যাডমিন রাখুন এবং তাদের ডকুমেন্ট করুন।
পয়েন্টটি যাচাই করুন একটি পরিচ্ছন্ন মেশিনে (ফ্রেশ চেকআউট, নতুন CI রানার, বা টিমমেটের ল্যাপটপ)। যদি এটি শুধুমাত্র এক কম্পিউটারে কাজ করে, তবে সেটি রেডি নয়।
বিল্ড ফ্লেভারস: dev ও production আলাদা রাখুন
ফ্লেভারগুলো নিশ্চিত করে যে “আমার ফোনে চলে” থেকে “আমরা টেস্ট সার্ভার শিপ করে দিয়েছি” হওয়া রোধ পাওয়া যায়। সরল কথায়, একটি ফ্লেভার হলো একটি নামকরণ করা বিল্ড যা বিভিন্ন কনফিগ ব্যবহার করে যাতে আপনাকে প্রতিবার রিলিজের আগে ফাইলগুলো এডিট করতে না হয়।
অধিকাংশ দল দুইটি ফ্লেভার দিয়ে শুরু করা উচিত: dev (টেস্টিং-এর জন্য) এবং prod (যা আপনি সাবমিট করবেন)। যদি আপনার টিম “staging” বলে, সেটি ব্যবহার করুন। বিভ্রান্তিকর নামগুলো ভুল বিল্ড শেয়ার বা আপলোডের কারণ হয়।
ফ্লেভারের মধ্যে কি কি ভিন্ন হবে সেটা লক করুন। সবচেয়ে সাধারণ পার্থক্যগুলো হল অ্যাপ আইডেন্টিটি (নাম ও bundle ID), আইকন, API endpoints, ফিচার ফ্ল্যাগ, analytics/crash reporting সেটিং, এবং লগিং লেভেল।
সংবেদনশীল ভ্যালুগুলো রিপোতে না রাখাই ভালো। environment ফাইল, CI সিক্রেট, বা বিল্ড-টাইম ভ্যারিয়েবল ব্যবহার করুন যাতে কী কমিটে না পড়ে।
আপনি শেষ বলার আগেই প্রতিটি ফ্লেভার বিল্ড করুন, রিলিজ বিল্ডসহ। অনুপস্থিত কনফিগ এখানে ধরা পড়ে, লঞ্চ ডে-তে নয়।
ক্র্যাশ রিপোর্টিং এবং রিলিজ লগিং
আপনি একটি পরিষ্কার বিল্ড শিপ করলেও বাস্তব ডিভাইসের ডিভাইস, নেটওয়ার্ক সমস্যা, ও এজ-কেস ফ্লো থেকে সমস্যা পেতে পারেন। ক্র্যাশ রিপোর্টিং সেইসব অপ্রত্যাশিত বিষয়গুলোকে কার্যকর কাজের তালিকায় পরিণত করে।
একটি ক্র্যাশ রিপোর্টিং টুল বেছে নিন এবং আগে থেকেই সেটআপ করুন। ব্র্যান্ড ততটা গুরুত্বপূর্ণ নয় যতটা প্রতি রিলিজে দরকারী রিপোর্ট আসা।
রিলিজের অংশ হিসেবে সিম্বল ও মেপিং আপলোড করা
অনেক “পুনরুৎপাদন করা যায় না” পরিস্থিতি মিসিং সিম্বল থেকেই হয়। রিলিজ স্টেপ হিসাবে আপলোড করুন:
- iOS dSYM ফাইল (স্ট্যাক ট্রেস পড়ার যোগ্য করার জন্য)
- Android obfuscation mapping (যদি আপনি shrink/obfuscate করেন)
- আপলোডের সাথে জুড়ে দেওয়া সঠিক বিল্ড নম্বর ও git commit (বা বিল্ড ট্যাগ)
যদি এটি ম্যানুয়াল হয়, ব্যস্ত সপ্তাহে এটি বাদ পড়ে যাবে।
সমস্যা সমাধানে সাহায্য করবে এমন লগنگ রাখুন
দিন একে আপনি কি চান তা নির্ধারণ করুন: অ্যাপ ভার্শন/বিল্ড, ডিভাইস মডেল, OS ভার্শন, লোকেল, এবং শেষ স্ক্রিন বা অ্যাকশন। যদি আপনার অ্যাকাউন্ট থাকে, স্থায়ী অ্যানোনিমাস ইউজার ID এবং “logged in/logged out” ফ্ল্যাগ যোগ করুন। লগে ব্যক্তিগত ডেটা রাখা এড়ান।
নন-ফ্যাটাল এররগুলোও ক্যাপচার করুন। Flutter-এ অনেক সমস্যা exception হিসেবে দেখা যায় যা অ্যাপ ক্র্যাশ না করলেও সমস্যা সৃষ্টি করে (parse error, timeout, অনাকাঙ্ক্ষিত null)। এগুলোকে নন-ফ্যাটাল ইভেন্ট হিসেবে পাঠান একটি ছোট মেসেজ এবং কয়েকটি কী-ভ্যালু ফিল্ডসহ।
রিলিজের আগে এটি টেস্ট করুন: একটি স্টেজিং বিল্ড তৈরি করুন, একটি জোর করে ক্র্যাশ ট্রিগার করুন (ডিবাগ মেনু বা সিক্রেট জেসচারের পেছনে), এবং নিশ্চিত করুন আপনি একটি পড়ার মত স্ট্যাক ট্রেস দেখতে পাচ্ছেন সঠিক ভার্সন ও কনটেক্সট সহ।
পারমিশন: ব্যবহারকারী-বান্ধব কপি এবং সঠিক টাইমিং
পারমিশনগুলো প্রথম লঞ্চে বিশ্বাস হারানোর দ্রুত উপায়। রিলিজের আগে প্রতিটি পারমিশন তালিকাভুক্ত করুন—কোন ফিচার এটি চায় এবং ব্যবহারকারী কী সুবিধা পাবে। যদি এক বাক্যে বোঝাতে না পারেন, সম্ভবত আপনাকে এটি চাইতে না চিন্তা করা উচিত।
কপি সরল এবং নির্দিষ্ট রাখুন। “We need access to your photos” তুলনায় “Allow photos so you can attach a receipt to your expense” বেশি কার্যকর। “storage” এর মতো প্রযুক্তিগত শব্দ ব্যবহার করলে তা মুহূর্তেই ব্যাখ্যা করুন।
শুধুমাত্র সেই মুহূর্তে জিজ্ঞেস করুন যখন ব্যবহারকারী সংশ্লিষ্ট অ্যাকশনটি করে। স্টার্টে Photos পারমিশন চাওয়া যাবে না। ব্যবহারকারী যখন “Add photo” ট্যাপ করবে তখন একটি ছোট প্রি-পারমিশন স্ক্রিন দেখান যে কেন দরকার।
যদি ব্যবহারকারী না বলে, অ্যাপটি এখনও ব্যবহারযোগ্য হওয়া উচিত। আগেভাগেই ফ্যালব্যাক পরিকল্পনা করুন: ফিচার দৃশ্যমান রাখুন, কি ব্লক হচ্ছে তা ব্যাখ্যা করুন, সম্ভব হলে বিকল্প দিন, এবং প্রগ্রেস সেভ রাখুন যাতে তারা কাজ হারায় না। যদি তারা “Don’t ask again” নির্বাচন করে, সেটিংসে গাইড করুন কিন্তু জবরদস্তি করবেন না।
প্ল্যাটফর্ম-নির্দিষ্ট টেক্সট দ্বিগুণ পরীক্ষা করুন। iOS Info.plist-এ ক্লিয়ার ইউসেজ ডেসক্রিপশন দরকার। Android ম্যানিফেস্ট এ সঠিক এন্ট্রিজ দরকার এবং অনบาง ক্ষেত্রে ইন-অ্যাপ সংক্ষিপ্ত ব্যাখ্যা দরকার। অনুপস্থিত বা অস্পষ্ট টেক্সট রিভিউ দেরি বা ব্যবহারকারী পতন ঘটাতে পারে।
একটি বাস্তব রিলিজ টেস্টিং পাস (পূর্ণ টেস্ট প্ল্যান নয়)
এটি একটি হালকা পাস যা কেবল রিয়েল রিলিজ বিল্ডে যে সমস্যা দেখা দেয় তা ধরতে সাহায্য করবে। এক ঘন্টারও কমে চালানো যায় এমনভাবে রাখুন।
একটি সহজ স্ক্রিপ্ট লিখুন যা যে কেউ অনুসরণ করতে পারে, এমনকি ডেভেলপার টুল ছাড়াই। নিয়ম: ব্যবহারকারীরা কী করে তা পরীক্ষা করুন, ডেভেলপার কী দেখে তা নয়।
দ্রুত রিলিজ QA স্ক্রিপ্ট
কমপক্ষে একটি ছোট ফোন ও একটি বড় ডিভাইসে (এবং সম্ভব হলে একটি পুরনো OS ভার্সন):
- রিলিজ বিল্ড ইনস্টল করুন (ডিবাগ নয়) এবং নিশ্চিত করুন এটি স্টোর অ্যাপের মত আচরণ করে (কোন ডিবাগ ব্যানার, ডেভ মেনু নেই)।
- অনবোর্ডিং ও লগইন নতুনভাবে সম্পন্ন করুন (পাসওয়ার্ড রিসেট বা ম্যাজিক লিংক থাকলে সেটিও টেস্ট করুন)।
- আপনার সবচেয়ে গুরুত্বপূর্ণ “মানি” ফ্লো ট্রিগার করুন (সাবস্ক্রিপশন, ইন-অ্যাপ পারচেজ, চেকআউট বা পেওয়াল) বাস্তব টেস্ট অ্যাকাউন্ট দিয়ে।
- নোটিফিকেশন এন্ড-টু-এন্ড পরীক্ষা করুন: পারমিশন প্রম্পট, বার্তা গ্রহণ, এবং ট্যাপ করলে সঠিক স্ক্রিন খোলে কি না।
- অফলাইন ও দুর্বল নেটওয়ার্ক টেস্ট করুন: অ্যাপটা বিমান মোডে খুলে দেখুন, তারপর কানেকশন ফিরে এলে রিকভারি কিভাবে হচ্ছে।
রানের পরে, ফোর্স-ক্লোজ ও পুনরায় চালু করে নিশ্চিত করুন অ্যাপ পরিষ্কারভাবে শুরু হয় এবং ওয়ার্ম স্টেটের উপর নির্ভর করে না।
কিছু ব্যর্থ হলে, নির্দিষ্ট স্ক্রিন, শেষ অ্যাকশন, এবং এটি কি শুধুমাত্র একটি ডিভাইস সাইজে হচ্ছে তা নোট করুন—এটি প্রায়ই দ্রুত ফিক্সের জন্য যথেষ্ট তথ্য।
স্টোর লিস্টিং অ্যাসেট: প্রয়োজন হওয়ার আগে এগুলো প্রস্তুত করুন
অনেক লঞ্চ স্ট্রেস কোড নয়, স্টোর পেইজ থেকে আসে। লিস্টিংকে রিলিজ কাজের অংশ হিসেবে বিবেচনা করুন এবং শেষ মুহূর্তের ডিজাইন অনুরোধ, অনুপস্থিত প্রাইভেসি উত্তর, এবং স্ক্রিনশট ঝামেলা এড়াতে পারবেন।
যা প্রায় নিশ্চিতভাবে লাগবে তা সংগ্রহ করুন: অ্যাপ আইকন, স্ক্রিনশট, একটি সংক্ষিপ্ত সাবটাইটেল, একটি দীর্ঘ বর্ণনা, এবং প্ল্যাটফর্ম-নির্দিষ্ট গ্রাফিক্স। প্রোমো ভিডিও ঐচ্ছিক—শুধুমাত্র তখনই উপকারী যখন আপনি তা আপডেট করে রাখতে পারবেন।
স্ক্রিনশটের জন্য ডিভাইস সাইজ আগে থেকেই ঠিক করে রাখুন এবং সেটাই বজায় রাখুন। একটি ধারাবাহিক অর্ডার রাখুন (onboarding, core screen, মূল ফিচার, settings, upgrade) যাতে আপডেটগুলো হঠাৎ করে ঝামেলার কারণ না হয়।
বর্ণনা মানুষের মতো করে লিখুন: একটি পরিষ্কার বাক্য বলুন অ্যাপটি কি করে, তারপর কয়েকটি ছোট সুবিধা লাইন, এবং যদি সাবস্ক্রিপশন বা অ্যাকাউন্ট থাকে তবে সরলভাবে তা উল্লেখ করুন। যা আপনি সাপোর্ট করতে পারবেন না তা প্রতিশ্রুতি দিবেন না।
এছাড়াও এখনই আপনার প্রাইভেসি ও ডেটা ব্যবহার সংক্রান্ত উত্তরগুলো জোগাড় করুন। আপনাকে ট্র্যাকিং, সংগ্রহকৃত ডেটা টাইপ, এবং পারমিশনের কারণে কি করা হচ্ছে তা জিজ্ঞাসা করা হবে। যদি আপনার অ্যাপ লোকেশন, কনট্যাক্টস বা ফটো চায়, সরল ভাষায় কেন তা লাগে তা ব্যাখ্যা করুন।
যদি অ্যাসেটগুলো সংগঠিত রাখেন, আপডেট রুটিন হয়ে ওঠে। একটি সহজ স্ট্রাকচার যথেষ্ট: আইকন, ডিভাইস টাইপ অনুযায়ী স্ক্রিনশট, কপি, প্রাইভেসি নোট, এবং রিলিজ নোট।
ড্রাই-রান সাবমিশন করুন যাতে কোন আচমকা না হয়
একটি ড্রাই-রান হচ্ছে স্টোর সাবমিশন ফ্লো সম্পূর্ণভাবে করা, কিন্তু Publish বোতাম চাপার আগে থেমে যাওয়া। এটি অনুমানগুলোকে বাস্তব প্রশ্নে পরিণত করে।
আপনি যে বিল্ডটি সাবমিট করতে ইচ্ছুক সেটি বেছে নিন (অবশ্য সবসময়.Publish করবেন না)। আপলোড করুন, ফর্মগুলো পূরণ করুন, এবং সবকিছু ড্রাফট হিসেবে সেভ করুন। আপনি চাইবেন মিসিং ইনফো সময় থাকার অবস্থায় পেয়ে যান।
যাচাই করুন:
- ভার্সন ও বিল্ড নম্বর প্রত্যাশিত সাথে মেলে এবং রিলিজ নোট প্রস্তুত আছে।
- কমপ্লায়েন্স প্রশ্নগুলো ধারাবাহিকভাবে উত্তর করা আছে (ডেটা সংগ্রহ, বিজ্ঞাপন, এনক্রিপশন, লগইন, সংবেদনশীল পারমিশন)।
- সমর্থিত দেশ, মূল্য নির্ধারণ, এবং এজ রেটিং সঠিক।
- কন্টাক্ট ডিটেইলস প্রস্তুত: সাপোর্ট ইমেল, প্রাইভেসি পলিসির অবস্থান, এবং কোনো রিভিউ নোট।
- রিভিউ ইনফো সম্পূর্ণ: ডেমো অ্যাকাউন্ট (যদি দরকার) এবং মূল ফিচারে পৌঁছানোর স্পষ্ট ধাপ।
“যদি প্রথম রিলিজ খারাপ থাকে” কী করবেন তাও পরিকল্পনা করুন। কিভাবে রোলব্যাক করবেন (পুরোনো সাইন করা আর্টিফ্যাক্ট রাখুন), কিভাবে হটফিক্স পাঠাবেন, এবং কোন ঘটনায় রোলআউট বন্ধ করবেন (ক্র্যাশ spike, লগইন ব্যর্থতা) তা নির্ধারণ করুন।
প্রারম্ভিক ফিডব্যাক সংগ্রহের পরিকল্পনাও করুন প্রথম ৪৮ ঘণ্টার জন্য: ছোট একটি গ্রুপ চ্যানেল, একটি মনিটর করা সাপোর্ট ইনবক্স, এবং ইন-অ্যাপ “Send feedback” অপশন সাধারণত স্পষ্ট সমস্যাগুলো একস্টার রিভিউ হওয়ার আগে ধরতে পারে।
সাধারণ ফাঁদগুলো যা লঞ্চের ঠিক আগেই সময় নষ্ট করে
বেশিরভাগ দেরি হয় কারণ আপনি যে বিল্ড টেস্ট করেছেন সেটিই শিপ করা হয় না। একটি ডিবাগ বা প্রোফাইল বিল্ড সুন্দর দেখাতে পারে, কিন্তু রিলিজ বিল্ড রিয়েল ডিভাইসে minification, ভিন্ন কনফিগ ভ্যালু, বা অনুপস্থিত runtime পারমিশনের কারণে ব্যর্থ হতে পারে।
আরেকটি সময় নষ্ট করা বিষয় হলো ডেভেলপমেন্ট ও প্রোডাকশন সেটিংস মিশে যাওয়া: স্টেজিং API URL শিপ হয়ে যাওয়া, ভুল analytics কী, বা টেস্ট পেমেন্ট সেটিংস পাঠিয়ে দেওয়া। প্রোডাকশনকে আলাদা এনভায়রনমেন্ট হিসেবে ট্রিট করুন এবং নির্দিষ্ট রিলিজ আর্টিফ্যাক্টে যাচাই করুন।
এই ফাঁদগুলো দলগুলোকে বারবার পুড়িয়ে দেয়:
- আপনি যে নির্ভরযোগ্য আর্টিফ্যাক্ট আপলোড করবেন সেটাই না টেস্ট করা।
- কনফিগ স্পষ্টভাবে আলাদা না থাকায় ভুল endpoints বা ফিচার ফ্ল্যাগ শিপ করা।
- রিভিউ রিজেকশন কারণ পারমিশন প্রম্পট অস্পষ্ট বা অনুপস্থিত।
- সিম্বল/ম্যাপিং আপলোড না থাকায় ব্যবহারযোগ্য নয় এমন ক্র্যাশ রিপোর্ট।
- সাইনিং কী এবং একমাত্র কাজ করা সেটআপ এক ব্যক্তির ল্যাপটপে থাকা।
একটি শুক্রবার আপলোড কল্পনা করুন: রিভিউয়ার অ্যাপ খুলে একটি ফিচার ট্যাপ করে যা অ্যাক্সেস চায়, এবং টেক্সট অস্পষ্ট। আপনি কপি ঠিক করেন, কিন্তু সাইনিং কী ওই সহকর্মীর মেশিনে আছে যিনি অফলাইনে আছেন। এটিই দুইটি টাকসেভ করা দিন।
দ্রুত রিলিজ রেডিনেস চেকলিস্ট (প্রিন্ট করার উপযোগী)
প্রথম স্টোর বিল্ড কাটার একদিন আগে এটি ব্যবহার করুন। এটি উদ্দেশ্যগতভাবে সংক্ষিপ্ত। যদি কোনো আইটেম “হয়তো” হয়, তাহলে আগে থামুন এবং সেটি ঠিক করুন।
- সাইনিং পরিচ্ছন্ন মেশিনে কাজ করছে। একটি ফ্রেশ চেকআউট একটি সাইনড রিলিজ বিল্ড তৈরি করতে পারে খোঁজাখুঁজি ছাড়াই। কী/সার্টিফিকেট ব্যাকআপ আছে, অ্যাক্সেস সীমিত, এবং মালিকানা স্পষ্ট।
- সব বিল্ড ফ্লেভার সফল। Dev, staging (যদি ব্যবহার করি), এবং production ম্যানুয়াল টুইক ছাড়াই বিল্ড হয়। প্রোডাকশন কনফিগ নিশ্চিত (bundle id/applicationId, অ্যাপ নাম, আইকন, API endpoints, analytics কী)।
- ক্র্যাশ রিপোর্টিং রিলিজ বিল্ডে কাজ করছে। রিলিজ বিল্ড থেকে একটি টেস্ট ক্র্যাশ বা ইভেন্ট আসে এবং সিম্বল/ম্যাপিং আছে যাতে স্ট্যাক ট্রেস পড়া যায়।
- পারমিশন justified এবং পড়া যায়। প্রতিটি পারমিশনের জন্য পরিষ্কার, মানবিক কপি আছে এবং ব্যবহারকারী অস্বীকার করলে অ্যাপ সীমিতভাবে কাজ করে। টাইমিং কনটেক্সট-এ আছে।
- স্টোর লিস্টিং অ্যাসেট প্রস্তুত। আইকন, স্ক্রিনশট, প্রয়োজনীয় গ্রাফিক্স, সংক্ষিপ্ত/দীর্ঘ বর্ণনা, সাপোর্ট ইমেল, প্রাইভেসি লেবেল, এবং এজ রেটিং তথ্য খসড়া ও রিভিউ করা হয়েছে।
আপনি যদি এমন একটি প্ল্যাটফর্ম ব্যবহার করে বিল্ড করেন যা সোর্স কোড এক্সপোর্ট করতে পারে, যেমন Koder.ai (koder.ai), তাহলে একটি আরেকটি চেক যোগ করুন: নিশ্চিত করুন এক্সপোর্ট করা প্রোজেক্টটি সেই একই সাইন করা রিলিজ বিল্ড তৈরি করে যা আপনি আপলোড করতে চান।
উদাহরণ: প্রথম সাবমিশন সপ্তাহ চাপ ছাড়া
একটি ছোট তিন সদস্যের টিম তাদের প্রথম Flutter অ্যাপ স্টোরে পাঠাচ্ছে: এক জন ডেভেলপার, এক জন ডিজাইনার, এবং অর্ধেক সময়ের একটি PM। তারা প্রথম সাবমিশনকে অনুশীলনের মত আচরণ করে।
সোমবার, ডেভেলপার রিলিজ বিল্ড জেনারেট করে এবং দেখতে পান সাইনিং কী একটি ল্যাপটপে আছে যা মুছে ফেলা হবে। তারা সেই দিনেই ঠিক করে: কীটি একটি শেয়ার্ড, অ্যাক্সেস-কন্ট্রোলড ভল্টে সরায়, মালিকানা ডকুমেন্ট করে, এবং CI মেশিন সাইন করতে পারে তা নিশ্চিত করে।
মঙ্গলবার, PM প্রতিটি পারমিশন প্রম্পট জোরে পড়ে। একটি উল্লেখযোগ্য: ফটো পারমিশন টেক্সটে “required” লেখা আছে, অথচ অ্যাপ শুধুমাত্র ঐচ্ছিক প্রোফাইল ছবি জন্য এটি চায়। তারা কপি পরিবর্তন করে যাতে সুবিধা ব্যাখ্যা করে এবং পারমিশনটি ব্যবহারকারী “Add photo” ট্যাপ করার মুহূর্তে করে।
বৃহস্পতিবার, তারা একটি পূর্ণ ড্রাই-রান সাবমিশন করে চূড়ান্ত স্ক্রিনশট, রিলিজ নোট, এবং প্রোডাকশন বিল্ড সহ। স্টোর বর্ণনা ও ইন-অ্যাপ সাবস্ক্রিপশন লেবেল মধ্যে একটি অসঙ্গতি ফ্ল্যাগ করে। ড্রাই-রান হওয়ায় তারা লঞ্চের আগে শব্দ পরিবর্তন করে পুনরায় সাবমিট করে।
পরবর্তী বার তাদের জন্য একটি সহজ টাইমলাইন রখে দেয়া হয়:
- Mon: ফিচার ফ্রিজ, সাইনিং ও প্রোডাকশন বিল্ড যাচাই
- Tue: পারমিশন ও ইন-অ্যাপ কপি রিভিউ
- Wed: বাস্তব ডিভাইসে স্মোক টেস্ট, analytics ও ক্র্যাশ রিপোর্টিং নিশ্চিত
- Thu: ড্রাই-রান স্টোর সাবমিশন
- Fri: রিভিউয়ের জন্য সাবমিট এবং ফিক্সের জন্য বাফার রাখা
পরবর্তী পদক্ষেপ: আপনার পরবর্তী রিলিজকে প্রথমের চেয়ে সহজ করুন
প্রথম লঞ্চ আপনাকে শেখায় “রেডি” আসলে কেমন লাগে। তা সতেজ থাকাকালীন ধারণ করে রাখুন।
স্পষ্ট মালিক নির্ধারণ করুন। ছোট টিমেও “প্রত্যেকে” সাধারণত মানে “কেউই নয়”, এবং মূল টাস্কগুলো ফসকে যায়:
- সাইনিং ও কী স্টোরেজ
- চূড়ান্ত ডিভাইস চেক ও গো/নো-গো
- স্টোর লিস্টিং অ্যাসেট ও কপি
- সাবমিশন ধাপ ও রিভিউয়ার ফলো-আপ
আপনি যা করলেন তা একটি পুনরাবৃত্ত যোগ্য চেকলিস্ট ও রিলিজ নোট টেমপ্লেটে পরিণত করুন: আপনি কোন কমান্ড চালিয়েছিলেন, কোন অনুমোদন প্রয়োজন ছিল, এবং কোন ফাইল আপলোড করেছিলেন। গটচাসগুলোও যোগ করুন—কোন ফ্লেভার প্রোডাকশন, এবং কোন পারমিশন টেক্সট রিভিউআর্থে প্রশ্ন করা হয়েছিল।
এক সপ্তাহের মধ্যে একটি ২০ মিনিটের পোস্ট-রিলিজ রিভিউ নির্ধারণ করুন। ফোকাস রাখুন ফিক্সে, দোষারোপ নয়:
- সাবমিশন বা রিভিউতে কি আমাদের আশ্চর্য করেছে?
- কোন কাজ প্রত্যাশার চাইতে বেশি সময় নিয়েছিল, এবং কেন?
- পরবর্তীতে আমরা কি আগে থেকেই প্রস্তুত করতে পারি (অ্যাসেট, কপি, সাপোর্ট ইনবক্স)?
আপনি যদি Koder.ai দিয়ে তৈরি করেন, Planning Mode আপনাকে রিলিজ টাস্কগুলো এক জায়গায় ট্র্যাক করতে সাহায্য করতে পারে, এবং snapshots আপনাকে শেষ মুহূর্তের পরিবর্তনের আগে একটি জানাশোনা-ভাল স্টেট দেয়।
সাধারণ প্রশ্ন
প্রথম Flutter অ্যাপ সাবমিশনের জন্য "release-ready" মানে কি?
Release-ready বলতে বোঝায় আপনি একটি সাইন করা প্রোডাকশন (release) বিল্ড তৈরি করতে পারেন যা একটি পরিচ্ছন্ন ডিভাইসে ইনস্টল হয় এবং শেষমুহূর্তের সমস্যার ছাড়াই সাবমিট করা যায়।
একটি ব্যবহারিক বেসলাইন:
- আপনি নির্ভরযোগ্যভাবে সেই একই আর্টিফ্যাক্ট তৈরি করতে পারেন যা আপলোড করবেন।
- সাইনিং কী/সার্টিফিকেট আপনার কাছে আছে, ব্যাকআপ করা আছে এবং পুনরুদ্ধারযোগ্য।
- ক্র্যাশ রিপোর্টিং সেই বিল্ডের জন্য পাঠ্য ট্রেইস দেয়।
- স্টোর লিস্টিং তথ্য ও প্রয়োজনীয় ঘোষণাগুলো সম্পন্ন আছে।
কিভাবে নিশ্চিত করব যে আমি যে বিল্ড পরীক্ষা করছি সেটাই বাস্তবে আমি সাবমিট করব?
একটি release বিল্ড তৈরি করুন, তারপর যা কখনো আপনার অ্যাপ ইনস্টল করা নেই এমন একটি ডিভাইসে তা ইনস্টল করুন।
চেক করুন:
- কোন ডিবাগ ব্যানার বা ডেভ-ওনলি মেনু নেই।
- অ্যাপ ফোর্স-ক্লোজের পর সঠিকভাবে শুরু হয়।
- রিয়েল নেটওয়ার্ক কন্ডিশনে মূল ফ্লো কাজ করে।
যদি আপনি শুধুমাত্র debug/profile টেস্ট করে থাকেন, ধরে নিন আপনি আসলেই যা শিপ করছেন তা পরীক্ষা করেননি।
Android সাইনিং কী কীভাবে নিরাপদভাবে হ্যান্ডেল করব যাতে আমরা আপডেট হারাই না?
সাইনিং অ্যাসেটকে প্রোডাকশন ক্রেডেনশিয়াল হিসেবে আচরণ করুন:
- একটি মালিক নির্ধারণ করুন (সম্ভব হলে কোম্পানীর অ্যাকাউন্ট, এক ব্যক্তির নয়)।
- Android keystore ও পাসওয়ার্ড এনক্রিপ্টেড স্টোরেজে সীমিত অ্যাক্সেসে রাখুন।
- কমপক্ষে একটি টেস্ট করা ব্যাকআপ আলাদা স্থানে রাখুন।
যদি কীটি শুধুমাত্র এক ল্যাপটপে থাকে, আপনি আপডেটে ব্লক হয়ে যাবেন।
iOS সাইনিং সেটআপে কী করা উচিত যাতে রিলিজ দিন আটকে না যায়?
Apple Developer অ্যাকাউন্টের সাথে সাইনিং জড়িত রাখুন এবং পরিষ্কার অ্যাডমিন অ্যাক্সেস নিশ্চিত করুন।
শুরুতেই করুন:
- কমপক্ষে দুইজন বিশ্বাসযোগ্য অ্যাডমিনকে সার্টিফিকেট/প্রোফাইল পরিচালনার অনুমতি দিন।
- যে কেউ রিলিজ করতে পারে এবং 2FA পুনরুদ্ধার কিভাবে কাজ করে তা ডকুমেন্ট করুন।
- একটি পরিচ্ছন্ন মেশিন/CI থেকে সাইন করা রিলিজ তৈরি করে যাচাই করুন যেন এটি মাত্র "আমার Mac-এ কাজ করে" না হয়।
আমাদের কি সত্যিই বিল্ড ফ্লেভার দরকার, এবং dev ও prod-এর মধ্যে কী পার্থক্য থাকা উচিত?
দুইটি ফ্লেভার দিয়ে শুরু করুন: dev এবং prod।
সাধারণত নিম্নলিখিত পার্থক্য থাকবে:
- অ্যাপ নাম ও bundle/package ID
- API endpoints ও ফিচার ফ্ল্যাগ
- আইকন (ঐচ্ছিক কিন্তু সহায়ক)
- Analytics/crash reporting কনফিগ
- লগিং লেভেল
লক্ষ্য হলো রিলিজের আগে ম্যানুয়ালি ফাইল সম্পাদনা করা এড়ানো।
কীভাবে সংবেদনশীল কনফিগ (API কী, endpoints) রিপো থেকে দূরে রাখবো তবে এখনও নির্ভরযোগ্যভাবে বিল্ড করব?
সিক্রেট ইনজেকশনের ব্যবহার করুন না যে কনফিগ রিপোতে রাখবেন।
ভালো অভ্যাস:
- API কীগুলো রিপোতে রাখবেন না।
- CI সিক্রেট, ইনভায়রনমেন্ট ফাইল (যা কমিট করা নেই) বা বিল্ড-টাইম ভ্যারিয়েবল ব্যবহার করুন।
- যদি প্রোডাকশন সিক্রেট মিসিং থাকে তাহলে বিল্ড ফেল করান (চুপচাপ dev মান ব্যবহার না করাই ভালো)।
এটি স্টেজিং এন্ডপয়েন্ট বা টেস্ট পেমেন্ট সেটিংস ভুল করে শিপ হওয়া আটকায়।
লঞ্চের পর যা আসল সাহায্য করবে এমন ন্যূনতম ক্র্যাশ রিপোর্টিং সেটআপটি কি?
একটি ক্র্যাশ রিপোর্টিং টুল বেছে নিন এবং শুরুতেই সেটি যুক্ত করুন।
ন্যূনতম সেটআপ:
- প্রতিটি রিপোর্টে অ্যাপ ভার্শন/বিল্ড এবং ডিভাইস/OS জড়িত থাকুক।
- iOS এর dSYM ফাইল আপলোড করুন যাতে স্ট্যাক ট্রেস পড়ার মতো হয়।
- Android এ আপনি যদি shrink/obfuscate করেন তবে mapping আপলোড করুন।
তারপর একটি স্টেজিং/রিলিজ বিল্ডে জোর করে ক্র্যাশ ট্রিগার করে নিশ্চিত করুন রিপোর্ট ব্যবহারযোগ্য দেখায়।
কোথায় পারমিশন চাইবো এবং প্রথম লঞ্চে ব্যবহারকারীদের ভয় কিভাবে প্রতিরোধ করব?
শুধুমাত্র যখন ব্যবহারকারী সংশ্লিষ্ট অ্যাকশন করে তখনই পারমিশন চাইতে হবে।
ভাল প্যাটার্ন:
- ছোট একটি প্রি-পারমিশন ব্যাখ্যা দেখান ("Allow photos so you can attach a receipt")।
- ব্যবহারকারী যখন বাস্তবে টেপ করবে তখন সিস্টেম পারমিশন প্রম্পট দেখান।
- প্রত্যাখ্যান করলে অ্যাপটি এখনও ব্যবহারযোগ্য রাখুন এবং সীমাবদ্ধতা ব্যাখ্যা করুন।
অস্পষ্ট প্রম্পট ও খুব আগেই পারমিশন চাওয়া ব্যবহারকারীর আস্থা নষ্ট করে এবং রিভিউ দেরি করতে পারে।
এক ঘন্টারও কম সময়ে আমরা কি ধরনের প্র্যাকটিক্যাল রিলিজ টেস্টিং পাস করতে পারি?
একটি দ্রুত “রিলিজ বিল্ড স্মোক টেস্ট” চালান যা যে কেউ অনুসরণ করতে পারে:
- একটি পরিচ্ছন্ন ডিভাইসে সাইন করা রিলিজ বিল্ড ইনস্টল করুন।
- অনবোর্ডিং/লগইন সম্পূর্ণ করুন।
- টেস্ট অ্যাকাউন্ট ব্যবহার করে প্রধান “মানি” ফ্লো (পেমেন্ট/চেকআউট) চালান।
- অফলাইন/খারাপ নেটওয়ার্ক পরিস্থিতি ও পুনরুদ্ধার পরীক্ষা করুন।
- ফোর্স-ক্লোজ করে পুনরায় চালু করুন।
নোট রাখুন: শেষ অ্যাকশন, স্ক্রিন, ডিভাইস মডেল, এবং পুনরুৎপাদনযোগ্য কি না।
কি কি করা উচিত একটি স্টোর সাবমিশন ড্রাই-রানে যাতে কোনো আচমকা সমস্যা না হয়?
ড্রাই-রানটি স্টোর সাবমিশন ফ্লো সম্পূর্ণভাবে অনুসরণ করা, কিন্তু Publish চাপার আগে বন্ধ করা। এটি অনুমানকে বাস্তবে নিয়ে আসে।
আপনি যা যাচাই করবেন:
- ভার্সন ও বিল্ড নম্বর প্রত্যাশিত কি না এবং রিলিজ নোট প্রস্তুত আছে।
- কমপ্লায়েন্স প্রশ্নগুলো ধারাবাহিকভাবে উত্তর করা আছে (ডেটা সংগ্রহ, বিজ্ঞাপন, এনক্রিপশন, লগইন প্রয়োজনীয়তা, সংবেদনশীল পারমিশন)।
- সাপোর্ট কনটাক্ট, প্রাইভেসি নোট এবং রিভিউ ইনফো (ডেমো অ্যাকাউন্ট ইত্যাদি) প্রস্তুত আছে।
পাবলিশ চাপার আগে রোলব্যাক/হটফিক্স প্ল্যান নির্ধারণ করুন এবং প্রথম ৪৮ ঘণ্টায় কীভাবে প্রাথমিক ফিডব্যাক সংগ্রহ করবেন তাও ঠিক করুন।