«keyWindow» डिप्रीकेटेड हो गया है। अब क्या करें?
\n\nअगर आपने कभी यह कोड लिखा है:
\n\nguard let window = UIApplication.shared.keyWindow else { return }\n\n…तो आपने Xcode में पीला वार्निंग ज़रूर देखा होगा: «'keyWindow' was deprecated in iOS 13.0»। यह Stack Overflow पर सबसे आम सवालों में से एक है (100,000 से अधिक व्यूज), और यह कोई हैरानी की बात नहीं है — Apple ने वाकई में नियम बदल दिए हैं।
\n\nइस लेख में हम जानेंगे कि ऐसा क्यों हुआ, और 4 तरीकों की तुलना करेंगे जिनसे आप बिना deprecated API के ऐप का विंडो प्राप्त कर सकते हैं। आप जानेंगे कि UIKit, SwiftUI, SceneDelegate के लिए कौन सा तरीका सबसे उपयुक्त है और कब किसका उपयोग करना चाहिए। चलिए शुरू करते हैं!
\n\nApple ने keyWindow को क्यों हटाया?
\n\niOS 13 से पहले, ऐप में एक ही मुख्य विंडो होती थी — keyWindow। सब कुछ सरल था: इसे लो और काम करो। लेकिन iPadOS और मल्टीटास्किंग (Split View, Slide Over) के आने के बाद, एक ऐप में एक साथ कई विंडो हो सकती हैं। हर विंडो अपने UIWindowScene द्वारा मैनेज होती है। अब 'key window' की अवधारणा अस्पष्ट हो गई है।
Apple अब सलाह देता है कि विंडो को सीन (UIWindowScene) के माध्यम से प्राप्त करें, जिससे आपका कंट्रोलर या व्यू जुड़ा है।
\n\nतरीकों की तुलना: सरल से सही तक
\n\nहम 4 तरीके देखेंगे, 'जल्दी से वार्निंग बंद करो' से लेकर 'Apple के तरीके से करो' तक। अपनी आर्किटेक्चर के अनुसार कोई एक चुनें।
\n\n1. त्वरित समाधान: UIApplication.shared.windows.first(where:)
\n\nStack Overflow पर सबसे लोकप्रिय जवाब है keyWindow की जगह windows प्रॉपर्टी का उपयोग करना:
if let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) {\n // window का उपयोग करें\n}\n\nफायदे:
\n- \n
- कोड में न्यूनतम बदलाव \n
- iOS 13+ पर काम करता है \n
नुकसान:
\n- \n
- कई विंडो होने पर अभी भी असुरक्षित \n
- अगर विंडो अभी बनी नहीं है तो nil लौटा सकता है \n
- Apple अभी भी इसे कुछ संदर्भों में 'deprecated' मानता है \n
कब उपयोग करें: केवल त्वरित प्रोटोटाइप के लिए, या यदि आपके पास निश्चित रूप से एक ही विंडो है (जैसे, बिना मल्टी-विंडो वाला iPhone ऐप)।
\n\n2. SceneDelegate के माध्यम से: UIKit के लिए सही तरीका
\n\niOS 13 से, Apple ने UISceneDelegate पेश किया। scene(_:willConnectTo:options:) मेथड में आपको UIWindowScene मिलता है और आप विंडो का रेफरेंस सेव कर सकते हैं।
चरण 1: SceneDelegate.swift में window प्रॉपर्टी घोषित करें:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {\n\n var window: UIWindow?\n\n func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n guard let windowScene = (scene as? UIWindowScene) else { return }\n window = UIWindow(windowScene: windowScene)\n window?.rootViewController = ViewController()\n window?.makeKeyAndVisible()\n }\n}\n\nचरण 2: सीन के माध्यम से विंडो प्राप्त करें:
\n\nif let windowScene = view.window?.windowScene,\n let window = windowScene.windows.first {\n // window का उपयोग करें\n}\n\nया, अगर आपको ऐप में कहीं भी मुख्य विंडो चाहिए, तो SceneDelegate और उसके window का रेफरेंस स्टोर करें।
फायदे:
\n- \n
- पूरी तरह से Apple की सिफारिशों के अनुरूप \n
- कई विंडो के साथ सही ढंग से काम करता है \n
- iPad पर मल्टीटास्किंग के लिए सुरक्षित \n
नुकसान:
\n- \n
- SceneDelegate सेटअप की आवश्यकता (यदि आपने अभी तक स्विच नहीं किया है) \n
- थोड़ा अधिक कोड \n
3. UIWindowScene.activeWindow के माध्यम से (iOS 15+)
\n\niOS 15 से, UIWindowScene में activeWindow प्रॉपर्टी आ गई है।
if let windowScene = view.window?.windowScene,
let window = windowScene.activeWindow {
// window का उपयोग करें
}
फायदे:
- सबसे साफ और सीधा तरीका
- Apple द्वारा अनुशंसित
नुकसान:
- केवल iOS 15 और उसके बाद के वर्शन पर काम करता है
- पुराने iOS वर्शन के लिए बैकवर्ड कम्पैटिबिलिटी नहीं
कब उपयोग करें: यदि आपका ऐप केवल iOS 15+ को सपोर्ट करता है, तो यह सबसे अच्छा विकल्प है।
4. UIScreen के माध्यम से (पुराना तरीका)
एक और पुराना तरीका है UIScreen का उपयोग करना:
if let window = UIApplication.shared.windows.first(where: { $0.screen == UIScreen.main }) {
// window का उपयोग करें
}
फायदे:
- पुराने कोड के साथ संगत
नुकसान:
- Apple द्वारा अनुशंसित नहीं
- मल्टी-स्क्रीन सेटअप में समस्या हो सकती है
कब उपयोग करें: केवल तब जब आप पुराने कोड को तुरंत ठीक करना चाहते हैं और बाद में रिफैक्टर करने की योजना है।
निष्कर्ष: कौन सा तरीका चुनें?
हमारी सिफारिश:
- iOS 15+ के लिए:
UIWindowScene.activeWindowका उपयोग करें। यह सबसे आधुनिक और साफ तरीका है। - iOS 13+ के लिए (UIKit): SceneDelegate के माध्यम से विंडो प्राप्त करें। यह Apple का अनुशंसित तरीका है।
- त्वरित समाधान के लिए:
UIApplication.shared.windows.first(where:)का उपयोग करें, लेकिन इसे प्रोडक्शन में लंबे समय तक न रखें।
याद रखें: deprecated API का उपयोग करने से आपका ऐप भविष्य के iOS वर्शन में क्रैश हो सकता है। इसलिए जितनी जल्दी हो सके, अपने कोड को अपडेट करें!