আপনি যদি আপনার app-কে iOS 27 SDK-এর against build করেন কিন্তু UIScene lifecycle adopt না করেন, তাহলে app-টা লঞ্চই হবে না। আর যে app লঞ্চ হয় না, সেটা কখনো push-এর জন্য register-ও করে না — তাই আপনার notification গুলো কোনো crash report ছাড়াই চুপচাপ বন্ধ হয়ে যায়, যেটা push-কে কারণ হিসেবে দেখাবে। উপর থেকে দেখলে মনে হবে এটা delivery-র সমস্যা। আসলে এটা app চালু হওয়ার (launch) সমস্যা।
এই সমস্যাটা টিমগুলোকে হঠাৎ ধরে ফেলে, কারণ push আর app চালু হওয়া — এই দুটো জিনিস কোডে এবং মাথায়, দুই জায়গাতেই সম্পূর্ণ আলাদা মনে হয়। iOS 27 এই দুটোকে একসাথে জুড়ে দিয়েছে। এই গাইডে আমরা দেখব ঠিক কী ভাঙে, কোন chain-এ আপনার notification নিঃশব্দ হয়ে যায়, কারা এর প্রভাবে পড়বে, আর ঠিক করার জন্য migration checklist। Pushwoosh একটা customer engagement platform, আর এর iOS SDK এই পরিবর্তনটা আগে থেকেই সামলে রেখেছে, তবে নিচের সমাধান আপনি Pushwoosh ব্যবহার করুন বা না করুন — সব ক্ষেত্রেই কাজ করবে।
এটা আমাদের iOS 27 release guide-এর একটা অংশ। SDK-এর কাজ চলাকালীন, আপনার আসল device reach একবার check করে নেওয়াও ভালো।
আসলে কী ভাঙে
Apple WWDC25-এ ঘোষণা করেছিল যে iOS 26-এর পরের release-এ, সর্বশেষ SDK দিয়ে বানানো যেকোনো UIKit app-এর জন্য UIScene lifecycle বাধ্যতামূলক হবে। iOS 27 সেই release। এই requirement এখন কার্যকর হয়ে গেছে।
কখন এটা প্রযোজ্য হয়, সেটা গুরুত্বপূর্ণ, আর বেশিরভাগ ভয় ছড়ানো post-এ এই জায়গাটা ভুল বলা হয়: enforcement তখনই হয় যখন আপনি Xcode 27-এ iOS 27 SDK দিয়ে build করেন, শুধু কোনো user আপনার existing app iOS 27-এ চালালেই না। আপনার এখন যে build App Store-এ আছে, সেটা updated ফোনেও ঠিকঠাক চলতে থাকবে। সমস্যাটা আসবে আপনার পরের release-এ, যেটা নতুন SDK দিয়ে compile হয়েছে। এই পার্থক্যটা আপনাকে একটু সময় দেয়, তবে শুধু আপনার পরের submission পর্যন্ত।
যেটা পরিবর্তন হয় না, এবং এখানেই ভয় ছড়ানো লেখাগুলো বাড়িয়ে বলে: APNs flow নিজে পুরোপুরি অক্ষত আছে। আপনি আগের মতোই authorization চান, registerForRemoteNotifications() call করেন, আর didRegisterForRemoteNotificationsWithDeviceToken-এ device token পান। সেই callback আপনার AppDelegate-এই থাকে, আর iOS 27-এ এখন এর কোনো scene-based বিকল্প নেই যেখানে এটা সরানো যায়। Push-এর মূল কাজ ঠিকই আছে। Apple যেটা বদলেছে সেটা হলো app চালু হওয়ার প্রক্রিয়া।
যে chain আপনার push বন্ধ করে দেয়
কোনো app-এ scene manifest না থাকা অবস্থায় সেটা iOS 27 SDK দিয়ে build হলে, সমস্যাটা এই ক্রমে ঘটে:
- UIKit চালু হওয়ার সময় scene থাকার কথা expect করে, কিন্তু আপনার Info.plist-এ কোনো
UIApplicationSceneManifestখুঁজে পায় না। - AppDelegate-এর কোনো method চলার আগেই app বন্ধ হয়ে যায়।
- যেহেতু
application(_:didFinishLaunchingWithOptions:)কখনো চলেই না,registerForRemoteNotifications()-ও কখনো চালু হয় না। - Register না হলে
didRegisterForRemoteNotificationsWithDeviceTokenকখনো call হয় না, তাই app কখনো APNs token পায় না। - Token না থাকলে delivery হয় না। আর যেহেতু app চালু হওয়ার সময়েই crash করেছিল, আপনার log launch-কে দোষী করবে, notification pipeline-কে না।
এই সমস্যাটা debugging-এ এত সময় নেয় কারণ symptom আর আসল কারণ একদম আলাদা জায়গায় থাকে। আপনি দেখেন delivery হচ্ছে না, তখন আপনি push provider, payload, certificate check করা শুরু করেন। কিন্তু আসল সমস্যা তিন স্তর উপরে, একটা manifest ফাইলে — যার সাথে notification-এর কোনো সম্পর্কই নেই।
কারা প্রভাবিত হবে
এই requirement UIKit app-কে touch করে, তবে কতটা প্রভাব পড়বে তা নির্ভর করে আপনার stack-এর ওপর।
| Stack | কতটা প্রভাবিত |
|---|---|
| Native UIKit | সরাসরি প্রভাবিত। আপনি যদি AppDelegate lifecycle নিজে maintain করেন, তাহলে migration-ও আপনাকেই করতে হবে। |
| SwiftUI | যদি আপনি App protocol আর WindowGroup ব্যবহার করেন, যেগুলো ইতিমধ্যে scene-based, তাহলে ঝুঁকি কম। তবে যেসব app এখনো custom window logic সহ UIApplicationDelegateAdaptor-এর ওপর নির্ভরশীল, সেগুলো ভালোভাবে check করা দরকার। |
| Flutter | সাম্প্রতিক version-এ framework অপরিবর্তিত AppDelegate থাকা app গুলোকে নিজে থেকেই migrate করে দেয়, তবে কোনো custom native logic থাকলে সেটা হাতে করে migrate করতে হবে। |
| React Native | আপনার native module এবং AppDelegate hook করা কোনো third-party SDK wrapper থাকলে তার ওপর নির্ভর করে। |
App protocol আর WindowGroup ব্যবহার করেন, যেগুলো ইতিমধ্যে scene-based, তাহলে ঝুঁকি কম। তবে যেসব app এখনো custom window logic সহ UIApplicationDelegateAdaptor-এর ওপর নির্ভরশীল, সেগুলো ভালোভাবে check করা দরকার।Cross-platform টিমের জন্য আসল সমস্যা framework নয়, বরং তার ওপর বসানো SDK গুলো। কোনো push বা analytics SDK যেটা আপনার AppDelegate-কে wrap করে নিজেকে install করে, সেটা scene migration-কে আটকে দিতে পারে যতক্ষণ না সেই vendor নিজে scene support ছাড়ে। যদি আপনার @main entry point কোনো dependency-র দখলে থাকে, তাহলে আপনি শুধু নিজের release-এর জন্য না, তাদের release-এর জন্যও অপেক্ষা করছেন। আমরা এমন একটা migration দেখেছি যেটা exactly এই কারণে 2 সপ্তাহ আটকে ছিল — একটা মাত্র অসহযোগী dependency-র জন্য, যদিও team নিজে যা control করতে পারত তার সব কাজ শেষ ছিল। Migration একদিনের কাজ ভাবার আগে, আপনার notification SDK-র scene compatibility check করে নিন। আপনি যদি আমাদের Flutter plugin ব্যবহার করেন, তাহলে known migration issues page-টা প্রথমে পড়ুন।
Migration checklist
Scene 2019-এ চালু হওয়ার পর থেকে এই সমাধান পাল্টায়নি। যেটা পাল্টেছে সেটা হলো, এটা আর optional নেই।
- একটা scene manifest যোগ করুন। আপনার Info.plist-এ একটা
UIApplicationSceneManifestযোগ করুন, অথবা UIApplicationDelegate এবং UISceneDelegate method দিয়ে code-এ scene configure করুন। - একটা SceneDelegate তৈরি করুন। না থাকলে একটা যোগ করুন এবং নিশ্চিত করুন সেটা আসলেই আপনার target-এ compile হচ্ছে। যে SceneDelegate project-এ আছে কিন্তু কখনো build sources-এ যোগ হয়নি, সেটা একটা সাধারণ ভুল।
- Window তৈরির কাজ সরান। Window-এর মালিকানা AppDelegate থেকে সরে যায়।
UIWindow(frame:)-এর বদলেUIWindow(windowScene:)ব্যবহার করুন এবং আপনার root view scene থেকে host করুন। - UI lifecycle handling সরান। Foreground, background, এবং active/inactive transition গুলো UISceneDelegate-এ চলে যায়। Migration-এর পর, UIKit আপনার AppDelegate-এ UI-state method আর call করবে না, তাই সেখানে যা থেকে যাবে সেটা নিঃশব্দে কাজ করা বন্ধ করে দেবে।
- Push registration যেখানে আছে সেখানেই থাকতে দিন। Token registration আর token callback AppDelegate-এই থাকে। শুধু symmetry-র জন্য এগুলো সরাবেন না।
- URL এবং deep-link handling migrate করুন। Incoming URL এখন scene method দিয়ে আসে। যদি আপনার push notification নির্দিষ্ট screen খোলে, তাহলে এই অংশটাই আপনার deep link কে কাজ করা অবস্থায় রাখে।
- আবার build করুন এবং token issuance verify করুন। iOS 27 SDK দিয়ে build করুন, চালু করুন, এবং নিশ্চিত করুন app একটা APNs token পাচ্ছে। যদি না পায়, iOS error troubleshooting guide দিয়ে শুরু করুন। Release-এর আগে সত্যিকারের build-এ verify করুন, পরে নয়।
AppDelegate রেখে দিন। “AppDelegate চলে যাচ্ছে” — এই কথা পড়ে টিমগুলো এখানেই ভুল বোঝে। এটা চলে যাচ্ছে না। এর ভূমিকা সীমিত হয়ে process আর app-level event-এ থাকবে, আর UI lifecycle scene-এ চলে যাবে। Push registration একটা app-level বিষয়, আর ঠিক এই কারণেই এটা যেখানে আছে সেখানেই থাকে।
শুধু push-এর ওপর ভরসা করা কেন ঝুঁকিপূর্ণ
একটু পিছিয়ে ভাবুন। একটা মাত্র manifest key, একটা ফাইলে যেটা team-এর প্রায় কেউই কখনো খোলে না, সেটা আপনার পুরো push channel-কে পরের release-এ offline করে দিতে পারে। একটা মাত্র delivery method-এর ওপর এত বেশি ঝুঁকি চাপানো আছে।
আর এটা push-এর আগে থেকেই থাকা একটা সীমার ওপর যোগ হয়: opt-in। একটা ভালো permission চাওয়ার strategy থাকলেও, আপনার অনেক user প্রথমেই push permission দেয় না, তাই ভালো দিনেও push আপনার user base-এর একটা অংশ পর্যন্তই পৌঁছায়। এই ধরনের platform-level সমস্যা শুধু সেই gap-টা বাড়িয়ে দেয়, যেটা আপনি reach করতে পারতেন আর যেটা আপনি আসলে reach করেন তার মধ্যে।
যেসব team এই ধরনের পরিবর্তন ভালোভাবে সামলাতে পারে, তারা একটামাত্র channel-এর ওপর নির্ভর করে না। যখন push শুধু email, SMS, আর in-app-এর পাশে একটা delivery method, তখন একটা platform-এ launch-time সমস্যা আপনার পুরো reach মুছে না দিয়ে শুধু একটু কমায়। এভাবে আপনি ঠিক এই ধরনের হঠাৎ পরিবর্তনের জন্য একটা safety margin তৈরি করে রাখেন, যেটা Apple এইমাত্র নিয়ে এসেছে।
SDK-এর কাজ চলাকালীন, কোন notification পাঠানোর যোগ্য সেটা নিয়েও একবার ভেবে দেখার ভালো সময় এটা।
Pushwoosh দিয়ে আপনার iOS 27 push setup check করিয়ে নিন
Pushwoosh SDK ইতিমধ্যে iOS 27 scene lifecycle support করে, আর এর multichannel setup মানে হলো একটা platform-এ সমস্যা হলে আপনার পুরো notification strategy একসাথে বন্ধ হয়ে যায় না। যদি আপনার migration চলছে আর কিছু register হচ্ছে না, iOS SDK FAQ-তে common সমস্যাগুলো দেওয়া আছে। আর যদি আপনি চান কেউ আরেকবার check করে দেখুক আপনার push registration এই পরিবর্তনের পরেও ঠিকঠাক কাজ করবে কিনা, আমরা আপনার সাথে মিলে আপনার integration দেখতে পারি।
প্রায়ই জিজ্ঞাসিত প্রশ্ন
didRegisterForRemoteNotificationsWithDeviceToken callback আপনার AppDelegate-এই থেকে যায়। iOS 27-এ এর কোনো scene-based বিকল্প নেই যেখানে এগুলো সরানো যায়, আর সরানোর চেষ্টা করাটাই একটা ভুল। শুধু UI lifecycle scene-এ যায়।
সম্পর্কিত আর্টিকেল
সব দেখুন