iOS 13 > 应用程序被终止且不在后台时,通用应用程序链接不起作用
Posted
技术标签:
【中文标题】iOS 13 > 应用程序被终止且不在后台时,通用应用程序链接不起作用【英文标题】:iOS 13 > Universal App Links does not work when app is killed and not in background 【发布时间】:2020-03-04 10:36:03 【问题描述】:知道为什么从 ios 13 开始,通过 Apple-App-Site-Association
定义的应用链接(通用链接)停止工作了吗?
我在 ApplicationDelegate 和 SceneDelegate 中有 2 个实现。 现在仅适用于 SceneDelegate 中的实现,并且仅当应用程序在后台时,如果我杀死应用程序,则不会调用 continueUserActivity 方法。我添加了触觉反馈来跟踪此方法调用,但它永远不会在 ActivityDelegate 或 SceneDelegate 中被调用。
// MARK: - Universal Links support
extension SceneDelegate
func scene(_ scene: UIScene, willContinueUserActivityWithType userActivityType: String)
print("[Scene] Will continue user activity: ", userActivityType)
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)
func scene(_ scene: UIScene, didFailToContinueUserActivityWithType userActivityType: String, error: Error)
print("[Scene] Did fail to continue user activity: ", userActivityType)
func scene(_ scene: UIScene, continue userActivity: NSUserActivity)
print("[Scene] Application continue user activity...")
if userActivity.activityType == NSUserActivityTypeBrowsingWeb
if let url = userActivity.webpageURL
if !present(url: url) UIApplication.shared.open(url, options: [:])
和Application Delegate案例
// MARK: - Universal Links support
extension AppDelegate
func application(_ application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool
print("[App] Will continue user activity: ", userActivityType)
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.warning)
return true
func application(_ application: UIApplication, didFailToContinueUserActivityWithType userActivityType: String, error: Error)
print("[App] Did fail to continue user activity: ", userActivityType)
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
print("[App] Application continue user activity...")
if userActivity.activityType == NSUserActivityTypeBrowsingWeb
if let url = userActivity.webpageURL
if !present(url: url) UIApplication.shared.open(url, options: [:])
return true
应用程序正在打开,但未调用方法,我无法导航到应用程序内的适当屏幕。
【问题讨论】:
【参考方案1】:好的,我发现你必须这样做
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
if let userActivity = connectionOptions.userActivities.first
self.scene(scene, continue: userActivity)
【讨论】:
【参考方案2】:对我来说,唯一的解决方案是删除 SceneDelegate 并将代码放入 AppDelegate 中,只要应用程序被终止或在后台运行,它就可以工作。 如果你不使用 SwiftUI,你可以删除 SceneDelegate
【讨论】:
所以你的解决方案是针对 UIKit 构建的应用程序,而不检查 SwiftUI【参考方案3】:对于没有 App 或 SceneDelegate 的 SwiftUI 2.0 用户。我的例子是关于 Firebase 通用链接,一旦打开它就应该做一些事情。您可以使用一个非常好的方法,称为 onOpenURL。
var body: some Scene
WindowGroup
ContentView(shouldPresentThankYouView: $shouldPresentThankYouView).onOpenURL url in
_ = DynamicLinks.dynamicLinks().handleUniversalLink(url) (dynamicLink, error) in
guard error == nil else
print("Found an error! \(error!.localizedDescription)")
return
if let dynamicLink = dynamicLink
shouldPresentThankYouView = true
self.handleIncomingDynamicLink(dynamicLink)
如果用户安装了应用程序,一旦他点击应用程序,就会出现感谢视图。希望它在使用 Firebase 链接更具体地处理通用链接时对您有所帮助。
【讨论】:
OP 没有询问 SwiftUI以上是关于iOS 13 > 应用程序被终止且不在后台时,通用应用程序链接不起作用的主要内容,如果未能解决你的问题,请参考以下文章
远程通知到达时哪个代表首先调用,而我的应用程序处于终止模式(不在后台)