当我用此方法从我的
App
打开 Today Extension
时:
open func open(_ URL: URL, completionHandler: ((Bool) -> Void)? = nil)
我的应用程序的生命周期是这样的:
这让我很烦恼,因为我想将
launchState
变量设置为 widget 并在我的 initial ViewController
中执行自定义逻辑,如果 openURL
方法是最后一个触发的方法,我就不能这样做。
我该如何处理这种情况?
编辑:
用户可以从 Today Extension 或 Classic launch 打开应用程序。 在 rootViewController 的
viewDidLoad
中,我正在这样做:
fileprivate func prepareCityToLaunch() {
switch launchState {
case .widget:
launchCity.getWidgetCity()
case .classic:
launchCity.getLaunchCity()
}
}
这是一个枚举,默认情况下它设置为
.classic
,我在openURL方法中将其设置为.widget
。
此方法返回适当的
City
对象以请求感谢委托。
我等不及来自
Notification
的 openURL
,因为在这个 viewController
中,我还不知道应用程序是从 Widget
还是从 Classic
启动打开,并且因为 launchState 设置为经典默认情况下,它总是会获取城市,就像应用程序以经典方式启动一样。
这就是为什么我想首先在 openURL 方法中设置 launchState,然后在我的 viewDidLoad 中所有内容都已正确设置。
可以理解吗?
这是一个替代的更好的解决方案。 在
didFinishLaunchingWithOptions
中添加以下行并检查今日小部件的包标识符。
if let value = launchOptions?[UIApplication.LaunchOptionsKey.sourceApplication] as? String, value == "com.company.app.todayWidget" {
//Launched via today widget
}
您需要在 vc 中显示加载程序/空值,然后使用
NSNotificationCenter
中的 openURL
设置所需的值
或
在您的应用程序和小部件之间设置套件共享用户默认值以了解这一点,并在指向应用程序的行之前给它一个值,并检查 vc 的
viewDidLoad
内的值,然后将其设置为 nil
使用 SwiftUI 时,添加
.widgetURL(deeplinkURL)
并在主应用程序的 SceneDelegate
中处理它。
struct MyWidget: View {
private static let deeplinkURL = URL(string: "some-deeplink-scheme://optionalOtherStuff")!
var body: some View {
Text(entry.date, style: .time)
.widgetURL(deeplinkURL)
}
}
另请确保将该自定义 URL 方案添加到应用程序目标信息选项卡内
URL Types
下的项目设置中
有关更完整的答案,请参阅https://stackoverflow.com/a/63715553/1898677 和https://www.donnywals.com/handling-deeplinks-in-your-app/