iOS主动调用H5方法

在iOS开发中,我们常常需要在原生App中加载H5页面,并且需要与H5页面进行数据交互。iOS提供了一种方式,可以实现iOS主动调用H5方法,从而实现数据的传递和交互。本文将介绍如何在iOS中主动调用H5方法,并提供代码示例。

WebView加载H5页面

在iOS中,我们可以使用UIWebView或者WKWebView来加载H5页面。这里我们以WKWebView为例。

首先,我们需要创建一个WKWebView实例,并加载一个H5页面:

import WebKit

class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string: "
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    
    // ...
}

以上代码创建了一个WKWebView实例,并加载了一个名为`

H5方法调用原理

在H5页面中,我们可以通过window.webkit.messageHandlers对象来调用iOS的方法。具体步骤如下:

  1. 在H5页面中注册一个方法,用于接收iOS传递的数据:
// H5页面中的代码
function receiveDataFromiOS(data) {
    // 处理传递过来的数据
}
  1. 在iOS中调用H5页面中注册的方法,并传递数据:
// iOS中的代码
let script = "receiveDataFromiOS('Hello, H5!')"
webView.evaluateJavaScript(script, completionHandler: nil)

以上代码会在H5页面中调用receiveDataFromiOS方法,并传递字符串Hello, H5!作为参数。

iOS主动调用H5方法

在iOS中主动调用H5方法的步骤如下:

  1. 在H5页面中注册一个方法,用于iOS主动调用:
// H5页面中的代码
function callMeFromiOS() {
    // 处理iOS主动调用逻辑
}
  1. 在iOS中调用H5页面中注册的方法:
// iOS中的代码
let script = "callMeFromiOS()"
webView.evaluateJavaScript(script, completionHandler: nil)

以上代码会在H5页面中调用callMeFromiOS方法。

完整示例

以下是一个完整的示例,演示了如何在iOS中加载H5页面,并主动调用H5方法,以及H5页面接收iOS传递的数据:

import WebKit

class ViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        let userContentController = WKUserContentController()
        userContentController.add(self, name: "iOSHandler")
        webConfiguration.userContentController = userContentController
        
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string: "
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    
    // WKScriptMessageHandler method
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "iOSHandler" {
            // 处理来自H5页面的消息
            let data = message.body as! String
            print("Received data from H5: \(data)")
        }
    }
    
    // 在iOS中调用H5方法
    func callH5Method() {
        let script = "callMeFromiOS()"
        webView.evaluateJavaScript(script, completionHandler: nil)
    }
    
    // ...
}

以上代码中,我们通过WKUserContentController来注册了一个名为iOSHandler的消息处理器。在H5页面中,我们可以通过window.webkit.messageHandlers.iOSHandler.postMessage()来向iOS发送消息。

userContentController(_:didReceive:)方法中,我们可以处理来自H5页面的消息,这里通过message.body来获取传递的数据。

callH5Method()方法中,我们使用evaluateJavaScript(_:completionHandler:)方法来调用