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

目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
161 4
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
67 10
|
1月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
10天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
95 66
|
21天前
|
机器学习/深度学习 搜索推荐 API
淘宝/天猫按图搜索(拍立淘)API的深度解析与应用实践
在数字化时代,电商行业迅速发展,个性化、便捷性和高效性成为消费者新需求。淘宝/天猫推出的拍立淘API,利用图像识别技术,提供精准的购物搜索体验。本文深入探讨其原理、优势、应用场景及实现方法,助力电商技术和用户体验提升。
|
23天前
|
存储 安全 数据安全/隐私保护
深入解析iOS 14隐私保护功能:用户数据安全的新里程碑
随着数字时代的到来,个人隐私保护成为全球关注的焦点。苹果公司在最新的iOS 14系统中引入了一系列创新的隐私保护功能,旨在为用户提供更透明的数据使用信息和更强的控制权。本文将深入探讨iOS 14中的几项关键隐私功能,包括App跟踪透明性、简化的隐私设置以及增强的系统安全性,分析它们如何共同作用以提升用户的隐私保护水平。
77 3
|
24天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
27天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
29 1
|
28天前
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
28天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
54 0

热门文章

最新文章

推荐镜像

更多