您的当前位置:首页正文

iOS开发-WKWebView的介绍与基本使用

2024-10-17 来源:个人技术集锦

WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iOS 8 中引入的,作为 UIWebView 的替代品。 WKWebView 提供了更高的性能和更多的功能,它是基于 WebKit 引擎的,这也是 Safari 浏览器所使用的引擎。

主要特性

  • 性能提升 :相比于老旧的 UIWebView WKWebView 在性能上有显著提升,包括更快的JavaScript执行和更流畅的页面渲染。
  • 独立的进程 WKWebView 在独立的进程中运行,这意味着即使网页内容崩溃,也不会影响到应用程序的其他部分。
  • 现代化的API :提供了一套现代化的API,允许开发者与网页内容进行更深层次的交互。
  • 安全性 :默认禁用了跨站点跟踪,并支持内容安全策略(CSP)。

使用 WKWebView

要在应用中使用 WKWebView ,首先需要导入 WebKit 框架:

#import <WebKit/WebKit.h>

然后,可以创建一个 WKWebView 实例并添加到视图中:

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];[self.view addSubview:webView];

加载网页非常简单,可以使用一个 NSURLRequest 来加载一个网页:

NSURL *url = [NSURL URLWithString:@"https://www.example.com"];NSURLRequest *request = [NSURLRequest requestWithURL:url];[webView loadRequest:request];

与网页内容交互

WKWebView 提供了 WKScriptMessageHandler 协议,允许原生代码与网页中的JavaScript相互通信。可以注入JavaScript代码并捕获其执行结果,或者让网页调用原生代码。

// 添加一个名为 "appModel" 的脚本消息处理器[webView.configuration.userContentController addScriptMessageHandler:self name:@"appModel"];// 实现 WKScriptMessageHandler 协议的方法- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {    if ([message.name isEqualToString:@"appModel"]) {        // 处理从网页接收到的消息        NSLog(@"JavaScript is sending a message: %@", message.body);    }}

导航代理和 UI 代理

WKWebView 提供了两个代理协议: WKNavigationDelegate WKUIDelegate 。这些代理协议允许追踪网页加载的进度、处理网页加载过程中的各种事件、以及自定义网页中的某些UI元素,如弹出框。

webView.navigationDelegate = self;webView.UIDelegate = self;// 实现 WKNavigationDelegate 协议的方法来追踪加载进度- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {    NSLog(@"网页加载完成");}// 实现 WKUIDelegate 协议的方法来自定义UI元素- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {    // 显示一个自定义的弹出框    completionHandler();}
显示全文