根本没有调用动态链接 Firebase 函数 Xcode 12?
Dynamic Links Firebase function not being called at all Xcode 12?
所以我有一个正在运行的动态 link,当我单击它时它会打开应用程序,但不会处理动态 link。这是因为从来没有进入下面看到的应用程序功能,我不确定为什么...
func handleIncomingDynamicLink(_ dynamicLink: DynamicLink){
guard let url = dynamicLink.url else {
print("That's weird. My dynamic link object has no url")
return
}
print("Your incoming link parameter is \(url.absoluteString)")
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let incomingURL = userActivity.webpageURL {
print("Incoming URL is \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else{
print("Found an error! \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
}
}
if linkHandled {
return true
} else {
return false
}
}
return false
}
任何帮助将不胜感激——这是否可能是 Firebase 本身的问题?
SwiftUI 1.0/场景代理
你做同样的事情,但在你的 SceneDelegate 中,跟随回调:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let incomingURL = userActivity.webpageURL {
print("Incoming URL is \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else{
print("Found an error! \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
}
}
}
SwiftUI 2.0/窗口组
使用 SwiftUI 2.0 life-cycle 您需要改用 .onContinueUserActivity
,比如
WindowGroup {
ContentView()
.onContinueUserActivity(<your_activity_type_here>) { userActivity in
if let incomingURL = userActivity.webpageURL {
print("Incoming URL is \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else{
print("Found an error! \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
}
}
}
}
}
SwiftUI 2.0 / @main App
对于新的 SwiftUI 2.0,您可以仅使用 SwiftUI 制作应用程序。这意味着您不使用 AppDelegate 或 SceneDelegate。然后,您必须使用 .onOpenURL 来获取在您单击 link 时调用的任何操作。我将其用于 Firebase 动态链接。
WindowGroup {
ContentView()
.onOpenURL { url in
// handle the URL that must be opened
let incomingURL = url
print("Incoming URL is: \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else {
print("Error found!: \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleDynamicLink(dynamicLink)
}
}
if linkHandled{
print("Link Handled")
return
}else{
print("NO linkHandled")
return
}
}
}
在 iOS 上配置 Firebase 动态链接有几个必须遵循的步骤。所以,我建议参考官方文档 here. Additionally, there is a Firecasts series that walks through all of the steps here.
我关注的是 Firecasts 系列,但我的设置略有不同;所以,我 运行 陷入了几个问题。首先,我使用的是自定义域。其次,我使用的是 SwiftUI。我只会解决我遇到的问题,所以请参阅完整的 Firecasts 系列以了解所有可怕的细节。
SwiftUI 2.0
您的应用需要处理两种不同类型的 link。首先,当您的应用已安装时(即 https://app.yourcustomdomain.com/...
),您的应用需要处理 link。其次,您的应用需要处理在安装应用之前复制到剪贴板的 link(即 com.your.bundle.id://google/link/...
)。
此外,您可能想要处理来自网络浏览器 (Safari) 的 links。在我的例子中,我从 QR 码扫描中处理 link。显然 NFC 标签扫描 links 也来自 Safari,但我无法证实这一点。
经过反复试验,我找到了一种使用 SwiftUI 处理所有这些问题的方法;目前尚不清楚这是否是官方推荐的方法,因此请谨慎行事。
首先,使用onOpenURL(perform:)
和.onContinueUserActivity(_,perform:)
:
var body: some Scene {
WindowGroup {
ContentView()
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb, perform: onWebBrowserActivity)
.onOpenURL(perform: onOpenURL)
}
}
其次,定义onContinueUserActivity
处理程序:
// Handles links originating from the web browser
func onWebBrowserActivity(_ userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL else {
return
}
onOpenURL(url)
}
三、定义onOpenURL
处理函数:
func onOpenURL(_ url: URL) {
let dynamicLinks = DynamicLinks.dynamicLinks()
if dynamicLinks.shouldHandleDynamicLink(fromCustomSchemeURL: url),
let dynamicLink = dynamicLinks.dynamicLink(fromCustomSchemeURL: url) {
handle(dynamicLink: dynamicLink)
} else {
handleUniversalLink(url: url)
}
}
上面提到的两种类型的 links 都被传递到 onOpenURL 处理程序中,所以这个 if 语句处理这两种情况。
最后,(正如其他人提到的)处理通用 links:
func handleUniversalLink(url: URL) {
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(url) { dynamicLink, error in
if let error = error {
print("Could not follow the dynamic link \(error.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handle(dynamicLink: dynamicLink)
}
}
if linkHandled {
print("Link handled")
} else {
print("Link not handled")
}
}
自定义域
我必须遵循自定义域设置说明 here。具体来说,我必须设置 Firebase 托管,这需要添加 A
DNS 记录(除了为动态链接 URL 前缀设置设置 TXT
DNS 记录之外)。另外,我必须在 Info.plist
中指定自定义域
<key>FirebaseDynamicLinksCustomDomains</key>
<array>
<string>https://app.yourcustomdomain.com</string>
</array>
所以我有一个正在运行的动态 link,当我单击它时它会打开应用程序,但不会处理动态 link。这是因为从来没有进入下面看到的应用程序功能,我不确定为什么...
func handleIncomingDynamicLink(_ dynamicLink: DynamicLink){
guard let url = dynamicLink.url else {
print("That's weird. My dynamic link object has no url")
return
}
print("Your incoming link parameter is \(url.absoluteString)")
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let incomingURL = userActivity.webpageURL {
print("Incoming URL is \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else{
print("Found an error! \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
}
}
if linkHandled {
return true
} else {
return false
}
}
return false
}
任何帮助将不胜感激——这是否可能是 Firebase 本身的问题?
SwiftUI 1.0/场景代理
你做同样的事情,但在你的 SceneDelegate 中,跟随回调:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let incomingURL = userActivity.webpageURL {
print("Incoming URL is \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else{
print("Found an error! \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
}
}
}
SwiftUI 2.0/窗口组
使用 SwiftUI 2.0 life-cycle 您需要改用 .onContinueUserActivity
,比如
WindowGroup {
ContentView()
.onContinueUserActivity(<your_activity_type_here>) { userActivity in
if let incomingURL = userActivity.webpageURL {
print("Incoming URL is \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else{
print("Found an error! \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleIncomingDynamicLink(dynamicLink)
}
}
}
}
}
SwiftUI 2.0 / @main App 对于新的 SwiftUI 2.0,您可以仅使用 SwiftUI 制作应用程序。这意味着您不使用 AppDelegate 或 SceneDelegate。然后,您必须使用 .onOpenURL 来获取在您单击 link 时调用的任何操作。我将其用于 Firebase 动态链接。
WindowGroup {
ContentView()
.onOpenURL { url in
// handle the URL that must be opened
let incomingURL = url
print("Incoming URL is: \(incomingURL)")
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else {
print("Error found!: \(error!.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handleDynamicLink(dynamicLink)
}
}
if linkHandled{
print("Link Handled")
return
}else{
print("NO linkHandled")
return
}
}
}
在 iOS 上配置 Firebase 动态链接有几个必须遵循的步骤。所以,我建议参考官方文档 here. Additionally, there is a Firecasts series that walks through all of the steps here.
我关注的是 Firecasts 系列,但我的设置略有不同;所以,我 运行 陷入了几个问题。首先,我使用的是自定义域。其次,我使用的是 SwiftUI。我只会解决我遇到的问题,所以请参阅完整的 Firecasts 系列以了解所有可怕的细节。
SwiftUI 2.0
您的应用需要处理两种不同类型的 link。首先,当您的应用已安装时(即 https://app.yourcustomdomain.com/...
),您的应用需要处理 link。其次,您的应用需要处理在安装应用之前复制到剪贴板的 link(即 com.your.bundle.id://google/link/...
)。
此外,您可能想要处理来自网络浏览器 (Safari) 的 links。在我的例子中,我从 QR 码扫描中处理 link。显然 NFC 标签扫描 links 也来自 Safari,但我无法证实这一点。
经过反复试验,我找到了一种使用 SwiftUI 处理所有这些问题的方法;目前尚不清楚这是否是官方推荐的方法,因此请谨慎行事。
首先,使用onOpenURL(perform:)
和.onContinueUserActivity(_,perform:)
:
var body: some Scene {
WindowGroup {
ContentView()
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb, perform: onWebBrowserActivity)
.onOpenURL(perform: onOpenURL)
}
}
其次,定义onContinueUserActivity
处理程序:
// Handles links originating from the web browser
func onWebBrowserActivity(_ userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL else {
return
}
onOpenURL(url)
}
三、定义onOpenURL
处理函数:
func onOpenURL(_ url: URL) {
let dynamicLinks = DynamicLinks.dynamicLinks()
if dynamicLinks.shouldHandleDynamicLink(fromCustomSchemeURL: url),
let dynamicLink = dynamicLinks.dynamicLink(fromCustomSchemeURL: url) {
handle(dynamicLink: dynamicLink)
} else {
handleUniversalLink(url: url)
}
}
上面提到的两种类型的 links 都被传递到 onOpenURL 处理程序中,所以这个 if 语句处理这两种情况。
最后,(正如其他人提到的)处理通用 links:
func handleUniversalLink(url: URL) {
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(url) { dynamicLink, error in
if let error = error {
print("Could not follow the dynamic link \(error.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
self.handle(dynamicLink: dynamicLink)
}
}
if linkHandled {
print("Link handled")
} else {
print("Link not handled")
}
}
自定义域
我必须遵循自定义域设置说明 here。具体来说,我必须设置 Firebase 托管,这需要添加 A
DNS 记录(除了为动态链接 URL 前缀设置设置 TXT
DNS 记录之外)。另外,我必须在 Info.plist
<key>FirebaseDynamicLinksCustomDomains</key>
<array>
<string>https://app.yourcustomdomain.com</string>
</array>