在iOS上,如何以编程方式确定网址是通用链接还是常规网址?
我们假设您要从自己的iOS应用中启动网址http://www.yelp.com。 (http://www.yelp.com是完全注册的通用链接。)
案例一)用户未安装应用程序 - >您想要在 IN-APP 网络视图中向他们展示网站。
案例二)用户确实安装了应用程序 - >您希望从应用中启动并使用[[UIApplication sharedApplication] openURL:URL]直接深入链接到yelp应用程序;而不是在应用程序中显示webview。
以下是问题: 您可以使用的是字符串网址:" http://www.yelp.com" 您的目标是启动yelp应用程序(如果已安装),但会显示应用内网页视图如果没有安装yelp。
注1:此问题仅与通用链接有关。请不要给出使用URL Schemes的答案。
注2:这个问题不是专门启动yelp应用程序。该解决方案应适用于任何网址,以确定它是否是已安装应用的通用链接。
你能做到吗?答案 0 :(得分:3)
使用UIApplicationOpenURLOptionUniversalLinksOnly
以下是解决方案:
[[UIApplication sharedApplication] openURL:url
options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @YES}
completionHandler:^(BOOL success){
if(!success) {
// present in app web view, the app is not installed
}
}];
答案 1 :(得分:0)
我在下面的Swift 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)
}
}
}