检查应用程序是否通过 iOS 上的今日小部件启动...?

Check if app launched via today widget on iOS...?

当我使用此方法从 Today Extension 打开 App 时:

open func open(_ URL: URL, completionHandler: ((Bool) -> Void)? = nil)

我的应用程序的生命周期是这样的:

这让我很烦,因为我想将我的 launchState 变量设置为 widget 并在我的 initial 中执行自定义逻辑 ViewController 如果 openURL 方法是最后一个触发的,我不能。

我该如何处理这种情况?

编辑:

用户可以从 Today Extension 或 Classic launch 打开应用程序。 在根 ViewController 的 viewDidLoad 中,我正在这样做:

fileprivate func prepareCityToLaunch() {

    switch launchState {
         case .widget:
             launchCity.getWidgetCity()
         case .classic:
             launchCity.getLaunchCity()
    }
}

这是一个枚举,默认设置为.classic,我在openURL方法中设置为.widget

此方法return适当的City对象请求感谢代表团。

我等不及 openURLNotification 因为在这个 viewController 我还不知道应用程序是从 Widget 还是从Classic launch 并且由于 launchState 默认设置为 classic,所以它将始终获取城市,就像 App 以 classic 方式启动一样。

这就是为什么我想先在 openURL 方法中设置 launchState,然后在我的 viewDidLoad 中一切都会正确设置。

可以理解吗?

您需要在 vc 中显示一个 loader/empty 值,然后使用 openURL 中的 NSNotificationCenter 来设置所需的值

在您的应用程序和小部件之间设置一个套件共享用户默认值以了解这一点并在指向应用程序的行之前为其赋值,并检查它在 [=22= 的 viewDidLoad 中的值] ,然后将其设置为 nil

这是一个更好的替代解决方案。 在 didFinishLaunchingWithOptions 中添加以下行并检查您今天的小部件的包标识符。

    if let value = launchOptions?[UIApplication.LaunchOptionsKey.sourceApplication] as? String, value == "com.company.app.todayWidget" {
        //Launched via today widget
    }