SceneDelegate ekleyip Info.plist'i güncelledikten sonra bile Xcode 11 Black ekranında iOS13


10

Şu anda Xcode 11, Target iOS 13.0 (uygulama iOS 12.1'den 12.4'e kadar tüm aşağıdaki sürümlerle iyi çalışıyor) ile boş bir ekran alıyorum, Uygulamamın 12.1'in üzerindeki iOS kullanıcıları için çalışmasını istiyorum ve ayrıca 13.0 şu anda boş ekran alıyor varolan projeme aşağıdaki SceneDelegate'i ekleyerek ve AppManifest

Uygulama Bildirimi dosyası ekleme

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

Aşağıda, ilk çağrılan ve didFinishLaunchWithOptionsyöntemi uygulayan AppDelegate'im var . Nasıl bu yöntemi sadece benim Hedef ios 13.0 daha az ise ve 13.0 sonra rootViewController başlatmak için SceneDelegate yöntemi çağırmak nasıl yapabilirim bilmek istiyorum?

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

Yanıtlar:


28

Burada birkaç sorununuz var. İOS 13 altında neyin çağrıldığını ve iOS 12 altında neyin çağrıldığını belirten uygulama yaşam döngüsü ile ilgili belgeleri okumak önemlidir.

İOS 12 ve 13'ü destekleyen Tek Görünümlü Uygulama şablonumu da görmek isteyebilirsiniz .

Kodunuza baktığınızda, sorunların bir özeti aşağıda verilmiştir:

AppDelegate:

  • Ana pencereyi ve kök görünüm denetleyicisini yalnızca uygulama iOS 12 veya daha önceki bir sürümde çalıştırılıyorsa kurmalısınız. Bunu çalışma zamanında kontrol etmeniz gerekir.
  • func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)Yöntemi uygulamasıdır temsilci olmamalıdır.
  • Doğrudan ilişkili değil ancak uygulama başlangıcında asla uyumuyor. Thread.sleep(forTimeInterval: 3.0)Çizgiyi kaldırın . Kullanıcılar uygulamanızı kullanmak ister, başlatma ekranına gereğinden fazla bakmazlar. Uygulama başlangıcında ana iş parçacığının engellenmesi uygulamanızın öldürülmesine neden olabilir.

SceneDelegate:

  • Bu çoğunlukla iyidir, ancak guard let _ = (scene as? UIWindowScene) else { return }özellikle bu if letkontrolü yapan bir içeride olduğundan , hattın bir nedeni yoktur .
  • SwiftUI kullanıyor gibi görünmüyorsanız, bu içe aktarmayı kaldırın.

Uygulama temsilcinizi şu şekilde güncelleyeceğim:

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

Sahne temsilciniz şöyle olabilir:

@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
Çok teşekkür ederim. Gerçekten zaman ayırın ve cevap verin. Ne yazık ki, yukarıda belirtilen değişiklikleri yaptıktan sonra hala boş bir ekran
alıyorum

Çalışma zamanında kodunuzda gerçekte ne olur? Hata ayıklayıcı ile adım atın. willConnectToSahne temsilci yönteminde bir kesme noktasıyla başlayın ve adım adım ilerleyin. Beklediğinizi yapıyor mu?
rmaddy

Hiçbir şey olmuyor ne oluyor emin değilim konsolda herhangi bir hata mesajı alamadım ama simülatör boş gidiyor ... imgur.com/a/kip57Fg
Kris RaduhaSt

Is willConnectToaradı? O zaman ne olur? Kök görünüm denetleyicisini oluşturma ve ayarlama noktasına ulaşıyor mu? Yine, hata ayıklayıcı ile kod içinde adım. Sadece konsol çıkışına güvenmeyin.
rmaddy

Evet denir ve `window.rootViewController = newViewcontroller window.makeKeyAndVisible () 'bu da yürütülür, ancak iOS 11-13.0 simülatöründe boş bir ekran görürüm, ancak Hedef'e gidip 13.0 yerine 12.1'e geçtiğinizde Uygulama iyi çalışır.
Kris RaduhaSt

12

Bu yüzden bir iOS 13 ve daha düşük sürüme geçme adımları

1) Dağıtım hedefini iOS 12 olarak değiştirin.

2) AppDelegate'in yöntemlerini iOS 12 geliştirme için olması gereken yöntemlerle değiştirin. Ayrıca şunu ekleyin:

   var window: UIWindow?

3) SceneDelegate'i kaldırın.

4) info.plist 'inizden Uygulama Sahnesi Manifestini kaldırın.

Hem iOS 13 hem de daha düşük iOS Sürümünde çalışır


Bu en iyi cevap olmalı!
Swifty Codes

En iyi cevap ....
Subrata Mondal

1

Ben bu sorun ile sıkışmış ve nihayet storyboard searchDisplayController başvuruları kaldırma çözüldü.

<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
Xcode 13 ile iOS 13 için uygulamayı oluşturduktan sonra benzer bir sorun yaşadım. Uygulamam LaunchScreen'den sonra sadece siyah bir ekran gösteriyordu. Bu sadece Testflight'tan kurulum yaparken. Uygulamayı simülatörde veya bir kabloyla başlatmak (hata ayıklama ve serbest bırakma şeması) iyi başlıyordu. Ayrıca iOS 12: hiç sorun değil. Yapılması: 'grep -r -i' searchDisplayController 'Main.storyboard'da benzer metni gösterdi. Bu satırları bir metin düzenleyicisiyle kaldırdıktan ve Xcode 13'te yeniden derledikten sonra, uygulama şimdi TestFlight'tan yüklü iOS 13'te iyi başlıyor! Teşekkürler @Erick Martinez.
Rodge

main.storyboard için kaynak açtım ve bu searchDisplayController artık orada değil ..
timman

1

Benzer bir sorun yaşadığım için Xcode 11.0 kullanılarak oluşturulan Tek Uygulama şablonunun Xcode 11.2 ile oluşturulan bir uygulama için gerekli olanla uyumsuz olmasıydı.

Bu yüzden Xcode 11.2 ile yeni bir Tek Sayfa Uygulaması oluşturdum ve oluşturulan SceneDelegate'i Xcode 11.0 kullanılarak oluşturulan eski projeme kopyaladım.

Bundan sonra, boş ekran bir kez daha görünür bir arayüzüme gitti.

diff


0

Bu adımları kolayca takip edin

1-) Sahne delege dosyasını kaldırın

2-) AppDelegate.swift'e aşağıdaki kodu ekleyin

    class AppDelegate: UIResponder, UIApplicationDelegate {

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

3-) Application Scene Manifest satırını .plist dosyanızdan kaldırın resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.