iOS13 na czarnym ekranie Xcode 11 nawet po dodaniu SceneDelegate i aktualizacji informacji.plist

Jestem obecnie coraz pusty ekran z Xcode 11, docelowy iOS 13.0 (aplikacja działa dobrze ze wszystkimi poniższymi wersjami iOS 12.1 do 12.4), chcę, aby moja aplikacja działała zarówno dla użytkowników iOS powyżej 12.1, a także 13.0 obecnie coraz pusty ekran pomimo dodawania poniżej SceneDelegate do mojego istniejącego projektu i AppManifest

Dodawanie pliku manifestu aplikacji

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 }
                }
            }
        }

Poniżej znajduje się mój AppDelegate, który jest wywoływany jako pierwszy i wykonuje metodę didFinishLaunchWithOptions. I chcesz wiedzieć, jak Mogę wywołać tę metodę tylko wtedy, gdy mój docelowy ios jest mniejszy niż 13.0 i wywołać metodę SceneDelegate, aby zainicjować mój rootViewController po 13.0?

@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            
        }
    }
Author: Kris RaduhaSt, 2019-10-02

8 answers

Masz tu kilka problemów. Ważne jest, aby zapoznać się z dokumentacją związaną z cyklem życia aplikacji, która określa, co jest nazywane w systemie iOS 13 i co jest nazywane w systemie iOS 12.

Możesz również zobaczyć mój szablon aplikacji Single View, który obsługuje iOS 12 i 13.

Patrząc na Twój kod, oto podsumowanie problemów:

AppDelegate:

  • powinieneś skonfigurować główne okno i kontroler widoku głównego tylko, jeśli aplikacja jest uruchamiana pod systemem iOS 12 lub wcześniej. Musisz to sprawdzić w czasie wykonywania.
  • Metoda func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) nie powinna znajdować się w App delegate.
  • nie jest bezpośrednio związany, ale nigdy nie śpi podczas uruchamiania aplikacji. Usuń linię Thread.sleep(forTimeInterval: 3.0). Użytkownicy chcą korzystać z aplikacji, a nie gapić się na ekran startowy dłużej niż to konieczne. A zablokowanie głównego wątku podczas uruchamiania aplikacji może spowodować śmierć aplikacji.

SceneDelegate:

  • to jest w większości w porządku, ale nie ma powodu do guard let _ = (scene as? UIWindowScene) else { return } linii, zwłaszcza, że jest wewnątrz if let, który już to sprawdza.
  • wydaje się, że nie używasz SwiftUI, więc usuń ten import.

Chciałbym zaktualizować delegata aplikacji, aby być bardziej jak to:

@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.
    }
}

Twoja scena może wyglądać tak:

@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
    }
}
 34
Author: rmaddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-05 21:09:30

Tak więc kroki, aby dostać się do iOS 13 i niższej wersji

1) Zmień cel wdrożenia na iOS 12.

2) Zastąp metody AppDelegate tym, co powinny mieć dla rozwoju iOS 12. Dodaj też to:

   var window: UIWindow?

3) Usunąć SceneDelegate.

4) Usuń Manifest sceny aplikacji w swoich informacjach.plist.

Będzie działać zarówno na iOS 13, jak i niższej wersji iOS

 27
Author: Vinayak Bhor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-26 08:59:37

Easly fallow these steps

1-) Usuń plik delegata sceny

2 -) dodaj poniższy kod do AppDelegate.swift

    class AppDelegate: UIResponder, UIApplicationDelegate {

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

3-) usuń linię manifestu sceny aplikacji z twojego .plik plist Tutaj wpisz opis obrazka

 4
Author: Emre Gürses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-18 12:47:23

Utknąłem z tym problemem i w końcu rozwiązałem usunięcie odniesień searchDisplayController ze storyboard.

<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>
 1
Author: Erick Martinez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-25 21:32:47

Kiedy miałem podobny problem to było ze względu na szablon pojedynczej aplikacji generowanej za pomocą Xcode 11.0 był niezgodny z tym, który jest potrzebny dla aplikacji zbudowanej z Xcode 11.2.

Więc po prostu stworzył nowy Single-Page-App z Xcode 11.2 i skopiował wygenerowany SceneDelegate do mojego starego projektu, który został utworzony przy użyciu Xcode 11.0.

Po tym pustym ekranie zniknął mój interfejs widoczny po raz kolejny.

Diff

 1
Author: appleitung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-16 09:51:23

Skomentowałem 2 metody sceny w AppDelegate, a potem działa sprawdź mój zrzut ekranu Tutaj wpisz opis obrazka

 1
Author: Peter Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-18 11:34:46

Proszę refre nabove image

Proszę zapoznać się z powyższym obrazkiem i dodać linię w AppDelegate.

 0
Author: Sheetal Shinde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-18 07:52:01

Xcode 11.6 @ Ionic / react capacitor app

Aktualizacja:7/22/2020

Mieliśmy też problem z czarnym ekranem w TestFlight. W końcu rozwiązaliśmy.

Sprawdź konfigurację.Kondensator.json i sprawdź, czy masz tam localhost, Usuń adresy URL w sekcji Serwer.. my (I) zapomniał nasz adres URL localhost nadal tam, kiedy uruchamiamy release, szczerze mówiąc nie wiedziałem, że może być problem lub nigdy nie myśleć, aby sprawdzić tam, Spędziłem czas (dni), aby sprawdzić sugestie scenorysów.

 0
Author: greenridinghood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-22 21:57:55