iOS 13 में deprecated keyWindow को ठीक करें: पूरा गाइड Swift

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

«keyWindow» डिप्रीकेटेड हो गया है। अब क्या करें?

\n\n

अगर आपने कभी यह कोड लिखा है:

\n\n
guard 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\n

Apple ने keyWindow को क्यों हटाया?

\n\n

iOS 13 से पहले, ऐप में एक ही मुख्य विंडो होती थी — keyWindow। सब कुछ सरल था: इसे लो और काम करो। लेकिन iPadOS और मल्टीटास्किंग (Split View, Slide Over) के आने के बाद, एक ऐप में एक साथ कई विंडो हो सकती हैं। हर विंडो अपने UIWindowScene द्वारा मैनेज होती है। अब 'key window' की अवधारणा अस्पष्ट हो गई है।

\n\n

Apple अब सलाह देता है कि विंडो को सीन (UIWindowScene) के माध्यम से प्राप्त करें, जिससे आपका कंट्रोलर या व्यू जुड़ा है।

\n\n

तरीकों की तुलना: सरल से सही तक

\n\n

हम 4 तरीके देखेंगे, 'जल्दी से वार्निंग बंद करो' से लेकर 'Apple के तरीके से करो' तक। अपनी आर्किटेक्चर के अनुसार कोई एक चुनें।

\n\n

1. त्वरित समाधान: UIApplication.shared.windows.first(where:)

\n\n

Stack Overflow पर सबसे लोकप्रिय जवाब है keyWindow की जगह windows प्रॉपर्टी का उपयोग करना:

\n\n
if let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) {\n    // window का उपयोग करें\n}
\n\n

फायदे:

\n
    \n
  • कोड में न्यूनतम बदलाव
  • \n
  • iOS 13+ पर काम करता है
  • \n
\n\n

नुकसान:

\n
    \n
  • कई विंडो होने पर अभी भी असुरक्षित
  • \n
  • अगर विंडो अभी बनी नहीं है तो nil लौटा सकता है
  • \n
  • Apple अभी भी इसे कुछ संदर्भों में 'deprecated' मानता है
  • \n
\n\n

कब उपयोग करें: केवल त्वरित प्रोटोटाइप के लिए, या यदि आपके पास निश्चित रूप से एक ही विंडो है (जैसे, बिना मल्टी-विंडो वाला iPhone ऐप)।

\n\n

2. SceneDelegate के माध्यम से: UIKit के लिए सही तरीका

\n\n

iOS 13 से, Apple ने UISceneDelegate पेश किया। scene(_:willConnectTo:options:) मेथड में आपको UIWindowScene मिलता है और आप विंडो का रेफरेंस सेव कर सकते हैं।

\n\n

चरण 1: SceneDelegate.swift में window प्रॉपर्टी घोषित करें:

\n\n
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\n
if let windowScene = view.window?.windowScene,\n   let window = windowScene.windows.first {\n    // window का उपयोग करें\n}
\n\n

या, अगर आपको ऐप में कहीं भी मुख्य विंडो चाहिए, तो SceneDelegate और उसके window का रेफरेंस स्टोर करें।

\n\n

फायदे:

\n
    \n
  • पूरी तरह से Apple की सिफारिशों के अनुरूप
  • \n
  • कई विंडो के साथ सही ढंग से काम करता है
  • \n
  • iPad पर मल्टीटास्किंग के लिए सुरक्षित
  • \n
\n\n

नुकसान:

\n
    \n
  • SceneDelegate सेटअप की आवश्यकता (यदि आपने अभी तक स्विच नहीं किया है)
  • \n
  • थोड़ा अधिक कोड
  • \n
\n\n

3. UIWindowScene.activeWindow के माध्यम से (iOS 15+)

\n\n

iOS 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 वर्शन में क्रैश हो सकता है। इसलिए जितनी जल्दी हो सके, अपने कोड को अपडेट करें!

ब्लॉग

पुस्तक अनुशंसाएँ