iOS13 pada Xcode 11 Layar hitam bahkan setelah menambahkan SceneDelegate dan memperbarui Info.plist


10

Saat ini saya mendapatkan layar kosong dengan Xcode 11, Target iOS 13.0 (aplikasi berfungsi baik dengan semua versi di bawah iOS 12.1 hingga 12.4), saya ingin membuat Aplikasi saya berfungsi untuk kedua pengguna iOS di atas 12.1 dan juga 13.0 saat ini mendapatkan layar kosong meskipun menambahkan SceneDelegate di bawah ini ke proyek saya yang ada dan AppManifest

menambahkan file App Manifest

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

Berikut ini adalah AppDelegate saya yang dipanggil pertama dan menjalankan didFinishLaunchWithOptionsmetode. Saya ingin tahu bagaimana saya bisa membuat metode ini hanya memanggil jika Target ios saya kurang dari 13.0 dan memanggil metode SceneDelegate untuk menginisialisasi rootViewController saya setelah 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            
        }
    }

Jawaban:


28

Anda memiliki beberapa masalah di sini. Penting untuk membaca dokumentasi yang terkait dengan siklus hidup aplikasi yang menyatakan apa yang disebut dengan iOS 13 dan apa yang disebut dengan iOS 12.

Anda mungkin juga ingin melihat templat Aplikasi Tampilan Tunggal saya yang mendukung iOS 12 dan 13.

Melihat kode Anda, berikut adalah ringkasan masalahnya:

AppDelegate:

  • Anda hanya harus mengatur jendela utama dan pengontrol tampilan root jika aplikasi dijalankan di bawah iOS 12 atau sebelumnya. Anda perlu memeriksa ini saat runtime.
  • The func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)Metode tidak harus berada dalam delegasi aplikasi.
  • Tidak terkait langsung tetapi tidak pernah tidur pada startup aplikasi. Hapus Thread.sleep(forTimeInterval: 3.0)garis. Pengguna ingin menggunakan aplikasi Anda, tidak menatap layar peluncuran lebih lama dari yang diperlukan. Dan memblokir utas pada saat peluncuran aplikasi dapat menyebabkan aplikasi Anda terbunuh.

Delegasi SceneDelate:

  • Ini sebagian besar baik-baik saja tetapi tidak ada alasan untuk guard let _ = (scene as? UIWindowScene) else { return }garis, terutama karena itu di dalam if letyang sudah melakukan pemeriksaan itu.
  • Tampaknya Anda tidak menggunakan SwiftUI, jadi hapus impor itu.

Saya akan memperbarui delegasi aplikasi Anda menjadi lebih seperti ini:

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

Delegasi adegan Anda bisa seperti:

@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
Terima kasih banyak rmaddy. Sangat menghargai waktu dan jawaban Anda. Sayangnya, setelah melakukan perubahan tersebut saya masih mendapatkan layar kosong :(
Kris RaduhaSt

Apa yang sebenarnya terjadi dalam kode Anda saat runtime? Melangkah dengan debugger. Mulai dengan breakpoint dalam willConnectTometode delegasi adegan dan lakukan langkah demi langkah. Apakah itu melakukan apa yang Anda harapkan?
rmaddy

Tidak ada yang terjadi saya tidak mendapatkan pesan kesalahan di konsol tidak yakin apa yang terjadi tetapi simulator saya kosong ... imgur.com/a/kip57Fg
Kris RaduhaSt

Apakah willConnectToyang disebut? Lalu apa yang terjadi? Apakah itu tidak membuat titik untuk membuat dan mengatur pengontrol tampilan root? Sekali lagi, langkah melalui kode dengan debugger. Jangan hanya mengandalkan output konsol.
rmaddy

Ya itu disebut dan `window.rootViewController = newViewcontroller window.makeKeyAndVisible () 'ini juga dijalankan tetapi saya melihat layar kosong pada simulator iOS 11-13.0 tetapi ketika saya pergi ke Target dan berubah menjadi 12.1 alih-alih 13.0 App berfungsi dengan baik.
Kris RaduhaSt

12

Jadi langkah-langkah untuk sampai ke iOS 13 dan versi yang lebih rendah

1) Ubah target penempatan ke iOS 12.

2) Ganti metode AppDelegate dengan apa yang seharusnya mereka miliki untuk pengembangan iOS 12. Tambahkan juga ini:

   var window: UIWindow?

3) Hapus SceneDelegate.

4) Hapus Aplikasi Scene Manifest di info.plist Anda.

Ini akan bekerja pada iOS 13 dan Versi iOS yang lebih rendah


Ini harus menjadi jawaban terbaik!
Kode Swifty

Jawaban terbaik ....
Subrata Mondal

1

Saya terjebak dengan masalah ini, dan akhirnya saya menyelesaikan menghapus referensi searchDisplayController dari 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>

2
Saya memiliki masalah serupa setelah membangun aplikasi untuk iOS 13 dengan Xcode 13. Aplikasi saya hanya menampilkan layar hitam setelah LaunchScreen. Ini hanya ketika menginstal dari Testflight. Memulai aplikasi di simulator atau dengan kabel (skema Debug and Release) mulai baik-baik saja. Juga iOS 12: masalah sama sekali. Melakukan: 'grep -r -i' searchDisplayController 'menunjukkan teks serupa di Main.storyboard. Setelah menghapus baris-baris ini dengan editor teks dan kompilasi ulang di Xcode 13, aplikasi sekarang mulai berfungsi dengan baik di iOS 13 yang diinstal dari TestFlight! Terima kasih @Erick Martinez.
Rodge

saya membuka sumber untuk main.storyboard dan searchDisplayController ini tidak ada lagi di sana ..
timman

1

Ketika saya memiliki masalah yang sama, itu disebabkan karena templat Aplikasi Tunggal yang dibuat menggunakan Xcode 11.0 tidak kompatibel dengan yang dibutuhkan untuk aplikasi yang dibuat dengan Xcode 11.2.

Jadi saya baru saja membuat Aplikasi Satu Halaman dengan Xcode 11.2 dan menyalin SceneDelegate yang dihasilkan ke proyek lama saya yang dibuat menggunakan Xcode 11.0.

Setelah itu, layar kosong menjadi antarmuka saya terlihat sekali lagi.

Diff


0

Langkah-langkah ini mudah diberas

1-) Hapus file delegasi adegan

2-) Tambahkan kode di bawah ini ke AppDelegate.swift

    class AppDelegate: UIResponder, UIApplicationDelegate {

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

3-) Hapus baris Manifes Adegan Aplikasi dari file .plist Anda masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.