【问题标题】:Check if app launched via today widget on iOS...?检查应用程序是否通过 iOS 上的今日小部件启动...?
【发布时间】:2019-07-22 12:14:09
【问题描述】:

当我用这种方法从我的Today Extension 打开App 时:

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

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

  • didFinishLaunchingWithOptions
  • viewDidLoad(初始 ViewController)
  • 打开网址

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

我该如何处理这种情况?

编辑:

用户可以从 Today Extension 或 Classic 启动中打开应用。 在 rootViewController 的 viewDidLoad 中,我正在这样做:

fileprivate func prepareCityToLaunch() {

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

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

此方法返回适当的City 对象以请求感谢委托。

我不能等待来自openURLNotification,因为在这个viewController 中我还不知道应用程序是从Widget 还是从Classic 启动打开的,并且因为已设置launchState默认为classic,总是获取城市,就好像App以classic方式启动一样。

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

可以理解吗?

【问题讨论】:

    标签: ios swift today-extension openurl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这是我寻求的解决方案(UserDefaults)。感谢您确认这是正确的方法。
      • 这更像是一种黑客行为。查看我的答案以获得确切的解决方案。 @平衡
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多