从 swift 4 中的 Today 扩展程序打开时包含应用程序崩溃

Containing App crashes when opened from Today extension in swift 4

我有一个 swift 应用程序,我有一个今天的扩展程序,它有一个按钮可以打开包含的应用程序。

当应用程序在最近的列表中时,按钮可以完美地打开应用程序,但当应用程序从最近的列表中移出时,按钮会崩溃。

也没有崩溃日志

这是我在应用委托上的代码:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    var mainViewController : MainViewController!
    mainViewController = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers[1].childViewControllers[0] as! MainViewController

    if url.scheme == "open"
    {
        switch url.host
        {
        case "1"?:
            mainViewController.isTaxi = true
            break
        case "2"?:
           mainViewController.isPfp = true
            break
        case "3"?:
           mainViewController.isDarbi = true
            break
        default:
            break
        }
    }
    return true
}

这是我在主界面打开的方式 VC :

var isTaxi : Bool? {
    didSet{
        if UserDefaults.getUser() != nil {
            self.taxiRegViewController.show()
        } else {
            self.taxiNotRegViewController.show()
        }
    }
}

这是我在扩展程序中触发点击事件的地方:

@IBAction func bookTaxiTapped(_ sender: UIButton) {
    if let url = URL(string: "open://\(sender.tag)")
    {
        self.extensionContext?.open(url, completionHandler: nil)
    }
}

我通过像这样修改应用委托的方法解决了我的问题:

实际问题是:我们有 SWRevealViewController,它必须在调用其他视图控制器之前启动

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    var mainViewController : MainViewController!
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyBoard = UIStoryboard(name: "Main", bundle: nil)

    let viewController = storyBoard.instantiateViewController(withIdentifier: "swRevealController") as! SWRevealViewController
    mainViewController = storyBoard.instantiateViewController(withIdentifier: "mainView") as! MainViewController
    self.window?.rootViewController = viewController
    self.window?.makeKeyAndVisible()

    viewController.setFront(mainViewController, animated: true)


    if url.scheme == "open"
    {
        switch url.host
        {
        case "1"?:
            mainViewController.isTaxi = true
            break
        case "2"?:
           mainViewController.isPfp = true
            break
        case "3"?:
           mainViewController.isDarbi = true
            break
        default:
            break
        }
    }
    return true
}