在 Safari 中快速打开链接

Posted

技术标签:

【中文标题】在 Safari 中快速打开链接【英文标题】:Swift Open Link in Safari 【发布时间】:2014-11-14 17:19:20 【问题描述】:

我目前正在WebView 中打开我的应用程序中的链接,但我正在寻找在 Safari 中打开链接的选项。

【问题讨论】:

【参考方案1】:

它不是“融入 Swift”,但您可以使用标准的 UIKit 方法来做到这一点。看看 UIApplication 的 openUrl(_:) (deprecated)open(_:options:completionHandler:)

Swift 4 + Swift 5(iOS 10 及以上)

guard let url = URL(string: "https://***.com") else  return 
UIApplication.shared.open(url)

Swift 3(iOS 9 及更低版本)

guard let url = URL(string: "https://***.com") else  return 
UIApplication.shared.openURL(url)

斯威夫特 2.2

guard let url = URL(string: "https://***.com") else  return 
UIApplication.sharedApplication().openURL(url)    

【讨论】:

如果我们添加一些这样的购买URL,应用商店是否有机会? ios 10.0 中,您现在必须添加选项和处理程序:UIApplication.shared.open(URL(string:"google.com")!, options: [:], completionHandler: nil) @gabicuesta 你其实不用提供options和completionHandler,它们分别默认为[:]和nil 如果将“默认浏览器”设置为其他,如 Google Chrome 等,iOS14 不会在 Safari 中打开链接。【参考方案2】:

为 Swift 4 更新:(感谢 Marco Weber)

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") 
     UIApplication.shared.openURL(requestUrl as URL) 

或者使用 guard 来使用更多的 swift 风格:

guard let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") else 
    return


UIApplication.shared.openURL(requestUrl as URL) 

斯威夫特 3:

您可以通过以下方式隐式检查 NSURL 为可选:

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") 
     UIApplication.sharedApplication().openURL(requestUrl)

【讨论】:

阿米特,不,因为它是明确完成的,正如我已经解释的那样,如果让 requestUrl = ... 保证 requestUrl 存在 是的,有很多方法可以做事。了解为什么你应该在某种情况下使用某些代码,而不是成为一个固执的小子,说“我是对的,所以你错了”的心态。好像你是编程新手,这是我给你的孩子的建议。 Amit:不,它不起作用,你完全错了。在 Swift 2 或 1.2 中。难怪 requestUrl 不是可选的,所以你不能用 ! 解开它。 我比 Mike S 的方法更喜欢这种方法,因为您在发送请求之前会进行 nil 检查。 为 Swift4 更新:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") UIApplication.shared.openURL(requestUrl as URL) 【参考方案3】:

在 Swift 1.2 中:

@IBAction func openLink     
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth)
        UIApplication.sharedApplication().openURL(url)

【讨论】:

【参考方案4】:

在 Swift 2.0 中:

UIApplication.sharedApplication().openURL(NSURL(string: "http://***.com")!)

【讨论】:

【参考方案5】:

iOS 9 及更高版本的新功能可以向用户显示SFSafariViewController(请参阅文档here)。基本上,您可以获得将用户发送到 Safari 的所有好处,而无需让他们离开您的应用程序。要使用新的 SFSafariViewController,只需:

import SafariServices

在事件处理程序中的某处向用户呈现 Safari 视图控制器,如下所示:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)

Safari 视图将如下所示:

【讨论】:

这太棒了。谢谢!每个想要在应用程序扩展中显示 Safari 浏览器的人都应该使用此代码。禁止访问应用扩展中的sharedApplication 属性。更多信息:developer.apple.com/library/archive/documentation/General/… 出色的解决方案 Apple 有时会拒绝应用商店中使用旧的 openURL 方法的应用。现在这应该是首选解决方案。【参考方案6】:

Swift 3 和 IOS 10.2

UIApplication.shared.open(URL(string: "http://www.***.com")!, options: [:], completionHandler: nil)

Swift 3 和 IOS 10.2

【讨论】:

但请注意,使用此版本将停止您的应用在 iOS 9 及之前的版本上运行,除非您对其进行版本检查【参考方案7】:

从 iOS 10 开始你应该使用:

guard let url = URL(string: linkUrlString) else 
    return

    
if #available(iOS 10.0, *) 
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
 else 
    UIApplication.shared.openURL(url)

【讨论】:

【参考方案8】:

IOS 11.2 Swift 3.1-4

let webView = WKWebView()

override func viewDidLoad() 
    super.viewDidLoad()
    guard let url = URL(string: "https://www.google.com") else  return 
    webView.frame = view.bounds
    webView.navigationDelegate = self
    webView.load(URLRequest(url: url))
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)


func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 
    if navigationAction.navigationType == .linkActivated  
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.google.com"),
            UIApplication.shared.canOpenURL(url) 
            UIApplication.shared.open(url)
            print(url)
            print("Redirected to browser. No need to open it locally")
            decisionHandler(.cancel)
         else 
            print("Open it locally")
            decisionHandler(.allow)
        
     else 
        print("not a user click")
        decisionHandler(.allow)
    

【讨论】:

【参考方案9】:

斯威夫特 5

Swift 5: Check using canOpneURL if valid then it's open.

guard let url = URL(string: "https://iosdevcenters.blogspot.com/") else 
     return


if UIApplication.shared.canOpenURL(url) 
     UIApplication.shared.open(url, options: [:], completionHandler: nil)

【讨论】:

如何验证并避免重新打开已打开的应用程序 Safari。启动时出现警告/错误LAUNCH: Launch failure with -10652/ <FSNode 0x10d50cf90> isDir = y, path = '/Applications/Safari.app' 【参考方案10】:

斯威夫特 5

if let url = URL(string: "https://www.google.com") 
    UIApplication.shared.open(url)

【讨论】:

以上是关于在 Safari 中快速打开链接的主要内容,如果未能解决你的问题,请参考以下文章

在 Safari 中打开其他网站的 WKWebView 链接

完全防止 iOS Web 应用在移动 Safari 中打开链接,即使链接包含参数

无法使用 WKWebView 在 Safari 中打开外部链接

强制 iOS 应用在 Safari 中打开外部链接

Xcode快速链接到Facebook页面[关闭]

当我单击 UIWebView 时,如何在 Safari 中打开链接?