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 > 应用程序被终止且不在后台时,通用应用程序链接不起作用的主要内容,如果未能解决你的问题,请参考以下文章

远程通知到达时哪个代表首先调用,而我的应用程序处于终止模式(不在后台)

ios推送通知终止应用程序

后台获取 iOS - 已终止的应用程序

应用不在后台时无法识别 Firebase 动态链接 (iOS)

应用程序被终止时未收到推送通知 - iOS

iOS后台执行和防止应用程序被暂停/终止