Obecnie otrzymuję 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, jak i 13.0 obecnie wyświetla pusty ekran pomimo dodając poniższy SceneDelegate do mojego istniejącego projektu i
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 }
}
}
}
Oto moja AppDelegate, która jest wywoływana jako pierwsza i wykonuje didFinishLaunchWithOptions
metodę. Chcę 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ć 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
}
}
willConnectTo
metodzie delegowania sceny i przejdź krok po kroku. Czy robi to, czego oczekujesz?willConnectTo
nazywa? Co się wtedy stanie? Czy ma to sens tworzenia i ustawiania kontrolera widoku głównego? Ponownie przejdź przez kod za pomocą debugera. Nie polegaj tylko na wynikach konsoli.Więc kroki, aby dostać się do iOS 13 i niższej wersji
1) Zmień cel wdrażania na iOS 12.
2) Zastąp metody AppDelegate tym, co powinny mieć do opracowania iOS 12. Dodaj także:
3) Usuń SceneDelegate.
4) Usuń manifest sceny aplikacji z listy info.plist.
Będzie działać zarówno na iOS 13, jak i niższej wersji iOS
źródło
Utknąłem z tym problemem i wreszcie rozwiązałem usuwanie odwołań do searchDisplayController z scenorysu.
źródło
Kiedy miałem podobny problem, było to spowodowane tym, że szablon jednej aplikacji wygenerowany przy użyciu Xcode 11.0 był niezgodny z tym, który jest potrzebny dla aplikacji zbudowanej z Xcode 11.2.
Właśnie utworzyłem nową aplikację jednostronicową z Xcode 11.2 i skopiowałem wygenerowany SceneDelegate do mojego starego projektu, który został utworzony przy użyciu Xcode 11.0.
Potem zniknął pusty ekran i mój interfejs znów był widoczny.
źródło
Z łatwością odłóż te kroki
1-) Usuń plik delegowania sceny
2-) Dodaj poniższy kod do AppDelegate.swift
3) Usuń wiersz manifestu sceny aplikacji z pliku .plist
źródło