ioswebview混编_OC与JS的交互(iOS与H5混编)

本文详细介绍了在iOS开发中如何实现OC与H5的交互,包括UIWebView和WKWebView的使用。通过代理方法和JavaScriptCore,展示了OC调用JS以及JS调用OC的具体实现,同时讲解了WKWebView相较于UIWebView的优势及其配置和协议方法。
摘要由CSDN通过智能技术生成

在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景。 iOS中加载html网页, 可以使用UIWebView或WKWebView. 本篇博客将介绍两种控件使用过程中如何实现OC与JS的交互。

UIWebView delegate协议方法//网页即将开始加载

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;//网页开始加载

- (void)webViewDidStartLoad:(UIWebView *)webView;//网页加载完成

- (void)webViewDidFinishLoad:(UIWebView *)webView;//网页加载失败

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;//UIWebView自带了一个方法, 可以直接调用JS代码(转化为string类型的js代码)

- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;//例如修改id为‘html’标签内部的text属性

[web stringByEvaluatingJavaScriptFromString:@"document.getElementById('html').innerText='修改内容'"];//也可以执行多行js代码

[web stringByEvaluatingJavaScriptFromString:@"var div = document.getElementById('html'); div.innerText = '修改内容'"];

利用JavaScriptCore实现交互

JavaScriptCore中类及协议:

JSContext:给JavaScript提供运行的上下文环境

JSValue:JavaScript和Objective-C数据和方法的桥梁

JSManagedValue:管理数据和方法的类

JSVirtualMachine:处理线程相关,使用较少

JSExport:这是一个协议,如果采用协议的方法交互,自己定义的协议必须遵守此协议

OC中提供了JavaScriptCore 这个库,使得OC与js的交互变得更加方便。

使用方法:

1 加入JavaScriptCore 这个framework

2 引入头文件

3 在VC里面加入一个JSContext属性

@property (strong, nonatomic) JSContext *context;

JSContext是什么那? 我们看一下api里面的解释

@interface

@discussion A JSContextisa JavaScript execution environment. All

JavaScript execution takes place within a context, and all JavaScript values

are tied to a context.

大概意思是说:JSContext是一个JS的执行环境,所有的JS执行都发生在一个context里面, 所有的JS value都绑定到context里面

具体使用

//初始化context

self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];//OC调用JS//(1)例如html的script中一个方法function dolike(a,b,c){

}//通过OC调用此方法NSString* method = @"dolike";

JSValue* function =[self.context objectForKeyedSubscript:method];//这里面的a,b,c就是OC调用JS的时候给JS传的参数

[function callWithArguments:@[a,b,c]];//JS调用OC//例如网页中有个标签,点击button的时候调用Jump方法, 此处3为传入的参数

点我

//当点击网页中的button的时候,触发jump方法, 在OC中用如下代码可以捕捉到jump方法, 并拿到JS给我传的参数‘3’

self.context[@"jump"] = ^(NSString *str){//此处 str 值为'3'(js调用OC时传给OC的参数)};

WKWebView :

说到WKWebView, 首先要说下WKWebView的优势

1 更多的支持HTML5的特性

2 官方宣称的高达60fps的滚动刷新率以及内置手势

3 将UIWebViewDelegate与UIWebView拆分成了14类与3个协议,以前很多不方便实现 的功能得以实现

4 Safari相同的JavaScript引擎

5 占用更少的内存

类:

WKBackForwardList: 之前访问过的 web 页面的列表,可以通过后退和前进动作来访问到。

WKBackForwardListItem: webview 中后退列表里的某一个网页。

WKFrameInfo: 包含一个网页的布局信息。

WKNavigation: 包含一个网页的加载进度信息。

WKNavigationAction: 包含可能让网页导航变化的信息,用于判断是否做出导航变化。

WKNavigationResponse: 包含可能让网页导航变化的返回内容信息,用于判断是否做出导航变化。

WKPreferences: 概括一个 webview 的偏好设置。

WKProcessPool: 表示一个 web 内容加载池。

WKUserContentController: 提供使用 JavaScript post 信息和注射 script 的方法。

WKScriptMessage: 包含网页发出的信息。

WKUserScript: 表示可以被网页接受的用户脚本。

WKWebViewConfiguration: 初始化 webview 的设置。

WKWindowFeatures: 指定加载新网页时的窗口属性。

协议:

WKNavigationDelegate: 提供了追踪主窗口网页加载过程和判断主窗口和子窗口是否进行页面加载新页面的相关方法。

WKScriptMessageHandler: 提供从网页中收消息的回调方法。

WKUIDelegate: 提供用原生控件显示网页的方法回调。

加载方式://方式一

WKWebView *webView =[[WKWebView alloc] initWithFrame:self.view.bounds];

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

[self.view addSubview:webView];//方式二

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

webView=[[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];

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

[self.view addSubview:webView];

协议方法介绍:#pragma mark - WKNavigationDelegate

//页面开始加载时调用

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

}//当内容开始返回时调用

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

}//页面加载完成之后调用

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

}//页面加载失败时调用

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

}//接收到服务器跳转请求之后调用

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

}//在收到响应后,决定是否跳转

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

NSLog(@"%@",navigationResponse.response.URL.absoluteString);//允许跳转

decisionHandler(WKNavigationResponsePolicyAllow);//不允许跳转//decisionHandler(WKNavigationResponsePolicyCancel);

}//在发送请求之前,决定是否跳转

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

NSLog(@"%@",navigationAction.request.URL.absoluteString);//允许跳转

decisionHandler(WKNavigationActionPolicyAllow);//不允许跳转

decisionHandler(WKNavigationActionPolicyCancel);

}#pragma mark - WKUIDelegate

//创建一个新的WebView

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{return[[WKWebView alloc]init];

}//输入框

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

completionHandler(@"http");

}//确认框

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

completionHandler(YES);

}//警告框

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

NSLog(@"%@",message);

completionHandler();

}

OC与JS的交互

WKWebView

WKWebView的 UIDelegate 提供了三个协议方法, 可以让前端很方便的拦截JS的alert, confirm, prompt方法。除此之外,OC,JS互调可以按照如下方法。

1 OC 调用JS

可以使用webkit这个库

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError *_Nullable error))completionHandler;//例如OC调用JS的方法 setName

[webView evaluateJavaScript:@"setname('张三')"completionHandler:nil];//此处 setname为JS定义的方法名, 内部 ‘张三’为传给JS的参数。 如果setname方法需要传入一个json或者array等非字符参数, 需要用format方法将其转为string类型,在调用evaluate方法。例如

NSString* para = [NSString stringWithFormat:@"setname('%@')",json];

JS调用OC

此时就要用到WKScriptMessageHandler了

//首先.m中加入属性

@property (nonatomic ,strong)WKUserContentController *userCC;//1 遵循WKScriptMessageHandler协议//2 初始化

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

self.wkWebViw=[[WKWebView alloc]initWithFrame:self.view.bounds configuration:config];

[self.wkWebViw loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.webPageUrl]]];

[self.view addSubview:self.wkWebViw];

self.userCC=config.userContentController;

[self.userCC addScriptMessageHandler:self name:@"callOSX"];//此处相当于监听了JS中callFunction这个方法

[self.userCC addScriptMessageHandler:self name:@"callFunction"];//当JS发出callFunction这个方法指令的时候, WKScriptMessageHandler的协议方法中我们就会收到这个消息

#pragma mark WKScriptMessageHandler delegate

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

{//这个回调里面, message.name代表方法名(‘本例为 callFunction’), message.body代表JS给我们传过来的参数

}//最后, VC销毁的时候一定要把handler移除

-(void)dealloc

{

[_userContentController removeScriptMessageHandlerForName:@"callFunction"];

}//对应的JS代码

点我

window.webkit.messageHandlers.callFunction.postMessage(string)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值