【问题标题】:Open link in Safari from UIWebView从 UIWebView 在 Safari 中打开链接
【发布时间】:2017-01-24 17:18:41
【问题描述】:

我要做的是在 Safari 中打开一个网站,方法是让用户点击我的 UIWebView 中显示的链接。

我首先阅读了以下问题/答案: Open specific link in Safari from UIWebView

之后我实现了以下内容:

class HomeInfoView: UIViewController, UIWebViewDelegate{

override func viewDidLoad() {
    super.viewDidLoad()

    let localfilePath = NSBundle.mainBundle().URLForResource("homeInfo", withExtension: "html");
    let myRequest = NSURLRequest(URL: localfilePath!);
    WebViewer.loadRequest(myRequest);
    WebViewer.scrollView.bounces = false
}


func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if let url = request.URL where navigationType == UIWebViewNavigationType.LinkClicked {
        UIApplication.sharedApplication().openURL(url)
        return false
    }
    return true
}

但是,当我尝试使用链接时,我仍然收到错误

“应用传输安全已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时异常。”

我想我已经完成了 90% 的工作,但我不确定如何编辑我的 .plist 以允许例外。或者,如果还有其他我错过的东西。

(我会将此作为评论添加到原始帖子中,但我的排名还不够高)

【问题讨论】:

    标签: swift safari uiwebview xcode7


    【解决方案1】:

    您需要在 info.plist 中授予对该特定域的权限:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>testdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
                <false/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <true/>
                <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSRequiresCertificateTransparency</key>
                <false/>
            </dict>
        </dict>
    </dict>
    

    您的 plist 中的此信息基本上会在您的应用中设置一个例外。它允许您访问testdomain.com 域(插入您尝试访问的任何域)。它允许您访问所有子域,然后设置最低 TLS 版本以帮助确保您连接的站点是您想要的站点。

    或者您可以简单地允许访问所有 http 网站,不建议这样做。

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    

    不建议这样做,因为它允许您的应用访问任何 http:// 域,这可能是一个安全问题,因为它会使您的应用容易受到中间人攻击。

    查看 Apple 的文档以获取更多信息。 https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

    【讨论】:

    • 您能否详细说明第一个的工作原理,为什么不推荐第二个?感谢您的帮助 :) 我对 Xcode/Swift 还是很陌生
    • 感谢编辑!额外的细节会有所帮助。我现在遇到的问题是链接在同一个 UIWebView 中打开,而不是在 Safari 中打开。有什么建议吗?
    • 你还有 UIApplication.sharedApplication().openURL 代码吗?
    • 检查以确保您正在输入此块if let url = request.URL where navigationType == UIWebViewNavigationType.LinkClicked { UIApplication.sharedApplication().openURL(url) return false }
    • 调试时代码是否进入if let块?如果未设置 url 变量,那么您的代码只需在 UIWebView 中加载请求。对于安全问题,由您决定。在最坏的情况下,黑客可能会伪装成该文档站点,然后向该用户请求信息,而他们却不知道自己在与谁交谈。
    猜你喜欢
    • 2023-03-10
    • 2016-04-16
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2014-03-18
    • 2011-12-01
    • 2018-07-20
    相关资源
    最近更新 更多