【问题标题】:Limit UIWebView to specific URL (Swift)将 UIWebView 限制为特定 URL (Swift)
【发布时间】:2015-02-12 09:21:24
【问题描述】:

我正在尝试开发一个在 Swift 中具有 UIWebView 的 iOS 应用程序,但是我需要它仅适用于一个域,并且在该 UIWebView 中单击的任何外部链接都可以在 Safari 中打开。 (例如,所有指向 http://example.com 的链接都将在 UIWebView 中打开,但指向 http://twitter.com 的链接将在 Safari 中打开)。

我在网上找到了几个解决方案,但唯一的 Swift 版本(在此处找到:UIWebView open links in Safari)可以打开 Safari 中的每个链接,我只希望外部链接这样做。

有人可以帮忙吗? 谢谢。

【问题讨论】:

  • 您链接到的答案显示了解决方案的基础知识 - 您只需检查请求 url 中的主机以决定是否应该返回 YES 或 NO 并在 safari 中打开 URL

标签: ios xcode uiwebview safari


【解决方案1】:

@MattFlier 的解决方案是正确的,但不能使用最新的 Swift 编译器进行编译。解包 NSURLRequest URL 属性很重要,因此更新后的解决方案是:

func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
        if (request.URL!.host! == "example.com"){
            return true
        } else {
            UIApplication.sharedApplication().openURL(request.URL!)
            return false
        }
    }
    return true
}

是的,要连接它,您可以 Control+Drag 您的 UIWebView 到表示视图的 UIViewController,然后确保委托函数的名称与“IBOutlet weak var”相同,就像这样

需要确保您的视图控制器实现UIWebViewDelegate

class OfferDetailViewController : UIViewController, UIWebViewDelegate
{
    ...

然后在您的 viewDidLoad() 方法中,您还需要像这样分配委托:

override func viewDidLoad() {
    self.webView.delegate = self;
}

【讨论】:

    【解决方案2】:

    我的 Swift 一定比我想象的要好......

    修改我最初找到的解决方案(在问题中链接),我想出了这个替代方案,它允许通过我的 URL,但在 Safari 中打开任何外部 URL。

    func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
        if navigationType == UIWebViewNavigationType.LinkClicked {
            if (request.URL.host! == "example.com"){
                return true
            } else {
                UIApplication.sharedApplication().openURL(request.URL)
                return false
            }
        }
        return true
    }
    

    不要忘记将此代码从 UIWebView 委托给 View Controller,它应该可以正常工作(只要将 example.com 替换为您的 URL。

    请投票赞成这条评论,因为我整天都在搜索教程和论坛,并认为我的最终解决方案是一个非常干净的解决方案!

    【讨论】:

    • 如何将它从 UIWebview 委托给 View Controller。我已经添加了这段代码,但不知道如何强制我的 webview 调用它。谢谢
    • @user1318747 自从这篇文章以来我没有再做任何 Swift,所以我有点忘记了。我相信你在助手编辑器中控制并拖动你的 UIWebView 到你的 ViewController.swift 文件,并输入名称“webview”,然后按连接,它应该为你做剩下的事情。希望我的代码对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2011-12-02
    相关资源
    最近更新 更多