热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JS与OC交互

UIWebView拦截URL原理:js通过加载url方式被webView拦截,这时候看如果是自己定义的scheme请求就不让webView继续加载请求,否则就继续加载请求。webV



UIWebView拦截URL



  1. 原理:



    1. js通过加载url方式被webView拦截,这时候看如果是自己定义的scheme请求就不让webView继续加载请求,否则就继续加载请求。

    2. webView看加载的请求的host是哪种host进行分别处理。

    3. 处理oc代码。

    4. 之后调用stringByEvaluatingJavascriptFromString调用js代码。



  2. 注意:



    1. js调用oc属于异步方式

    2. oc调用js属于同步方式,且必须在主线程加载,如果js代码比较耗时那么可能会卡顿主线程



  3. 代码地址




UIWebview利用jsc库



  1. 原理:



    1. html调用方法:

      function locationClick() {

      getLocation(‘A’,‘B’,‘C’);

      }

    2. oc中delegate回调:

    - (void)webViewDidFinishLoad:(UIWebView *)webView{
    JSContext *cOntext= [self valueForKeyPath:@"documentView.webView.mainFrame.JavascriptContext"];
    }


    1. 通过分析context[@“getLocation”]来判断方法名。

    2. 通过NSArray *arrArgs = [JSContext currentArguments];获取参数



  2. 注意:



    1. js执行时候会进入context的回调,该回调block是在子线程中的。如果更细ui要在主线程。



  3. 代码地址




WKWebView拦截URL



  1. 原理:



    1. js通过加载url方式被webView拦截,这时候看如果是自己定义的scheme请求就不让webView继续加载请求,否则就继续加载请求。

    2. webView看加载的请求的host是哪种host进行分别处理。

    3. 处理oc代码。

    4. 之后调用evaluateJavascript调用js代码。



  2. 注意:



    1. js调用oc属于异步方式

    2. oc调用js属于同步方式,且必须在主线程加载,如果js代码比较耗时那么可能会卡顿主线程

    3. WKWebView有个处理js弹窗的代理方法,这个方法必须要实现,如果不实现js的弹窗将会无效。



  3. WKWebView和UIWebView的比较



    1. wk更节省内存

    2. wk加载速度刚快

    3. wk解决了内存泄露问题

    4. wk刚好适配了ios8+



  4. 代码地址




WKWebView messageHandle方式



  1. 原理:

    1. js通过调用方法window.webkit.messageHandlers.getLocation.postMessage({A:‘a’,B:‘b’});其中getLocation为name,{A:‘a’,B:‘b’}相当于参数

    2. oc通过 [self.webView.configuration.userContentController addScriptMessageHandler:self name:obj];相当于注册监听

    3. oc会进入回调userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message。

    4. 通过分析message.name来判断是js调用的那个方法,通过分析message.body来获取参数。



代码地址


可以利用三方框架实现交互



  1. WebViewJavascriptBridge支持UIWebView,WKWebView

  2. 利用这个框架可以实现oc与js互调


可以利用前端框架



  1. RN可以实现

  2. Cordova可以实现


webView实现全包裹



  1. ios要想做到内容全包裹,必须借助js,不像android…

  2. js获取内容高度方法为:

CGFloat height = [[webView stringByEvaluatingJavascriptFromString:@"document.body.scrollHeight"] floatValue];


推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
坑爹的马_782
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有