我对 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 中,使用下面的修饰符非常容易做到
.onOpenURL { incomingURL in
print("App was opened via URL: \(incomingURL)")
handleIncomingURL(incomingURL)
}