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

时间:2019-10-03 07:56:42

标签: ios swift ios13

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

通用链接可以正常工作,但是不调用callback method

我的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模拟器中被调用。

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

仅在iOS13中,此错误会在控制台中显示。

  

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

所以,这可能是问题的原因。

我真的很感谢别人的帮助

2 个答案:

答案 0 :(得分:7)

就我而言,我在Xcode 11上启动了一个全新的项目,该项目使用SceneDelegateAppDelegate

类似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及更低版本,则可能需要实现这两种方法。

希望这会有所帮助

答案 1 :(得分:0)

我在SceneDelegate和通用链接中遇到了类似的问题,在应用程序刚启动时(在这种情况下,ios 13中的背景NFC读取),我无法进入NSUserActivity。

如@Jan的答案中所述,继续SceneDelegate中有userActivity。

如果应用正在运行或在后台运行,即关闭后,通用链接将触发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")
    }
}