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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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

目录
相关文章
|
9天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
25 3
|
16天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
74 3
|
28天前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
29天前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
52 1
|
6天前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
21 5
|
7天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
28 5
|
4天前
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
15 1
|
23天前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
|
21天前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
17 3
|
22天前
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。

推荐镜像

更多