动态链接在应用程序关闭时不起作用,仅在后台时起作用



我一直在努力在我的应用程序中包含动态链接。我已经设置了它,以便可以正确生成链接并正确接收链接,但它们仅在应用程序打开并在后台时有效。如果应用程序完全关闭,链接将只打开应用程序。看起来它没有在应用程序委托中调用继续用户活动方法,即使我在didFinishLaunchingWithOptions方法中返回TRUE。我已经读到我应该在didFinishLaunchingWithOptions方法中获取传入的URL,但是可用的答案不起作用并且已经过时,所以我希望有人知道。

代码如下:

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate{
var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FirebaseApp.configure()
return true
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

if let incomingURL = userActivity.webpageURL {

let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else {
print(error!.localizedDescription)
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
} else {
print("Something went wrong")
}
}
if linkHandled {
return true
} else {
return false
}
}
return false
}
func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) {
guard let url = dynamicLink.url else {
print("No incoming link")
return
}
print("Link is: (url)")
SystemManager.sharedInstance.setDeepLinkTrip(tripKey: deepLinkParser(link: url))

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "RootVC")
self.window?.rootViewController = initialViewController
}

那么,当应用程序这些天启动冷时,我该如何才能正确打开链接呢?感谢您的所有帮助:)

编辑:我已经更新了我的应用程序以使用SceneDelegate,所有其他答案都建议,但它仍然不起作用。如果在后台运行,它仍将打开动态链接,否则不会打开它们。看起来没有任何链接被发送到应用程序。我找不到任何用户活动,网址上下文等。

这是新的相关代码:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
//I read that this function should be handling the link when it is clicked while the app is dead, but nothing works. Basically this checks that the user is logged in (always is), then looks for a link.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

self.scene(scene, openURLContexts: connectionOptions.urlContexts)

guard let _ = (scene as? UIWindowScene) else { return }
if Auth.auth().currentUser != nil {

if let userActivity = connectionOptions.userActivities.first {
self.scene(scene, continue: userActivity)
} else {
self.scene(scene, openURLContexts: connectionOptions.urlContexts)
}

if let userActivity = connectionOptions.userActivities.first {
if let incomingURL = userActivity.webpageURL {
_ = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else { return }
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
}  else {
print("Something went wrong")
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "RootVC")
self.window?.rootViewController = initialViewController
}
}
}
} else {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "RootVC")
self.window?.rootViewController = initialViewController
}
}

}
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

if let url = URLContexts.first?.url {
_ = DynamicLinks.dynamicLinks().handleUniversalLink(url) { (dynamicLink, error) in
guard error == nil else { return }
if let dynamicLink = dynamicLink {
//your code for handling the dynamic link goes here
self.handleIncomingDynamicLink(dynamicLink)
}
}
}
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let incomingURL = userActivity.webpageURL {

_ = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else {
print(error!.localizedDescription)
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
} else {
print("Soemthing went wrong")
}
}
}
}

我想出了什么问题。该问题与 SceneDelegate 无关 - 我处理链接的方式被另一个网络调用覆盖。

由于从冷启动打开应用程序时看不到打印语句,我是如何解决这个问题的方法是将一条消息保存到 UserDefaults,然后创建一个弹出警报以在应用程序加载后阅读保存的消息。

最后,我确实需要通过AppDelegate迁移到SceneDelegate。

适用于:

  • 应用位于后台或前台

  • 应用程序已安装但已关闭

  • 应用程序未安装,单击Firebase Dynamiclink,从AppleStore下载,打开应用程序

    import UIKit
    import Firebase
    import FirebaseDynamicLinks
    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    //Call when app is close
    func scene(_ scene: UIScene,
    willConnectTo session: UISceneSession,
    options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
    if let incomingURL = userActivity.webpageURL {
    handleFirebaseDynamicLink(url: incomingURL)
    }
    }
    }
    // Call for a launched app after download from AppleStore
    func scene(_ scene: UIScene,
    openURLContexts URLContexts: Set<UIOpenURLContext>) {
    if let schemeURL = URLContexts.first?.url {
    handleFirebaseDynamicLinksFromScheme(schemeURL)
    }
    }
    // Call while runing
    func scene(_ scene: UIScene,
    continue userActivity: NSUserActivity) {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
    let url = userActivity.webpageURL else {
    return
    }
    handleFirebaseDynamicLink(url: url)
    }
    }
    // MARK: Private
    extension SceneDelegate {
    private func handleFirebaseDynamicLink(url: URL) {
    DynamicLinks.dynamicLinks()
    .handleUniversalLink(url) { dynamiclink, error in
    if let error = error {
    return
    }
    guard let dynamiclink = dynamiclink else {
    return
    }
    guard let url = dynamiclink.url else {
    return
    }
    self.handle(url: url)
    }
    }
    private func handleFirebaseDynamicLinksFromScheme(_ url: URL) {
    guard let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url),
    let url = dynamicLink.url else {
    return
    }
    handle(url: url)
    }
    

我无法对此进行测试,但它可以帮助在应用程序关闭时处理动态链接。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

if let userActivityDict = launchOptions?[.userActivityDictionary] as? [UIApplication.LaunchOptionsKey : Any],
let userActivity = userActivityDict[.userActivityType] as? NSUserActivity {
// execute the dynamic url code here using the userActivity
}
return true
}

最新更新