我什么时候可以使用SFSafariViewController,WKWebView,或UIWebView的带有普遍性的联系?

问题描述 投票:20回答:2

Universal LinksiOS App Search Programming Guide部分,苹果说:

如果你实例化一个SFSafariViewController,WKWebView,或UIWebView的对象来处理通用的链接,打开的iOS Safari浏览器中的网站,而不是使用您的应用。但是,如果用户从嵌入式SFSafariViewController,WKWebView,或UIWebView的对象中点击一个链接普及,iOS设备开启应用程式。

什么是“处理一个普遍联系”呢?我不能永远打开给定的URL与SFSafariViewControllerWKWebViewUIWebView?这是否只是-[UIApplicationDelegate application:continueUserActivity:restorationHandler:]期间应用,或者是有到位超时?这是否意味着在SFSafariViewControllerWKWebView,或UIWebView我们永远不能打开的网址是什么?

ios uiwebview wkwebview applinks sfsafariviewcontroller
2个回答
6
投票

我不知道我完全理解你的问题。

只是为了掩饰基础知识,我将让苹果解释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),并且没有经由例如正则表达式检测这在你的应用程序的代码,而是实例化一个SFSafariViewControllerWKWebViewUIWebView打开它,仿佛它是一个常规的链接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
投票

我决定用我下面的雨燕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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.