如何以编程方式确定 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)
        }
    }
}