服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS和JS交互教程之WKWebView-协议拦截详解

iOS和JS交互教程之WKWebView-协议拦截详解

2021-05-13 16:59QiShare IOS

这篇文章主要给大家介绍了关于iOS和JS交互教程之WKWebView-协议拦截的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

由于xcode8发布之后,编译器开始不支持ios 7了,这样我们的app也改为最低支持ios 8.0,既然需要与web交互,那自然也就选择使用了 ios 8.0之后 才推出的新控件 wkwebview.

相比与 uiwebview, wkwebview 存在很多优势:

  • 支持更多的html5的特性
  • 高达60fps滚动刷新频率与内置手势
  • 与safari相容的javascript引擎
  • 在性能、稳定性方面有很大提升占用内存更少 协议方法及功能都更细致
  • 可获取加载进度等。

先解释下标题:“ios与js交互”。ios指ios原生代码(文章只有oc示例),js指web前端(不单指javascript),交互指js调用ios和ios调用js。

本文介绍通过 wkwebview协议拦截的方式实现ios与js交互。

wkwebview是apple在ios8推出的webkit框架中的负责网页的渲染与展示的类,相比uiwebview速度更快,占用内存更少,支持更多的html特性。

一、js调用ios:

实现逻辑:点击js的登录按钮,js将登录成功后的token数据传递给ios,ios将收到的数据展示出来。

实现效果:

iOS和JS交互教程之WKWebView-协议拦截详解
js调用ios实现效果

js代码:

?
1
2
//! 登录按钮
<button onclick = "login()" style = "font-size: 18px;">登录</button>
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//! 登录
function login() {
 var token = "js_tokenstring";
 loginsucceed(token);
}
 
//! 登录成功
function loginsucceed(token) {
 var action = "loginsucceed";
 jstooc(action, token);
}
 
//! js调用oc入口
function jstooc(action, params) {
 var url = "jstooc://" + action + "?" + params;
 loadurl(url);
}
 
//! 加载url
function loadurl(url) {
 window.location.href = url;
}

ios代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma mark - wknavigationdelegate
 
//! wkweview在每次加载请求前会调用此方法来确认是否进行请求跳转
- (void)webview:(wkwebview *)webview decidepolicyfornavigationaction:(wknavigationaction *)navigationaction decisionhandler:(void (^)(wknavigationactionpolicy))decisionhandler {
  
  if ([navigationaction.request.url.scheme caseinsensitivecompare:@"jstooc"] == nsorderedsame) {
    [wkwebviewinterceptcontroller showalertwithtitle:navigationaction.request.url.host message:navigationaction.request.url.query cancelhandler:nil];
    decisionhandler(wknavigationactionpolicycancel);
  }
  else {
    decisionhandler(wknavigationactionpolicyallow);
  }
}

实现原理:

1、js与ios约定好jstooc协议,用作js在调用ios时url的scheme;

2、js在登录成功后加载含有token数据的url: (jstooc://loginsucceed?js_tokenstring);

3、ios的wkwebview在请求跳转前会调用-webview:decidepolicyfornavigationaction:decisionhandler:方法来确认是否允许跳转;

4、ios在此方法内截取jstooc协议获取js传过来的数据,用uialertcontroller显示出来,并通过decisionhandler不允许此请求跳转。

ps1:除了显示截取到的数据,ios还可以将navigationaction.request.url.host看作js想调用的方法名,将navigationaction.request.url.query看作该方法的参数集,从而体现出js调用ios的概念。
ps2:在-webview:decidepolicyfornavigationaction:decisionhandler:方法中一定要调用decisionhandler回调来制定允许请求跳转wknavigationactionpolicyallow或者不允许跳转wknavigationactionpolicyallow,不然会崩溃。

二、ios调用js:

实现逻辑:点击ios的登录按钮,ios将登录成功后的token数据传递给js,js将收到的数据展示出来。

实现效果:

iOS和JS交互教程之WKWebView-协议拦截详解
ios调用js实现效果

ios代码:

?
1
2
3
//! 登录按钮
uibarbuttonitem *loginbtnitem = [[uibarbuttonitem alloc] initwithtitle:@"登录" style:uibarbuttonitemstyleplain target:self action:@selector(login:)];
self.navigationitem.rightbarbuttonitems = @[loginbtnitem];
?
1
2
3
4
5
6
7
//! 登录方法
- (void)login:(id)sender {
  
  dispatch_after(dispatch_time(dispatch_time_now, (int64_t)(0.5 * nsec_per_sec)), dispatch_get_main_queue(), ^{
    [self.webview evaluatejavascript:@"octojs('loginsucceed', 'oc_tokenstring')" completionhandler:^(id response, nserror *error) {}];
  });
}

js代码:

?
1
2
3
4
//! ios调用js入口
function octojs(action, params) {
 document.getelementbyid("returnvalue").innerhtml = action + '?' + params;
}
?
1
2
//! ios调用js数据显示框
<div id = "returnvalue" style = "font-size: 18px; border: 1px dotted; height: 50px;"> </div>

实现原理:

1、ios与js约定好octojs方法,用作ios在调用js时的入口方法;

2、ios在登录成功后以loginsucceed和oc_tokenstring为参数拼接js代码octojs('loginsucceed', 'oc_tokenstring');

3、ios使用wkwebview的-evaluatejavascript:completionhandler:方法执行拼接好的js代码;

3、js在octojs方法中将ios传过来的数据显示在div元素中;

4、ios通过completionhandler收到js中octojs方法的回调。

ps:wkwebview的-evaluatejavascript:completionhandler:方法可以执行js代码。但只有在整个webview加载完成之后调用此方法才会有响应。比如:我们可以通过如下方式获取js的标题。

?
1
2
3
4
5
6
7
//! wkwebview在每次加载请求完成后会调用此方法
- (void)webview:(wkwebview *)webview didfinishnavigation:(wknavigation *)navigation {
  
  [webview evaluatejavascript:@"document.title" completionhandler:^(nsstring *title, nserror *error) {
    self.title = title;
  }];
}

可从qishare的github获取工程源码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://www.jianshu.com/p/e23aa25d7514

延伸 · 阅读

精彩推荐
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04