swift 未在ios 13中调用应用程序(...继续userActivity...)方法

wgmfuz8q  于 2023-03-11  发布在  Swift
关注(0)|答案(4)|浏览(244)

嗨,我正在使用UniversalLink的iOS应用程序.
Universal Link工作正常,但没有调用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中,此错误在控制台中打印。
无法结束后台任务:不存在标识符为1(0x1)的后台任务,或者该任务可能已结束。请在UIApplicationEndBackgroundTaskError()中中断以进行调试。
因此,这可能是问题的原因。
我真的很感激有人能帮我

unguejic

unguejic1#

我在X1 M0 N1 X和通用链接方面也遇到了类似的问题,在应用程序刚刚推出时,我无法访问NSUSerActivity(在这种情况下,iOS 13中的后台NFC阅读)。
正如@Jan的回答中提到的,continue userActivity现在位于SceneDelegate中。
如果应用程序正在运行或处于后台(即关闭),则通用链接将激发scene(_:continue:)委托。
如果应用程序不在后台,通用链接将不会从scene(_:continue:)代理中启动,而是从scene(_:willConnectTo:options:)中启动。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
o4tp2gmn

o4tp2gmn2#

在我的例子中,我在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和更低版本,你可能需要实现这两种方法。
希望这能帮上忙

qacovj5a

qacovj5a3#

对于SwiftUI应用程序,现在有另一种方法来处理通用链接或任何url,假设用户已经安装了该应用程序。
你可以简单地在你的主应用结构中的视图上使用.onOpenURL()修饰符。

struct MySwiftUIApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

    var body: some Scene {
        WindowGroup {
            MainContentView()
                .onOpenURL { url in
                    handleURL(url)
                }
        }
    }
}

和实现您自己的功能,例如:

@discardableResult func handleURL(_ url: URL) -> Bool {

}

来处理你想要的通用链接。
对于Differed深度链接,即处理安装前单击的链接,您仍需要实现SceneDelegate方法。

7gcisfzg

7gcisfzg4#

将此函数添加到SceneDelegate类中
函数场景(_场景:UIScene,继续用户活动:用户活动){如果设url =用户活动.网页URL {打印(url)}}

相关问题