iOS中WebKit框架应用与解析(一)

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: iOS中WebKit框架应用与解析

一、引言


       在iOS8之前,在应用中嵌入网页通常需要使用UIWebView这样一个类,这个类通过URL或者HTML文件来加载网页视图,功能十分有限,只能作为辅助嵌入原生应用程序中。虽然UIWebView也可以做原生与JavaScript交互的相关处理,然而也有很大的局限性,JavaScript要调用原生方法通常需要约定好协议之后通过Request来传递。WebKit框架中添加了一些原生与JavaScript交互的方法,增强了网页视图与原生的交互能力。并且WebKit框架中采用导航堆栈的模型来管理网页的跳转,开发者也可以更加容易的控制和管理网页的渲染。关于UIWebView的相关使用,在前面的博客中有详细介绍,地址如下。


UIWebView的使用详解:http://my.oschina.net/u/2340880/blog/469916


二、WebKit框架概览


       WebKit框架中涉及的类很多,框架的设计十分面向对象和模块化,开发者在使用时可以轻松的写出结构清晰的代码。在进行使用前,我们首先应该清楚整个框架的结构和开发思路,下面一张脑图中基本列出了WebKit框架中所涉及到的所有重要的类以及他们之间的相互关系:


如上图所示,WebKit框架中最核心的类应该属于WKWebView了,这个类专门用来渲染网页视图,其他类和协议都将基于它和服务于它。


WKWebView:网页的渲染与展示,通过WKWebViewConfiguration可以进行配置。


WKWebViewConfiguration:这个类专门用来配置WKWebView。


WKPreference:这个类用来进行M相关设置。


WKProcessPool:这个类用来配置进程池,与网页视图的资源共享有关。


WKUserContentController:这个类主要用来做native与JavaScript的交互管理。


WKUserScript:用于进行JavaScript注入。


WKScriptMessageHandler:这个类专门用来处理JavaScript调用native的方法。


WKNavigationDelegate:网页跳转间的导航管理协议,这个协议可以监听网页的活动。


WKNavigationAction:网页某个活动的示例化对象。


WKUIDelegate:用于交互处理JavaScript中的一些弹出框。


WKBackForwardList:堆栈管理的网页列表。


WKBackForwardListItem:每个网页节点对象。


三、使用WKWebViewConfiguration对WebView进行配置


       使用下面的代码可以创建一个WKWebView视图,创建WebView视图时,需要使用WKWebViewConfiguration来进行配置:


   WKWebView * WK;

   WKWebViewConfiguration * config = [[WKWebViewConfiguration alloc]init];

   WK = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height-40) configuration:config];

   [WK loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];

WKWebViewConfiguration中可以进行配置的方法和属性如下:


   //设置进程池

   WKProcessPool * pool = [[WKProcessPool alloc]init];

   config.processPool = pool;

WKProcessPool类中没有暴露任何属性和方法,配置为同一个进程池的WebView会共享数据,例如Cookie、用户凭证等,开发者可以通过编写管理类来分配不同维度的WebView在不同进程池中。


   //进行偏好设置

   WKPreferences * preference = [[WKPreferences alloc]init];

   //最小字体大小 当将javaScriptEnabled属性设置为NO时,可以看到明显的效果

   preference.minimumFontSize = 0;

   //设置是否支持javaScript 默认是支持的

   preference.javaScriptEnabled = YES;

   //设置是否允许不经过用户交互由javaScript自动打开窗口

   preference.javaScriptCanOpenWindowsAutomatically = YES;

   config.preferences = preference;

WKPerference实例为WebView提供一个偏好设置。


   //设置内容交互控制器 用于处理JavaScript与native交互

   WKUserContentController * userController = [[WKUserContentController alloc]init];

   //设置处理代理并且注册要被js调用的方法名称

   [userController addScriptMessageHandler:self name:@"name"];

   //js注入,注入一个测试方法。

   NSString *javaScriptSource = @"function userFunc(){window.webkit.messageHandlers.name.postMessage( {\"name\":\"HS\"})}";

   WKUserScript *userScript = [[WKUserScript alloc] initWithSource:javaScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];// forMainFrameOnly:NO(全局窗口),yes(只限主窗口)

   [userController addUserScript:userScript];

   config.userContentController = userController;

WKUserContentController专门用来管理native与JavaScript的交互行为,addScriptMessageHandler:name:方法来注册要被js调用的方法名称,之后再JavaScript中使用window.webkit.messageHandlers.name.postMessage()方法来像native发送消息,支持OC中字典,数组,NSNumber等原生数据类型,JavaScript代码中的name要和上面注册的相同。在native代理的回调方法中,会获取到JavaScript传递进来的消息,如下:


-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{

   //这里可以获取到JavaScript传递进来的消息

}

WKScriptMessage类是JavaScript传递的对象实例,其中属性如下:


//传递的消息主体

@property (nonatomic, readonly, copy) id body;

//传递消息的WebView

@property (nullable, nonatomic, readonly, weak) WKWebView *webView;

//传递消息的WebView当前页面对象

@property (nonatomic, readonly, copy) WKFrameInfo *frameInfo;

//消息名称

@property (nonatomic, readonly, copy) NSString *name;

WKUserContentController实例的addUserScript:用于注入JavaScript代码,后面会专门介绍。


   //设置数据存储store

   config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];

WebKit框架采用其本身的缓存框架,WKWebsiteDataStore类用来处理数据的存储,其中属性和方法如下:


@interface WKWebsiteDataStore : NSObject

//获取默认的存储器 此存储器为持久性的会被写入磁盘

+ (WKWebsiteDataStore *)defaultDataStore;

//获取一个临时的存储器

+ (WKWebsiteDataStore *)nonPersistentDataStore;

//存储器是否是临时的

@property (nonatomic, readonly, getter=isPersistent) BOOL persistent;

//所有可以存储的类型

+ (NSSet<NSString *> *)allWebsiteDataTypes;

@end

   //设置是否将网页内容全部加载到内存后再渲染

   config.suppressesIncrementalRendering = NO;

   //设置HTML5视频是否允许网页播放 设置为NO则会使用本地播放器

   config.allowsInlineMediaPlayback =  YES;

   //设置是否允许ariPlay播放

   config.allowsAirPlayForMediaPlayback = YES;

   //设置视频是否需要用户手动播放  设置为NO则会允许自动播放

   config.requiresUserActionForMediaPlayback = NO;

   //设置是否允许画中画技术 在特定设备上有效

   config.allowsPictureInPictureMediaPlayback = YES;

   //设置选择模式 是按字符选择 还是按模块选择

   /*

   typedef NS_ENUM(NSInteger, WKSelectionGranularity) {

       //按模块选择

       WKSelectionGranularityDynamic,

       //按字符选择

       WKSelectionGranularityCharacter,

   } NS_ENUM_AVAILABLE_IOS(8_0);

   */

   config.selectionGranularity = WKSelectionGranularityCharacter;

   //设置请求的User-Agent信息中应用程序名称 iOS9后可用

   config.applicationNameForUserAgent = @"HS";

四、WKWebView中的属性和方法解析


       下面列举了WKWebView中常用的属性和方法。


//设置导航代理

@property (nullable, nonatomic, weak) id <WKNavigationDelegate> navigationDelegate;

//设置UI代理

@property (nullable, nonatomic, weak) id <WKUIDelegate> UIDelegate;

//导航列表

@property (nonatomic, readonly, strong) WKBackForwardList *backForwardList;

//通过url加载网页视图

- (nullable WKNavigation *)loadRequest:(NSURLRequest *)request;

//通过文件加载网页视图

- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL NS_AVAILABLE(10_11, 9_0);

//通过HTML字符串加载网页视图

- (nullable WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;

//通过data数据加载网页视图

- (nullable WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL NS_AVAILABLE(10_11, 9_0);

//渲染导航列表中的某个网页节点

- (nullable WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;

//网页标题

@property (nullable, nonatomic, readonly, copy) NSString *title;

//网页的url

@property (nullable, nonatomic, readonly, copy) NSURL *URL;

//网页是否正在加载中

@property (nonatomic, readonly, getter=isLoading) BOOL loading;

//加载进度 可以监听这个属性的值配合UIProgressView来设计进度条

@property (nonatomic, readonly) double estimatedProgress;

//是否全部是安全连接

@property (nonatomic, readonly) BOOL hasOnlySecureContent;

//证书列表

@property (nonatomic, readonly, copy) NSArray *certificateChain;

//是否可以回退

@property (nonatomic, readonly) BOOL canGoBack;

//是否可以前进

@property (nonatomic, readonly) BOOL canGoForward;

//回退网页

- (nullable WKNavigation *)goBack;

//前进网页

- (nullable WKNavigation *)goForward;

//刷新网页

- (nullable WKNavigation *)reload;

//忽略缓存的刷新

- (nullable WKNavigation *)reloadFromOrigin;

//停止加载

- (void)stopLoading;

//执行JavaScript代码

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ __nullable)(__nullable id, NSError * __nullable error))completionHandler;

//是否允许右滑返回手势

@property (nonatomic) BOOL allowsBackForwardNavigationGestures;

WKBackForwardList类为导航管理的网页列表类,其中属性方法意义如下:


@interface WKBackForwardList : NSObject

//当前所在的网页节点

@property (nullable, nonatomic, readonly, strong) WKBackForwardListItem *currentItem;

//前进的一个网页节点

@property (nullable, nonatomic, readonly, strong) WKBackForwardListItem *forwardItem;

//回退的一个网页节点

@property (nullable, nonatomic, readonly, strong) WKBackForwardListItem *backItem;

//获取某个index的网页节点

- (nullable WKBackForwardListItem *)itemAtIndex:(NSInteger)index;

//获取回退的节点数组

@property (nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *backList;

//获取前进的节点数组

@property (nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *forwardList;

@end

在WebKit中,网页节点被抽象成为了WKBackForwardListItem类,这个类中封装的属性如下:


@interface WKBackForwardListItem : NSObject

//当前节点的URL

@property (readonly, copy) NSURL *URL;

//当前节点的标题

@property (nullable, readonly, copy) NSString *title;

//创建此WebView的初始URL

@property (readonly, copy) NSURL *initialURL;

目录
相关文章
|
1月前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
13天前
|
搜索推荐 数据挖掘 API
Lazada 淘宝详情 API 的价值与应用解析
在全球化电商浪潮下,Lazada 和淘宝作为东南亚和中国电商市场的关键力量,拥有海量商品数据和庞大用户群体。详情 API 接口为电商开发者、商家和分析师提供了获取商品详细信息(如描述、价格、库存、评价等)的工具,助力业务决策与创新。本文深入解析 Lazada 和淘宝详情 API 的应用场景及价值,并提供 Python 调用示例,帮助读者更好地理解和运用这两个强大的工具。
46 18
|
12天前
|
数据采集 搜索推荐 API
小红书笔记详情 API 接口:获取、应用与收益全解析
小红书(RED)是国内领先的生活方式分享平台,汇聚大量用户生成内容(UGC),尤以“种草”笔记闻名。小红书笔记详情API接口为开发者提供了获取笔记详细信息的强大工具,包括标题、内容、图片、点赞数等。通过注册开放平台账号、申请API权限并调用接口,开发者可构建内容分析工具、笔记推荐系统、数据爬虫等应用,提升用户体验和运营效率,创造新的商业模式。本文将详细介绍该API的获取、应用及潜在收益,并附上代码示例。
114 13
|
23天前
|
搜索推荐 测试技术 API
探秘电商API:从测试到应用的深度解析与实战指南
电商API是电子商务背后的隐形引擎,支撑着从商品搜索、购物车更新到支付处理等各个环节的顺畅运行。它通过定义良好的接口,实现不同系统间的数据交互与功能集成,确保订单、库存和物流等信息的实时同步。RESTful、GraphQL和WebSocket等类型的API各自适用于不同的应用场景,满足多样化的需求。在测试方面,使用Postman、SoapUI和jMeter等工具进行全面的功能、性能和安全测试,确保API的稳定性和可靠性。未来,随着人工智能、大数据和物联网技术的发展,电商API将进一步智能化和标准化,为用户提供更个性化的购物体验,并推动电商行业的持续创新与进步。
55 4
|
30天前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
138 12
|
23天前
|
搜索推荐 API 开发者
深度解析:利用商品详情 API 接口实现数据获取与应用
在电商蓬勃发展的今天,数据成为驱动业务增长的核心。商品详情API接口作为连接海量商品数据的桥梁,帮助运营者、商家和开发者获取精准的商品信息(如价格、描述、图片、评价等),优化策略、提升用户体验。通过理解API概念、工作原理及不同平台特点,掌握获取权限、构建请求、处理响应和错误的方法,可以将数据应用于商品展示、数据分析、竞品分析和个性化推荐等场景,助力电商创新与发展。未来,随着技术进步,API接口将与人工智能、大数据深度融合,带来更多变革。
62 3
|
1月前
|
供应链 搜索推荐 API
深度解析1688 API对电商的影响与实战应用
在全球电子商务迅猛发展的背景下,1688作为知名的B2B电商平台,为中小企业提供商品批发、分销、供应链管理等一站式服务,并通过开放的API接口,为开发者和电商企业提供数据资源和功能支持。本文将深入解析1688 API的功能(如商品搜索、详情、订单管理等)、应用场景(如商品展示、搜索优化、交易管理和用户行为分析)、收益分析(如流量增长、销售提升、库存优化和成本降低)及实际案例,帮助电商从业者提升运营效率和商业收益。
190 20
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
133 2
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

热门文章

最新文章

  • 1
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
  • 4
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 5
    DeepSeek模型的突破:性能超越R1满血版的关键技术解析
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 7
    深度解析淘宝商品详情API接口:解锁电商数据新维度,驱动业务增长
  • 8
    阿里云服务器经济型e实例解析:性能、稳定性与兼顾成本
  • 9
    小红书笔记详情 API 接口:获取、应用与收益全解析
  • 10
    阿里云CDN怎么收费?看这一篇就够了,CDN不同计费模式收费价格全解析
  • 推荐镜像

    更多