我已按照此文档设置通用链接。我认为我已经成功设置了所有内容,因为当我点击通用链接时,我的应用程序正在启动,并且我在 scene(_:willConnectTo:options:) 中收到 URL,如下所示:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
Log("SceneDelegate.scene(_:willConnectTo:options:)")
let userActivities: Set<NSUserActivity> = connectionOptions.userActivities
for userActivity in userActivities {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let universalLink = userActivity.webpageURL else {
Log("Not launched via universal links!")
return
}
Log(String(format: "userActivities = %@", String(describing: userActivity)))
Log(String(format: "universalLink = %@", universalLink.absoluteString))
// Update UI
}
}
但是,当我的应用程序在后台运行并使用通用链接时,我的应用程序会进入前台,但链接不会作为
NSUserActivity
对象传递到场景(_:继续:),如记录。
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
Log("SceneDelegate.scene(_:continue:)")
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let universalLink = userActivity.webpageURL else {
Log("Not launched via universal links!")
return
}
Log(String(format: "userActivities = %@", String(describing: userActivity)))
Log(String(format: "universalLink = %@", universalLink.absoluteString))
// Update UI
}
上述方法不会被调用,UI也不会更新。
这个stackoverflow答案也证实了我的理解,但我没有得到URL。这里缺少什么?
我向 AppleDTS 提出了 TSI,他们告诉我 scene(_:continue:) 方法适用于 UIKit 应用程序。对于 SwiftUI 应用程序,我们必须使用 onOpenURL(_:perform:) 视图修饰符来处理通用链接(以及其他基于 URL 的启动,如文件启动、深层链接等),如下所示。
WindowGroup {
ContentView()
.onOpenURL(perform: { (universalLink: URL) in
Log(String(format: "universalLink = %@", universalLink.absoluteString))
// Handle universal link
})
}