在我的应用程序中,我想在WKWebView中打开my个域(例如:communionchapelefca.org)内的链接,然后在Safari中打开other个域的链接.我更喜欢通过编程来实现这一点.

我已经找到了一些关于堆栈溢出的解决方案(herehereherehere),但它们似乎都是基于Obj-C的,我正在寻找使用Swift的解决方案.

视图控制器.Swift :

import UIKit
import WebKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myWebView:WKWebView = WKWebView(frame: CGRectMake(0, 0,   UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height))
        
        myWebView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.communionchapelefca.org/app-home")!))
        
        self.view.addSubview(myWebView)

推荐答案

您可以实现WKNavigationDelegate,添加decidePolicyForNavigationAction方法,并在那里判断navigationType和请求的url.我在下面使用了google.com,但您可以将其更改为您的域:

Xcode 8.3 • Swift 3.1 or later

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

    let webView = WKWebView()

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.frame = view.bounds
        webView.navigationDelegate = self

        let url = URL(string: "https://www.google.com")!
        let urlRequest = URLRequest(url: url)

        webView.load(urlRequest)
        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)
        }
    }
}

Swift相关问答推荐

AirPods手势不发送AVAudioApp静音状态通知

变量捕获:变量在函数闭包中的行为

在运行时检测蒸汽工人的类型

在SwiftUI中如何预览嵌套的ScrollView,以避免触发可刷新修饰符

使用View()和List()无法显示影子

暂停我的 AR 会话并清除变量和锚点的功能

如何在 SwiftUI 中为过渡动画保持相同的标识

状态变量更改后,SwiftUI 视图不会更改

从 Int 到 String 的属性更改引发 SwiftUI 视图不更新

将基于MyProtocol的泛型函数的参数更改为使用存在的any MyProtocol或some MyProtocol是否会受到惩罚?

关联满足约束时的快速协议方法

如何仅将 SwiftUI 不透明度应用于父视图?

SwiftUI 文本被意外截断

如何在 SwiftUI 中打开 ImagePicker?

将活动指示器 colored颜色 更改为黑色

URLComponents.url 为零

Swift中方法的弃用和其他属性,如何?

如何快速显示数组的所有元素?

iOS:如何检测用户是否订阅了自动更新订阅

转换为 swift 3 后,视图控制器中出现奇怪的通用函数