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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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

目录
相关文章
|
5天前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
116 60
|
28天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
38 3
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
101 3
|
5天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
8天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
17天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
33 1
|
25天前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
55 5
|
26天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
47 5
|
23天前
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
45 1
|
12天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
12 0

推荐镜像

更多