iOS调用H5页面

1. 简介

在iOS开发中,经常需要将H5页面嵌入到原生应用中,以实现更丰富的功能和交互效果。本文将介绍iOS如何调用H5页面,并提供代码示例。

2. 嵌入H5页面的方式

在iOS中,有多种方式可以实现调用H5页面的效果:

2.1 使用UIWebView

UIWebView是iOS提供的原生控件,可以加载并展示网页内容。通过创建一个UIWebView实例,并将网址或HTML内容加载到该控件中,即可在iOS应用中展示H5页面。

下面是一个简单的示例代码,展示如何使用UIWebView加载一个网页:

import UIKit
import WebKit

class ViewController: UIViewController {
    
    var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = URL(string: "
        let request = URLRequest(url: url!)
        webView.load(request)
        
        webView.navigationDelegate = self
        view.addSubview(webView)
    }
}

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Web page loaded successfully.")
    }
}

2.2 使用WKWebView

WKWebView是iOS 8及以上版本引入的新的网页加载控件,相较于UIWebViewWKWebView具有更好的性能和功能支持。

下面是一个使用WKWebView加载网页的示例代码:

import UIKit
import WebKit

class ViewController: UIViewController {
    
    var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = URL(string: "
        let request = URLRequest(url: url!)
        webView.load(request)
        
        webView.navigationDelegate = self
        view.addSubview(webView)
    }
}

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Web page loaded successfully.")
    }
}

2.3 使用SFSafariViewController

SFSafariViewController是iOS 9及以上版本引入的新的网页浏览控件,它可以在应用内显示网页,具有与Safari浏览器一致的外观和行为。

下面是一个使用SFSafariViewController加载网页的示例代码:

import UIKit
import SafariServices

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = URL(string: "
        let safariViewController = SFSafariViewController(url: url!)
        present(safariViewController, animated: true, completion: nil)
    }
}

3. 与H5页面交互

除了加载H5页面外,还可以通过JavaScript与H5页面进行交互,实现更丰富的功能。

3.1 使用JavaScriptCore

JavaScriptCore是iOS提供的JavaScript运行环境,可以在iOS应用中执行JavaScript代码,并实现与H5页面的交互。

下面是一个使用JavaScriptCore与H5页面交互的示例代码:

import UIKit
import JavaScriptCore

class ViewController: UIViewController {
    
    var webView: UIWebView!
    var context: JSContext!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = Bundle.main.url(forResource: "index", withExtension: "html")
        let request = URLRequest(url: url!)
        webView.loadRequest(request)
        
        webView.delegate = self
        view.addSubview(webView)
    }
}

extension ViewController: UIWebViewDelegate {
    func webViewDidFinishLoad(_ webView: UIWebView) {
        context = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as? JSContext
        
        let jsFunction: @convention(block) () -> Void = {
            print("Button clicked.")
        }
        
        context.evaluateScript("function buttonClicked() { nativeFunction(); }")
        context.setObject(unsafeBitCast(jsFunction, to: AnyObject.self), forKeyedSubscript: "nativeFunction" as (NSCopying & NSObjectProtocol)!)
    }
}

3.2 使用WKWebView的WKScriptMessageHandler

WKWebView提供了WKScriptMessageHandler协议,可以通过实现该协议的方法,与H5页面进行交互。

下面是一个使用WKWebViewWKScriptMessageHandler与H5页面交互的示例代码:

import UIKit
import WebKit

class ViewController: UIViewController {
    
    var webView