SceneDelegate जोड़ने और Info.plist को अपडेट करने के बाद भी Xcode 11 ब्लैक स्क्रीन पर iOS13


10

मुझे वर्तमान में Xcode 11, लक्ष्य iOS 13.0 के साथ एक रिक्त स्क्रीन मिल रही है (ऐप सभी संस्करणों के नीचे iOS 12.1 से 12.4 तक ठीक काम करता है), मैं 12.1 से ऊपर के दोनों iOS उपयोगकर्ताओं के लिए अपना ऐप काम करना चाहता हूं और 13.0 वर्तमान में रिक्त स्क्रीन पाने के बावजूद मेरे मौजूदा प्रोजेक्ट के नीचे SceneDelegate जोड़ रहा है और AppManifest

App मैनिफ़ेस्ट फ़ाइल जोड़ रहा है

import UIKit
    import SwiftUI

    @available(iOS 13.0, *)
    class SceneDelegate: UIResponder, UIWindowSceneDelegate {

        var window: UIWindow?

        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

            //guard let _ = (scene as? UIWindowScene) else { return }

            let user  = UserDefaults.standard.object(forKey: "defaultsuserid")

            let userSelfIdent  = UserDefaults.standard.object(forKey: "userinitialident")

            if let windowScene = scene as? UIWindowScene {

                let internalWindow = UIWindow(windowScene: windowScene)

                if (user != nil && userSelfIdent != nil){
                     let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                     let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
                        internalWindow.rootViewController = newViewcontroller
                        self.window = internalWindow
                        internalWindow.makeKeyAndVisible()
                }else {

                    guard let _ = (scene as? UIWindowScene) else { return }
                }
            }
        }

निम्नलिखित मेरा AppDelegate है जो पहले बुलाया जा रहा है और didFinishLaunchWithOptionsविधि को निष्पादित कर रहा है। मैं जानना चाहता हूं कि मैं कैसे इस पद्धति को केवल तभी कॉल कर सकता हूं जब मेरा लक्ष्य ios 13.0 से कम है और 13.0 के बाद अपने rootViewController को प्रारंभ करने के लिए SceneDelegate विधि को कॉल करें?

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    @available(iOS 13.0, *)
    func application(_ application: UIApplication,
                     configurationForConnecting connectingSceneSession: UISceneSession,
                     options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {

    }



    @available(iOS 13.0, *)
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let _ = (scene as? UIWindowScene) else { return }

        if (user != nil && userSelfIdent != nil){

              let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
              let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
                self.window?.rootViewController = newViewcontroller
        }
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        Thread.sleep(forTimeInterval: 3.0)

        UINavigationBar.appearance().barTintColor = UIColor(red:0.08, green:0.23, blue:0.62, alpha:1.0)

        if (user != nil && userSelfIdent != nil){

              let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
              let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
                self.window?.rootViewController = newViewcontroller
        }

        return true
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

        let defaultUserID = UserDefaults.standard.string(forKey: "defaultUserID")


    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

        switch (application.applicationState) {
        case UIApplicationState.active:
            do something

        case UIApplicationState.background, UIApplicationState.inactive:

            let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let newViewcontroller = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
            self.window?.rootViewController = newViewcontroller            
        }
    }

जवाबों:


28

आपके यहां कई मुद्दे हैं। ऐप जीवनचक्र से संबंधित प्रलेखन को पढ़ना महत्वपूर्ण है जो बताता है कि iOS 13 के तहत क्या कहा जाता है और iOS 12 के तहत क्या कहा जाता है।

आप मेरे एकल दृश्य ऐप टेम्प्लेट को भी देख सकते हैं जो iOS 12 और 13 का समर्थन करता है।

अपने कोड को देखते हुए, यहाँ समस्याओं का सारांश है:

AppDelegate:

  • यदि ऐप को iOS 12 या उससे पहले चलाया जा रहा है तो आपको केवल मुख्य विंडो और रूट व्यू कंट्रोलर को सेटअप करना चाहिए। आपको इसे रनटाइम पर जांचना होगा।
  • func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)विधि एप्लिकेशन प्रतिनिधि में नहीं होना चाहिए।
  • सीधे संबंधित नहीं हैं, लेकिन ऐप स्टार्टअप पर कभी नहीं सोते हैं। Thread.sleep(forTimeInterval: 3.0)लाइन हटाओ । उपयोगकर्ता आपके एप्लिकेशन का उपयोग करना चाहते हैं, लॉन्च स्क्रीन पर आवश्यकता से अधिक समय तक नहीं घूरते हैं। और ऐप लॉन्च पर मुख्य थ्रेड को ब्लॉक करने से आपका ऐप मारा जा सकता है।

SceneDelegate:

  • यह ज्यादातर ठीक है, लेकिन इसका कोई कारण नहीं है guard let _ = (scene as? UIWindowScene) else { return } लाइन के , खासकर जब से यह एक अंदर है if letकि पहले से ही जांच करता है।
  • आप SwiftUI का उपयोग नहीं करते हैं इसलिए उस आयात को हटा दें।

मैं आपके एप्लिकेशन प्रतिनिधि को इस तरह और अधिक अपडेट करने के लिए अपडेट करूंगा:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        UINavigationBar.appearance().barTintColor = UIColor(red:0.08, green:0.23, blue:0.62, alpha:1.0)

        if #available(iOS 13.0, *) {
            // In iOS 13 setup is done in SceneDelegate
        } else {
            let window = UIWindow(frame: UIScreen.main.bounds)
            self.window = window

            if (user != nil && userSelfIdent != nil){
                let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
                window.rootViewController = newViewcontroller
            }
        }

        return true
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if #available(iOS 13.0, *) {
            // In iOS 13 setup is done in SceneDelegate
        } else {
            self.window?.makeKeyAndVisible()
        }

        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Not called under iOS 13 - See SceneDelegate sceneWillResignActive
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Not called under iOS 13 - See SceneDelegate sceneDidEnterBackground
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Not called under iOS 13 - See SceneDelegate sceneWillEnterForeground
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Not called under iOS 13 - See SceneDelegate sceneDidBecomeActive
    }

    // MARK: UISceneSession Lifecycle

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
}

आपका दृश्य प्रतिनिधि हो सकता है:

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }

        let window = UIWindow(windowScene: windowScene)
        self.window = window

        if (user != nil && userSelfIdent != nil){
            let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
            window.rootViewController = newViewcontroller
            window.makeKeyAndVisible()
        }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // Not called under iOS 12 - See AppDelegate applicationDidBecomeActive
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // Not called under iOS 12 - See AppDelegate applicationWillResignActive
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Not called under iOS 12 - See AppDelegate applicationWillEnterForeground
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // Not called under iOS 12 - See AppDelegate applicationDidEnterBackground
    }
}

1
बहुत बहुत शुक्रिया। वास्तव में अपने समय और उत्तर की सराहना करें। दुर्भाग्य से, उपर्युक्त परिवर्तन करने के बाद भी मुझे अभी भी एक खाली स्क्रीन मिल रही है :(
क्रिस रेडुहस्ट

वास्तव में रनटाइम में आपके कोड में क्या होता है? डिबगर के साथ कदम रखें। willConnectToदृश्य प्रतिनिधि विधि में एक ब्रेकपॉइंट के साथ शुरू करें और चरण दर चरण जाएं। क्या यह वही है जो आप उम्मीद करते हैं?
२:२५ बजे

कुछ भी नहीं होता है मुझे कंसोल में कोई भी त्रुटि संदेश नहीं मिलता है, यह निश्चित नहीं है कि मेरा सिम्युलेटर क्या चल रहा है ... imgur.com/a/kip57Fg
Kris RaduhaSt

है willConnectToकहा जाता है? फिर क्या होता है? क्या यह रूट व्यू कंट्रोलर बनाने और सेट करने की बात नहीं करता है? फिर, डिबगर के साथ कोड के माध्यम से कदम। सिर्फ कंसोल आउटपुट पर निर्भर न रहें।
1

हाँ यह कहा जाता है और `window.rootViewController = newViewcontroller window.makeKeyAndV अदृश्य () 'यह भी निष्पादित किया गया है, लेकिन मैं iOS 11-13.0 सिम्युलेटर पर एक खाली स्क्रीन देखता हूं, लेकिन जब मैं लक्ष्य पर जाता हूं और 13.0 के बजाय 12.0 पर बदल जाता है तो ऐप ठीक काम करता है।
क्रिश रादुहस्ट

12

तो एक iOS 13 और कम संस्करण के लिए कदम

1) iOS 12 में तैनाती लक्ष्य बदलें।

2) AppDelegate के तरीकों को iOS 12 के विकास के लिए उनके पास क्या होना चाहिए, के साथ बदलें। इसे भी जोड़ें:

   var window: UIWindow?

3) SceneDelegate निकालें।

4) अपनी जानकारी में आवेदन दृश्य घोषणापत्र निकालें।

यह iOS 13 और लोअर iOS वर्जन दोनों पर काम करेगा


यह सबसे अच्छा जवाब होना चाहिए!
स्विफ्ट कोड्स

सर्वश्रेष्ठ उत्तर ....
सुब्रत मोंडल

1

मैं इस समस्या के साथ फंस गया था, और आखिरकार मैंने स्टोरीबोर्ड से searchDisplayController संदर्भों को हटाकर हल किया।

<searchDisplayController id="pWz-So-g6H">
                    <connections>
                        <outlet property="delegate" destination="Yci-sd-Mof" id="fjs-ah-jLs"/>
                        <outlet property="searchContentsController" destination="Yci-sd-Mof" id="gQN-1r-gti"/>
                        <outlet property="searchResultsDataSource" destination="Yci-sd-Mof" id="2Jf-lh-Ute"/>
                        <outlet property="searchResultsDelegate" destination="Yci-sd-Mof" id="Hap-SA-f02"/>
                    </connections>
                </searchDisplayController>

2
मेरे पास iOS 13 के लिए Xcode 13 के साथ ऐप बनाने के बाद भी ऐसा ही मुद्दा था। मेरा ऐप लॉन्चस्क्रीन के बाद केवल एक काली स्क्रीन दिखा रहा था। यह केवल जब Testflight से स्थापित है। सिम्युलेटर में या केबल (स्कीम डिबग और रिलीज़) के साथ ऐप शुरू करना ठीक था। इसके अलावा iOS 12: इश्यू। कर: 'grep -r -i' सर्चडिसप्लेकंट्रोलर ने Main.storyboard में इसी तरह का पाठ दिखाया। टेक्स्ट-एडिटर के साथ इन लाइनों को हटाने और Xcode 13 में फिर से स्थापित करने के बाद, ऐप अब TestFlight से स्थापित iOS 13 पर ठीक शुरू होता है! धन्यवाद @ एरिक मार्टिनेज।
20

मैं main.storyboard के लिए स्रोत खोल दिया है और इस searchDisplayController में वहाँ .. नहीं रह गया है
Timman

1

जब मेरे पास एक समान मुद्दा था, तो यह Xcode 11.0 का उपयोग करके उत्पन्न एकल-ऐप टेम्पलेट के कारण था, जो कि Xcode 11.2 के साथ निर्मित ऐप के लिए आवश्यक नहीं था।

इसलिए मैंने अभी Xcode 11.2 के साथ एक नया सिंगल-पेज-ऐप बनाया और जेनरेट किए गए SceneDelegate को अपने पुराने प्रोजेक्ट में कॉपी किया जो Xcode 11.0 का उपयोग करके बनाया गया था।

उसके बाद, रिक्त स्क्रीन एक बार फिर से दिखाई देने वाला मेरा इंटरफ़ेस गया।

diff


0

इन चरणों को आसानी से परती करें

1-) दृश्य प्रतिनिधि फ़ाइल निकालें

2-) AppDelegate.swift के नीचे कोड जोड़ें

    class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
   }

3-) अपने .plist फ़ाइल से एप्लिकेशन दृश्य मैनिफ़ेस्ट लाइन निकालें यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.