marcuswestin / WebViewJavascriptBridge

An iOS/OSX bridge for sending messages between Obj-C and JavaScript in UIWebViews/WebViews
http://marcuswest.in
MIT License
14.29k stars 2.98k forks source link

swift5 使用WKWebView跟h5没法交互 #398

Open JianWenXie opened 4 years ago

JianWenXie commented 4 years ago

用UIWebView可以实现跟h5交互 但是用WKWebView就没没响应 以下是iOS的方法调用 import UIKit import WebKit import WKWebViewJavascriptBridge /// 工单报修 class VKBaseWebViewCtrl: VKBaseViewCtrl {

var web_url:String!
let webView = WKWebView(frame: CGRect(), configuration: WKWebViewConfiguration())
var bridge: WKWebViewJavascriptBridge!
override func viewDidLoad() {
    super.viewDidLoad()
    setupUI()
}
func setupUI() {
    webView.frame = view.bounds
    webView.navigationDelegate = self
    view.addSubview(webView)
    let url = URL.init(string: web_url)
    let request = URLRequest.init(url: url!)
    webView.load(request)
    // setup bridge
    bridge = WKWebViewJavascriptBridge(webView: webView)
    bridge.isLogEnable = true
    bridge.register(handlerName: "testiOSCallback") { (paramters, callback) in
    print("testiOSCallback called: \(String(describing: paramters))")
    callback?("Response from testiOSCallback")
    }
    bridge.call(handlerName: "testJavascriptHandler", data: ["foo": "before ready"], callback: nil)
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    webView.frame = view.bounds
}

 init(weburl:String) {
    self.web_url = weburl
    super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

} extension VKBaseWebViewCtrl: WKUIDelegate,WKNavigationDelegate,UIWebViewDelegate{ // func webView( webView: WKWebView, didFinish navigation: WKNavigation!) { // hideHud() // } // // func webView( webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { // hideHud() // Log(message: "加载失败") // } func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { print("webViewDidStartLoad") }

  func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
      print("webViewDidFinishLoad")
  }

}

zhusongyu commented 4 years ago

跟swift5应该没关系,我用的好好的

housenkui commented 4 years ago

我已经重构了这个库. 如果您遇到麻烦,可以尝试使用它. 下载地址: https://github.com/housenkui/WebViewJavascriptBridge 它更轻,使用更简单. 10分钟之内应该可以完成接入.

Dast1Woop commented 2 years ago

bridge 强引用试试,var gBridge: WKWebViewJavascriptBridge? ... gBridge = bridge

Dast1Woop commented 2 years ago

try this: import Foundation import WebKit import WebViewJavascriptBridge

protocol WebviewWithBridgePr{ var webviewWithBridgeTuple:(webview:WKWebView,bridge:WKWebViewJavascriptBridge)?{set get}

func initWebviewAndBridge(urlStr:String) -> (WKWebView,WKWebViewJavascriptBridge)?

}

extension WebviewWithBridgePr{ func initWebviewAndBridge(urlStr:String) -> (WKWebView,WKWebViewJavascriptBridge)? {

// let config = WKWebViewConfiguration.init() // let webv = WKWebView.init(frame: <#T##CGRect#>, configuration: T##WKWebViewConfiguration) let webv = WKWebView.init()

    let url = URL.init(string: urlStr)

    guard let url = url else{
        return nil
    }

    let rqst = URLRequest.init(url: url, cachePolicy: Foundation.URLRequest.CachePolicy.useProtocolCachePolicy, timeoutInterval: 60)

    webv.load(rqst)

    let bridge = WKWebViewJavascriptBridge.init(for: webv)

    guard let bridge = bridge else{
        return nil
    }

    WKWebViewJavascriptBridge.enableLogging()

    return (webv, bridge)
}

}