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

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

五、关于native与JavaScript交互


       WebKit中的native与JavaScript的交互主要有4类。


1.JavaScript调用native方法


       这种方式是由WKUserContentController注册,并在代理方法中实现的。


2.native调用JavaScript方法


       这种方式通过WKWebView直接调用evaluteJavaScript:completionHandler:方法来实现。


3.将JavaScript代码注入


       这种方式可以在网页中注入一些自定义的JavaScript代码,也可以注入自定义的方法,再使用evaluteJavaScript:completionHandler:来调用方法。JavaScript代码的注入也是通过WKUserContentController来完成的,使用addUserScript:方法来注入JavaScript,其中需要通过WKUserScript类来生成要注入的对象,这个类使用如下方法来进行实例化:


/*

source为要注入的js代码

WKUserScriptInjectionTime设置注入的时机

forMainFrameOnly参数设置是否只在主页面注入

typedef NS_ENUM(NSInteger, WKUserScriptInjectionTime) {

   //原js代码运行前注入

   WKUserScriptInjectionTimeAtDocumentStart,

   //原js代码运行后注入

   WKUserScriptInjectionTimeAtDocumentEnd

} NS_ENUM_AVAILABLE(10_10, 8_0);


*/

- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;

4.通过WKUIDelegate来交互


       这种方式主要用于相应JavaScript中的弹出框,后面会详细介绍这个协议。


六、WKNavagationDelegate中方法解析


       WKNavagationDelegate协议重要有两个作用,监听页面渲染流程与控制页面跳转,其中方法如下:


/*

决定是否响应网页的某个动作,例如加载,回退,前进,刷新等,在这个方法中,必须执行decisionHandler()代码块,并将是否允许这个活动执行在block中进行传入

*/

/*

WKNavigationAction是网页动作的抽象化,其中封装了许多行为信息,后面会介绍

WKNavigationActionPolicy为开发者回执,枚举如下:

typedef NS_ENUM(NSInteger, WKNavigationActionPolicy) {

   //取消此次行为

   WKNavigationActionPolicyCancel,

   //允许此次行为

   WKNavigationActionPolicyAllow,

} NS_ENUM_AVAILABLE(10_10, 8_0);

*/

-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

   decisionHandler(WKNavigationActionPolicyAllow);

}

//需要响应身份验证时调用 同样在block中需要传入用户身份凭证

-(void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{

   //用户身份信息

   NSURLCredential *newCred = [NSURLCredential credentialWithUser:@""

                                                         password:@""

                                                      persistence:NSURLCredentialPersistenceNone];

   // 为 challenge 的发送方提供 credential

   [[challenge sender] useCredential:newCred

          forAuthenticationChallenge:challenge];

   completionHandler(NSURLSessionAuthChallengeUseCredential,newCred);

}

//接收到数据后是否允许执行渲染

/*

其中,WKNavigationResponse为请求回执信息

WKNavigationResponsePokicy为开发者回执,枚举如下:

typedef NS_ENUM(NSInteger, WKNavigationResponsePolicy) {

   //取消渲染

   WKNavigationResponsePolicyCancel,

   //允许渲染

   WKNavigationResponsePolicyAllow,

} NS_ENUM_AVAILABLE(10_10, 8_0);

*/

-(void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{

   decisionHandler(WKNavigationResponsePolicyAllow);

}

//=====================下面这个协议方法用于监听流程=========================================

//页面加载启动时调用

-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{


}

//当主机接收到的服务重定向时调用

-(void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation{


}

//内容到达主机时调用

-(void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{


}

//主页加载完成时调用

-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{


}

//提交发生错误时调用

-(void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error{


}

//主页数据加载发生错误时调用

-(void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(nonnull NSError *)error{


}

//进程被终止时调用

-(void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{


}

七、WKUIDelegate协议中方法解析


//创建新的webView时调用的方法

-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{

   return webView;

}

//关闭webView时调用的方法

-(void)webViewDidClose:(WKWebView *)webView{


}

//下面这些方法是交互JavaScript的方法

//JavaScript调用alert方法后回调的方法 message中为alert提示的信息 必须要在其中调用completionHandler()

-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{

   NSLog(@"%@",message);

   completionHandler();

}

//JavaScript调用confirm方法后回调的方法 confirm是js中的确定框,需要在block中把用户选择的情况传递进去

-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{

   NSLog(@"%@",message);

   completionHandler(YES);

}

//JavaScript调用prompt方法后回调的方法 prompt是js中的输入框 需要在block中把用户输入的信息传入

-(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{

   NSLog(@"%@",prompt);

   completionHandler(@"123");

}

八、扩展


       首先,在注册要被JavaScript调用的方法时需要设置代理,在不需要时需要将代理移除,WKUserContentController中也提供了移除这个代理的方法,如果不移除,将会造成WebView不能释放。方法如下:


//注册一个监听方法

- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;

//移除一个方法的监听

- (void)removeScriptMessageHandlerForName:(NSString *)name;

同样与注入JavaScript对应,也可以将注入的代码移除,方法如下:


//注入一个JavaScript抽象对象

- (void)addUserScript:(WKUserScript *)userScript;

//移除所有注入

- (void)removeAllUserScripts;

       在上面,经常会见到WKNavagationAction这个类,这个类中封装的是一些页面活动信息,如下:


@interface WKNavigationAction : NSObject

//原页面

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

//目标页面

@property (nullable, nonatomic, readonly, copy) WKFrameInfo *targetFrame;

//请求URL

@property (nonatomic, readonly, copy) NSURLRequest *request;

//活动类型

/*

typedef NS_ENUM(NSInteger, WKNavigationType) {

   //链接激活

   WKNavigationTypeLinkActivated,

   //提交操作

   WKNavigationTypeFormSubmitted,

   //前进操作

   WKNavigationTypeBackForward,

   //刷新操作

   WKNavigationTypeReload,

   //重提交操作 例如前进 后退 刷新

   WKNavigationTypeFormResubmitted,

   //其他类型

   WKNavigationTypeOther = -1,

} NS_ENUM_AVAILABLE(10_10, 8_0);

*/

@property (nonatomic, readonly) WKNavigationType navigationType;

@end

目录
相关文章
|
12天前
|
数据采集 搜索推荐 API
小红书笔记详情 API 接口:获取、应用与收益全解析
小红书(RED)是国内领先的生活方式分享平台,汇聚大量用户生成内容(UGC),尤以“种草”笔记闻名。小红书笔记详情API接口为开发者提供了获取笔记详细信息的强大工具,包括标题、内容、图片、点赞数等。通过注册开放平台账号、申请API权限并调用接口,开发者可构建内容分析工具、笔记推荐系统、数据爬虫等应用,提升用户体验和运营效率,创造新的商业模式。本文将详细介绍该API的获取、应用及潜在收益,并附上代码示例。
114 13
|
13天前
|
搜索推荐 数据挖掘 API
Lazada 淘宝详情 API 的价值与应用解析
在全球化电商浪潮下,Lazada 和淘宝作为东南亚和中国电商市场的关键力量,拥有海量商品数据和庞大用户群体。详情 API 接口为电商开发者、商家和分析师提供了获取商品详细信息(如描述、价格、库存、评价等)的工具,助力业务决策与创新。本文深入解析 Lazada 和淘宝详情 API 的应用场景及价值,并提供 Python 调用示例,帮助读者更好地理解和运用这两个强大的工具。
46 18
|
23天前
|
搜索推荐 API 开发者
深度解析:利用商品详情 API 接口实现数据获取与应用
在电商蓬勃发展的今天,数据成为驱动业务增长的核心。商品详情API接口作为连接海量商品数据的桥梁,帮助运营者、商家和开发者获取精准的商品信息(如价格、描述、图片、评价等),优化策略、提升用户体验。通过理解API概念、工作原理及不同平台特点,掌握获取权限、构建请求、处理响应和错误的方法,可以将数据应用于商品展示、数据分析、竞品分析和个性化推荐等场景,助力电商创新与发展。未来,随着技术进步,API接口将与人工智能、大数据深度融合,带来更多变革。
62 3
|
23天前
|
搜索推荐 测试技术 API
探秘电商API:从测试到应用的深度解析与实战指南
电商API是电子商务背后的隐形引擎,支撑着从商品搜索、购物车更新到支付处理等各个环节的顺畅运行。它通过定义良好的接口,实现不同系统间的数据交互与功能集成,确保订单、库存和物流等信息的实时同步。RESTful、GraphQL和WebSocket等类型的API各自适用于不同的应用场景,满足多样化的需求。在测试方面,使用Postman、SoapUI和jMeter等工具进行全面的功能、性能和安全测试,确保API的稳定性和可靠性。未来,随着人工智能、大数据和物联网技术的发展,电商API将进一步智能化和标准化,为用户提供更个性化的购物体验,并推动电商行业的持续创新与进步。
55 4
|
26天前
|
小程序 前端开发 关系型数据库
uniapp跨平台框架,陪玩系统并发性能测试,小程序源码搭建开发解析
多功能一体游戏陪练、语音陪玩系统的开发涉及前期准备、技术选型、系统设计与开发及测试优化。首先,通过目标用户分析和竞品分析明确功能需求,如注册登录、预约匹配、实时语音等。技术选型上,前端采用Uni-app支持多端开发,后端选用PHP框架确保稳定性能,数据库使用MySQL保证数据一致性。系统设计阶段注重UI/UX设计和前后端开发,集成WebSocket实现语音聊天。最后,通过功能、性能和用户体验测试,确保系统的稳定性和用户满意度。
|
30天前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
138 12
|
1月前
|
供应链 搜索推荐 API
深度解析1688 API对电商的影响与实战应用
在全球电子商务迅猛发展的背景下,1688作为知名的B2B电商平台,为中小企业提供商品批发、分销、供应链管理等一站式服务,并通过开放的API接口,为开发者和电商企业提供数据资源和功能支持。本文将深入解析1688 API的功能(如商品搜索、详情、订单管理等)、应用场景(如商品展示、搜索优化、交易管理和用户行为分析)、收益分析(如流量增长、销售提升、库存优化和成本降低)及实际案例,帮助电商从业者提升运营效率和商业收益。
190 20
|
1月前
|
自然语言处理 数据处理 索引
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
53 0
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

  • 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不同计费模式收费价格全解析
  • 推荐镜像

    更多