如何以编程方式确定网址是通用链接还是常规网址?

时间:2017-01-10 22:14:18

标签: ios ios-universal-links

在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应用程序。该解决方案应适用于任何网址,以确定它是否是已安装应用的通用链接。

你能做到吗?

2 个答案:

答案 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)
        }
    }
}