当我在自己的应用程序中调用openURL时,如何使用通用链接?

时间:2017-10-19 16:04:58

标签: ios uiapplicationdelegate uiapplication ios-universal-links

我的应用在不同的屏幕中使用:

[[UIApplication sharedApplication] openURL:url];

打开从我的网络服务收到的网址。 有时,这些URL与我的项目无关,因此打开它们到Safari是可以的。其他人,这些URL属于我自己的,就像产品细节一样。那些可以通过我的应用程序使用通用链接打开并转到正确的屏幕,但这没有发生。

阅读苹果文档我看到了:

  

了解如果您的应用使用openURL非常重要:要打开指向您网站的通用链接,该链接无法在您的应用中打开。在这种情况下,iOS会识别出来自您的应用的呼叫,因此您的应用不应将其作为通用链接处理。

https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

这种行为让我感到困惑。如何使用openURL尝试首先处理我的应用程序中的URL,而不是直接进入Safari?

我找到了一个快速/肮脏的解决方法。删除openURL并在我的应用每次使用openURL时使用它:

NSUserActivity* userActivity = [[NSUserActivity alloc] initWithActivityType:NSUserActivityTypeBrowsingWeb];
userActivity.webpageURL = url;
[[UIApplication sharedApplication].delegate application:[UIApplication sharedApplication] continueUserActivity:userActivity restorationHandler:nil];

请注意,我的appdelegate应用程序:continueUserActivity:restorationHandler:将在我的应用程序中转发给openURL任何没有特定屏幕的URL,因此,它工作得很好,但我觉得这是一个糟糕的解决方案。

2 个答案:

答案 0 :(得分:3)

您的解决方案似乎合理。为什么那么可怕?

可能你可以实现更好看的解决方案,比如独立的类LinkHandler。该类可以识别您的应用程序是否可以处理链接(而不是它将使用应用程序的处理)。否则,类会将此链接传递给使用[UIApplication openURL:]的iOS处理。

许多应用这样做,想象一下Google+或Facebook iOS应用程序如何处理这些社交网络中发布的链接。

答案 1 :(得分:2)

这是里卡多自己的解决方案的快速4.2版本

let userActivity =  NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb)
userActivity.webpageURL = url;
UIApplication.shared.delegate?.application?(UIApplication.shared, continue: userActivity, restorationHandler: { _ in })