如何以编程方式确定 URL 是通用 Link 还是普通网络 URL?
How can I programmatically determine if a URL is a Universal Link or just a regular web URL?
在 iOS 上,如何以编程方式确定 URL 是通用 Link 还是普通网络 URL?
假设您即将启动 URL http://www.yelp.com from your own iOS app. (http://www.yelp.com 是一个完全注册的通用 link。)
情况一)用户没有安装该应用程序 -> 您想要在 应用程序内 网络视图中向他们展示该网站。
情况二)用户确实安装了该应用程序 -> 您想要启动您的应用程序并深入link直接进入yelp 应用程序,使用 [[UIApplication sharedApplication] openURL:URL];而不是在应用程序中呈现网络视图。
问题是:
您所要做的就是字符串 url:“http://www.yelp.com” 您的目标是启动 yelp 应用程序(如果已安装但存在)如果未安装 yelp,则为应用内网页视图。
注1:本题只针对通用links。请不要给出使用 URL 方案的答案。
注2:本题不是专门启动yelp应用。该解决方案应该适用于任何 url 以确定它是否是已安装应用程序的通用 link。
你能做到吗?
使用UIApplicationOpenURLOptionUniversalLinksOnly
检测link是否通用
解决方法如下:
[[UIApplication sharedApplication] openURL:url
options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @YES}
completionHandler:^(BOOL success){
if(!success) {
// present in app web view, the app is not installed
}
}];
我用下面的 Swift 4 class 解决了这个问题。如果可能,它还会使用嵌入式 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)
}
}
}
在 iOS 上,如何以编程方式确定 URL 是通用 Link 还是普通网络 URL?
假设您即将启动 URL http://www.yelp.com from your own iOS app. (http://www.yelp.com 是一个完全注册的通用 link。)
情况一)用户没有安装该应用程序 -> 您想要在 应用程序内 网络视图中向他们展示该网站。
情况二)用户确实安装了该应用程序 -> 您想要启动您的应用程序并深入link直接进入yelp 应用程序,使用 [[UIApplication sharedApplication] openURL:URL];而不是在应用程序中呈现网络视图。
问题是: 您所要做的就是字符串 url:“http://www.yelp.com” 您的目标是启动 yelp 应用程序(如果已安装但存在)如果未安装 yelp,则为应用内网页视图。
注1:本题只针对通用links。请不要给出使用 URL 方案的答案。
注2:本题不是专门启动yelp应用。该解决方案应该适用于任何 url 以确定它是否是已安装应用程序的通用 link。
你能做到吗?
使用UIApplicationOpenURLOptionUniversalLinksOnly
解决方法如下:
[[UIApplication sharedApplication] openURL:url
options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @YES}
completionHandler:^(BOOL success){
if(!success) {
// present in app web view, the app is not installed
}
}];
我用下面的 Swift 4 class 解决了这个问题。如果可能,它还会使用嵌入式 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)
}
}
}