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

How can I use universal links when I call openURL inside my own app?

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

[[UIApplication sharedApplication] openURL:url];

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

阅读苹果文档我看到了这个:

It’s important to understand that if your app uses openURL: to open a universal link to your website, the link does not open in your app. In this scenario, iOS recognizes that the call originates from your app and therefore should not be handled as a universal link by your app.

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

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

我找到了 fast/dirty 解决方法。删除 openURL 并在我的应用每次使用 openURL:

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

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

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

也许您可以实现更漂亮的解决方案,例如独立 class LinkHandler。 class 可以确定 link 是否可以由您的应用程序处理(而不是使用应用程序的处理)。否则 class 会将此 link 传递给 iOS 处理 [UIApplication openURL:].

很多应用程序都这样做,想象一下 Google+ 或 Facebook iOS 应用程序将如何处理 link 发布在这些社交网络中的内容。

这里是swift4.2版本的Ricardo自己的解决方案

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