在iOS 13中未调用application(... continue userActivity ...)方法


11

嗨,我正在使用UniversalLink制作ios应用。

Universal Link可以正常工作,但是不调用回调方法

我的AppDelegate.swift在下面。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }


    func application(_ application: UIApplication,
                     willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }

    // this method not called!!
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        print("called")
        return true
    }
}

该方法在iOS 12 Simulator中被调用。

因此,仅在iOS 13中会出现此问题。

仅在iOS13中,此错误会在控制台中打印。

无法结束BackgroundTask:不存在标识符为1(0x1)的后台任务,或者它可能已经结束。中断UIApplicationEndBackgroundTaskError()进行调试。

因此,这可能是问题的原因。

我真的很感谢别人的帮助


3
我也
遇到

2
关于此问题有任何更新吗?
jfredsilva

1
有人找到解决此问题的方法吗?
1

@EmreÖnder我找到了一种解决方案(检查答案)。希望这是您的相同问题
1

@jfredsilva我找到了一种解决方案(检查答案)。希望这是您的相同问题
1

Answers:


10

就我而言,我开始的Xcode 11一个全新的项目,该项目使用SceneDelegate以及AppDelegate

看起来UniversalLinks(可能还有其他几个API)在上使用了此回调SceneDelegate

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { }

代替此回调AppDelegate

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { }

一旦我实现了这一点,SceneDelegate一切都会再次按预期工作。我还没有尝试过,但是我假设如果您的目标是iOS 12及更低版本,则可能需要实现这两种方法。

希望这可以帮助


这也没醒。Apple确认了iOS 13中的问题。当然,他们不会解决此问题。
德米特里


2
太好了,我在funcDelegate中放了func scene(_ scene:UIScene,continue userActivity:NSUserActivity){},现在绝对可以正常工作@Jan,有什么办法可以避免这种通过AppDelegate和SceneDelegate复制代码的情况吗?谢谢
Jigar

@Jigar我不认为您现在甚至不需要AppDelegate中的代码
1

@Jan我删除了SceneDelegate,在那之后一切正常。
Jigar

3

我在SceneDelegate通用链接上遇到了类似的问题,该应用程序刚启动时无法到达NSUserActivity(在这种情况下,ios 13中的Background NFC阅读)。

如@Jan的答案中所述,继续userActivity现在在中SceneDelegate

如果应用正在运行或在后台运行,即。如果关闭,则通用链接将触发该scene(_:continue:)委托。

如果应用程序不在后台,则通用链接不会从scene(_:continue:)委托启动。而是NSUserActivity可以从下载scene(_:willConnectTo:options:)。例如。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.