AppDelegate и SceneDelegate при поддержке iOS 12 и 13 - PullRequest
2 голосов
/ 16 октября 2019

Мне нужно поддерживать iOS 12 и iOS 13.

Должен ли я дублировать код между AppDelegate и SceneDelegate?

Например:

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

    window.rootViewController = HomeViewController()
    window.makeKeyAndVisible()

    self.window = window
}

и

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let window = UIWindow(frame: UIScreen.main.bounds)
    window.rootViewController = HomeViewController()
    window.makeKeyAndVisible()

    self.window = window

    return true
}

Если я этого не сделаю, в 1 версии у меня будет черный экран, но если я это сделаю и напечату метод viewDidLoad из HomeViewController, я смогу это увидетьвызывается дважды.

Я обновляю свой didFinishLaunchingWithOptions и вижу, что в iOS13 он все еще вызывается дважды.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    guard #available(iOS 12, *) else { return true }

    let window = UIWindow(frame: UIScreen.main.bounds)
    window.rootViewController = HomeViewController()
    window.makeKeyAndVisible()

    self.window = window

    return true
}

1 Ответ

1 голос
/ 16 октября 2019

Вам нужно продублировать код, но вы должны убедиться, что он работает только в правильной системе. В iOS 13 вы не хотите, чтобы приложение делегировало код тела didFinishLaunching, поэтому используйте проверку доступности, чтобы предотвратить это. Точно так же используйте доступность, чтобы скрыть содержимое сцены окна от iOS 12.

Вот базовый эскиз решения, которое корректно работает как на iOS 12, так и на iOS 13:

AppDelegate.Swift

import UIKit
@UIApplicationMain
class AppDelegate : UIResponder, UIApplicationDelegate {
    var window : UIWindow?
    func application(_ application: UIApplication,
        didFinishLaunchingWithOptions 
        launchOptions: [UIApplication.LaunchOptionsKey : Any]?)
        -> Bool {
            if #available(iOS 13, *) {
                // do only pure app launch stuff, not interface stuff
            } else {
                self.window = UIWindow()
                let vc = ViewController()
                self.window!.rootViewController = vc
                self.window!.makeKeyAndVisible()
                self.window!.backgroundColor = .red
            }
            return true
    }
}

SceneDelegate.swift

import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window : UIWindow?
    func scene(_ scene: UIScene,
        willConnectTo session: UISceneSession,
        options connectionOptions: UIScene.ConnectionOptions) {
            if let windowScene = scene as? UIWindowScene {
                self.window = UIWindow(windowScene: windowScene) 
                let vc = ViewController()                      
                self.window!.rootViewController = vc             
                self.window!.makeKeyAndVisible()                 
                self.window!.backgroundColor = .red
            }
    }
}

ViewController.swift

import UIKit
class ViewController : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("view did load")
        self.view.backgroundColor = .green
    }
}

Обратите внимание, что работать с другими дубликатами, такими как активация приложения, намного проще, потому чтоесли вы поддерживаете оконные сцены, метод делегата приложения не будет вызываться в iOS 12. Таким образом, проблема ограничена этой единственной ситуацией, а именно, когда у вас есть манипуляции с контроллером оконного / корневого представления для выполнения при запуске (например, без раскадровки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...