在Universal Links的iOS App Search Programming Guide部分,苹果说:
如果你实例化一个SFSafariViewController,WKWebView,或UIWebView的对象来处理通用的链接,打开的iOS Safari浏览器中的网站,而不是使用您的应用。但是,如果用户从嵌入式SFSafariViewController,WKWebView,或UIWebView的对象中点击一个链接普及,iOS设备开启应用程式。
什么是“处理一个普遍联系”呢?我不能永远打开给定的URL与SFSafariViewController
,WKWebView
或UIWebView
?这是否只是-[UIApplicationDelegate application:continueUserActivity:restorationHandler:]
期间应用,或者是有到位超时?这是否意味着在SFSafariViewController
,WKWebView
,或UIWebView
我们永远不能打开的网址是什么?
我不知道我完全理解你的问题。
只是为了掩饰基础知识,我将让苹果解释what a Universal Link is:
通用链接让用户打开应用程序时,他们点击链接WKWebView和UIWebView的意见和Safari页面内你的网站,除了导致到的OpenURL一个电话:,如那些发生在Mail,短信,和其他应用程序的链接。
所以基本上,想象你的工作了Twitter客户端上,并通过时间轴去,你会遇到下面的YouTube视频链接鸣叫:https://youtu.be/ejQod8liXm0
如果你点击它,因为它是一个HTTP URL,你所期望的Safari浏览器中打开链接。但是,我认为,我们所有iOS开发者可以几乎都同意的事实,本机应用程序更好,所以更好的用户体验将是官方YouTube应用打开视频,甚至从你的第三方客户端。
这是“环球通”允许;如果YouTube应用本身在iOS上注册为负责处理https://www.youtube.com(*)的链接,大家在iOS的生态系统的好处,如果我们按照API规则的应用程序。如果你运行一个网站发生同样的事情,你想要的任何内容的触发你的官方iOS应用打开,如果你的用户已经安装它,或为用户提示,如果他们想安装一个更好的用户经验(以及帮助您的企业,当然)。
因此,所有的这一点的方式,让我们回到原来的文字:
如果你实例化一个SFSafariViewController,WKWebView,或UIWebView的对象来处理通用的链接,打开的iOS Safari浏览器中的网站,而不是使用您的应用。但是,如果用户从嵌入式SFSafariViewController,WKWebView,或UIWebView的对象中点击一个链接普及,iOS设备开启应用程式。
这意味着,如果从您的应用,用户点击一个通用链接到您的内容(例如:http://www.your-company.com/foo),并且没有经由例如正则表达式检测这在你的应用程序的代码,而是实例化一个SFSafariViewController
, WKWebView
或UIWebView
打开它,仿佛它是一个常规的链接The New York Times什么的,操作系统就会明白,而不是在你的应用中打开这个,你Safari处理这个要求。记住:通用链接的全部目的是为用户通过具有URL被本机应用程序来处理,而不是由浏览器获得更好的体验。
这是第一句话说什么。至于第二,它清除了一个潜在的后续问:如果用户从嵌入式浏览器从另一个应用程序,这不是我的水龙头上通用链接到我的内容?然后,这句话说,操作系统将正常:它会打开你的应用程序,尊重通用链接的规则。
TL; DR:你需要从你的应用程序检测的通用链接你的内容太,在代码中,并处理它们。 iOS版将不会为你处理这个问题。相反,如果你告诉OS从应用在嵌入式浏览器中打开一个通用链接到你的应用程序的内容,它会做完全一样叫。
编辑:如果您需要帮助,询问SFSafariViewController
或-openURL:options:completitionHandler:
API来打开一个URL,this link should help you之间做出决定;我的建议是先用-openURL:options:completitionHandler:
,如果它不成功,则使用SFSafariViewController
或相似。
希望这有助于和我理解正确你的问题。
干杯!而幸福的iOS编程11! :)
我决定用我下面的雨燕4类这个问题。如果可能的话它还采用嵌入式Safari浏览器。你可以按照你的情况类似的方法了。
import UIKit
import SafariServices
class OpenLink {
static func inAnyNativeWay(url: URL, dontPreferEmbeddedBrowser: Bool = false) { // OPEN AS UNIVERSAL LINK IF EXISTS else : EMBEDDED or EXTERNAL
if #available(iOS 10.0, *) {
// Try to open with owner universal link app
UIApplication.shared.open(url, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : true]) { (success) in
if !success {
if dontPreferEmbeddedBrowser {
withRegularWay(url: url)
} else {
inAnyNativeBrowser(url: url)
}
}
}
} else {
if dontPreferEmbeddedBrowser {
withRegularWay(url: url)
} else {
inAnyNativeBrowser(url: url)
}
}
}
private static func isItOkayToOpenUrlInSafariController(url: URL) -> Bool {
return url.host != nil && (url.scheme == "http" || url.scheme == "https") //url.host!.contains("twitter.com") == false
}
static func inAnyNativeBrowser(url: URL) { // EMBEDDED or EXTERNAL BROWSER
if isItOkayToOpenUrlInSafariController(url: url) {
inEmbeddedSafariController(url: url)
} else {
withRegularWay(url: url)
}
}
static func inEmbeddedSafariController(url: URL) { // EMBEDDED BROWSER ONLY
let vc = SFSafariViewController(url: url, entersReaderIfAvailable: false)
if #available(iOS 11.0, *) {
vc.dismissButtonStyle = SFSafariViewController.DismissButtonStyle.close
}
mainViewControllerReference.present(vc, animated: true)
}
static func withRegularWay(url: URL) { // EXTERNAL BROWSER ONLY
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [UIApplication.OpenExternalURLOptionsKey(rawValue: "no"):"options"]) { (good) in
if !good {
Logger.log(text: "There is no application on your device to open this link.")
}
}
} else {
UIApplication.shared.openURL(url)
}
}
}