Swift Universal Links 不调用 AppDelegate 的函数

问题描述 投票:0回答:1

我对 SwiftUI 还很陌生,缺乏经验。 这是我第一次尝试实现我的应用程序的通用链接,经过几个小时的调试,我仍然无法弄清楚为什么它不起作用。

我的 AASA 文件托管在 firebase 托管上,它使用 https,以 application/json 的形式交付,苹果的 cdn 按预期获取它。

我的文件看起来像这样

{
  "applinks": {
      "apps": [],
      "details": [
          {
              "appID": "TEAMID.BUNDLEID",
              "paths": [
                "/openApp",
                "/shareDeck/*"
              ]
          }
      ]
  }
}

但我也尝试了文档中显示的方式:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAMID.BUNDLEID",
        "components": [
          {
            "/": "/openApp/",
            "comment": "Matches open app url"
          },
          {
            "/": "/shareDeck/*",
            "comment": "Matches share deck url"
          }
        ]
      }
    ]
  }
}

该文件托管在 quiziqo.com/.well-known/apple-app-site-association 上,检查

https://app-site-association.cdn-apple.com/a/v1/quiziqo.com
我可以看到苹果的 CDN 已获取更新的文档。

在线使用 AASA 验证器,它表示我的文件一切正常。

当然,我将

applinks:quiziqo.com
添加到了项目的关联域中。 我还对运行应用程序的设备进行了诊断,并得到:

Service:              applinks
App ID:               TEAMID.BUNDLEID
App Version:          1.0
App PI:               <LSPersistentIdentifier 0xca28a2f50> { v = 0, t = 0x8, u = 0xabc, db = 61C39825-07F7-44EB-938B-C4288D0474FF, {length = 8, bytes = 0xbc0a000000000000} }
Domain:               quiziqo.com
Patterns:             {"/":"/openApp/"}, {"/":"/shareDeck/*"}
User Approval:        unspecified
Site/Fmwk Approval:   approved
Flags:                
Last Checked:         2023-08-07 17:47:13 +0000
Next Check:           2023-08-12 17:35:57 +0000

看来设备“批准”了该链接,并且应该可以工作。

如果我单击通用链接,它会正确打开应用程序,并在开发人员菜单中测试相同的链接,结果是“打开已安装的应用程序”,并带有关联的正确标识符。

问题是我需要在收到链接时运行一些代码,并使用它具有的查询参数。为了做到这一点,我有

func application(_ application: UIApplication,
                     continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
    {
        
        // Get URL components from the incoming user activity.
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
              let incomingURL = userActivity.webpageURL,
              let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true) else {
            return false
        }
        
        
        // Check for specific URL components that you need.
        guard let path = components.path,
              let params = components.queryItems else {
            return false
        }
        print("path = \(path)")
        
        
        if let token = params.first(where: { $0.name == "token" })?.value,
           let deckId = params.first(where: { $0.name == "deckId" })?.value {
            
            print("token = \(token)")
            print("deckId = \(deckId)")
            return true
            
            
            
        } else {
            print("Error")
            return false
        }
    }

在我的应用程序委托中。 当然,现在它应该只记录一些东西,但事实并非如此。即使应用程序在单击链接时启动,在此函数中设置的任何断点都不会被命中。 这是从苹果文档中复制的相同函数,我只更改了参数名称,其余的都完全相同。 即使在第一个守卫运行之前引入打印,也不会打印任何内容,这意味着该函数甚至没有被调用。

我尝试重新启动、清理构建文件夹、重新安装。不幸的是我没有其他设备可以尝试。 在模拟器中尝试也不起作用。

奇怪的是,当我每次打开链接时,并且只有在这种情况下,我都会得到

10.12.0 - [FirebaseFirestore][I-FST000001] WatchStream (11b018908) Stream error: 'Unavailable: Network connectivity changed'

我使用firebase,但通用链接功能与firebase没有任何关系。

我什至不知道还能尝试什么,我阅读了有关此的每一篇文章,但他们都没有给出适合我的解决方案。

我使用的是 Xcode 15 beta 5 和 iPadOS 17.0 开发者测试版。

功能

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

只要从通用链接打开应用程序就应该运行。

swiftui ios-universal-links
1个回答
0
投票

在 SwiftUI 中,使用下面的修饰符非常容易做到

   .onOpenURL { incomingURL in
                print("App was opened via URL: \(incomingURL)")
                handleIncomingURL(incomingURL)
            }
© www.soinside.com 2019 - 2024. All rights reserved.