算是个人项目经验的,印象比较深的Web+JS交互的使用

iOS原生应用与Web页面元素交互方式有很多,JavaScriptCore、拦截协议、第三方框架WebViewJavaScriptBridge、iOS8之后的WKWebView等;

简要记录下之前开发用到的两种方式:

1. 劫持页面加载,从 UIWebVIew 的 shouldStartLoadWithRequest 方法中拦截RequestURL 判断加载项,代码简要:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

NSString *urlStr = [[request URL] absoluteString];

// 加载的url 关键词需要同后台约定

NSRange range_keyWord = [urlStr rangeOfString:@"opengood://"];

if (range_keyWord.length > 0) {

  [self doSomeThing];

  }

return YES;

}

2. iOS7之后水果公司推出的 JavaScriptCore 框架,交互起来hin方便

需要注意的是JS调用的方法名等需要同前端的同事沟通好,最好由前端提供给你。

浅显的说,这个方式等同于将当前ViewController 注入到web的context中,不同webClick都能够有不同的JS方法与VC上面的代理方法相对应,

例:

  Web端

   javaScript控件的点击事件约定触发  'task.openNewWeb('urlStr')'

  “task”这个东西在web源码中并没有什么实际意义 它只相当于iOS端的某个viewController的占位符号

iOS端代码:

#import <JavaScriptCore/JavaScriptCore.h>

UIWebView  代理方法中将当前控制器动态注入js中

- (void)webViewDidStartLoad:(UIWebView *)webView {

   //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)

  JSContext * context =[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

  // 控制器self 填充web中预留的占位符‘task’

  self.context[@"task"] = self;

//  这时候javaScript控件的点击事件约定触发  'task.openNewWeb('urlStr')'

//  那么在OC语法中相当于 [self openNewWeb:urlStr];

    self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {

context.exception = exceptionValue;

NSLog(@"异常信息:%@", exceptionValue);

};

}

******** ⚠️ 注意:WEB JS交互crush

/*

*    web点击事件 'task.click()' ,OC中必须要有对应的方法声明和实现,否则无法响应交互或导致crush

*     而且,在iOS10 以后  貌似加强了调度表查询机制,所以声明OC方法名的时候注意重复问题,

*    例如 openWeb:(int)index (NSString *)url  与 openWeb:(NSString *)url  形参数量存在差异,视为两个不同方法

*    因为在OC消息传递机制中,self.openNewWeb()   首先是通过self 查找保存本身所有selector的调度表

*       若self的selectorNameList中并未找到js调用的task.selectorName ,则通过self的isa定位到superClass,继续从super中的函数调度表 selectorNameList查询

*     superClass中仍未查到则继续根据其isa顺藤摸瓜找到super的元类继续查找  如果元类中还没有  抛出异常>> crush.nice    - -b

*/    

所以对于上面拦截web加载的方式,JavaScriptCore 的另一个优点就是提升代码可读性。。。

由于项目代码内部有涉及到公司业务不方便贴出来,给大家提供两个之前调研过的连接,里面有详尽的JavaScriptCore 使用

链接1

http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=401786074&idx=1&sn=f03d52e7b4f980d694ed4a6b0e808d3b&scene=23&srcid=0309JfhgdIYEJ4vg1YY3OD2T#rd

链接2

http://mp.weixin.qq.com/s?plg_nld=1&plg_auth=1&plg_nld=1&plg_dev=1&plg_uin=1&plg_usr=1&plg_vkey=1&plg_nld=1&plg_uin=1&mid=403853462&plg_nld=1&idx=1&scene=23&plg_auth=1&__biz=MjM5Nzc1MzU2NA%3D%3D&plg_dev=1&srcid=0308AYX0Hpyq3w7TEdwDQ8z8&plg_usr=1&sn=f7437fe6fa45e62d86c026efa4aa1645&plg_vkey=1#rd

在很多页面涉及web交互时,就要频繁调用JS与ViewController关联的方法

这个之前写的一个web类目,提供下载链接,欢迎修改和完善

http://pan.baidu.com/s/1eRSt6p0

iOS开发 UIWebView+JavaScript 交互总结的更多相关文章

  1. iOS 开发与H5交互(JavaScriptCore框架的使用)

    现在的iOS项目中嵌入了越来越多的Web界面,当然是为了方便,那么为了迎合这一趋势,作为iOS开发程序员,我们必须要了解怎么样用OC去和这些Web界面进行交互.这里介绍的是JavaScriptCore ...

  2. iOS开发——JS网页交互——javaScript

    JS中调用OC #import "ViewController.h" @interface ViewController () <UIWebViewDelegate> ...

  3. iOS开发-UIWebView加载本地和网络数据

    UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档,关于浏览网页榜样可以参考UC,手机必备浏览器,至于文档浏览的手机很多图书阅读软件,UIWebView是一个混合体,具体的功能控件内置 ...

  4. iOS开发——UIWebView

    (已写好代码,待空闲更新……)

  5. 【iOS开发】UIWebView与JavaScript(JS) 回调交互

    ------------------------------------------------- 很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一 ...

  6. IOS开发之——objective-c与javascript交互

    原文:http://blog.csdn.net/pjk1129/article/details/6936545 在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要 ...

  7. Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式

    IOS:Objective-C 和 JavaScript 的相互调用 iOS7以前,iOS SDK 并没有原生提供 js 调用 native 代码的 API.但是 UIWebView 的一个 dele ...

  8. iOS开发进阶之 UIWebView

    刚接触IOS开发1年多,现在对于混合式移动端开发越来越流行,因为开发成本上.速度上都比传统的APP开发要好,混合式开发是传统模式与PC网页端相结合的模式.那么提到了 APP的混合模式开发,在Andro ...

  9. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

随机推荐

  1. C++的ORM工具比较

        用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis),TopLink,JDO,J ...

  2. 注意啦!10 个你需要了解的 Linux 网络和监控命令

    下面列出来的10个基础的每个Linux用户都应该知道的网络和监控命令.网络和监控命令类似于这些:hostname, ping, ifconfig, iwconfig, netstat, nslooku ...

  3. vs2010 C#链接 ACCESS数据库

    ACCESS数据库,有2003.2007版本,不同的版本,链接字符也不同,现把代码黏贴如下: 1.ACCESS2003(.mdb): private void Form1_Load(object se ...

  4. redis实现有序的消息队列

    redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...

  5. 【转载】解决 Subversion 的 “svn: Can't convert string from 'UTF-8' to native encoding” 错误

    转载自:http://blog.csdn.net/shaohui/article/details/3996274 在google code 上创建了一个新的项目, 用Windows 下面的tortoi ...

  6. [python基础知识]python内置函数map/reduce/filter

    python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...

  7. Thrift在Windows及Linux平台下的安装和使用示例

    本文章也同时发表在个人博客Thrift在Windows及Linux平台下的安装和使用示例上. thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的R ...

  8. EF封装类 增加版,增加从缓存中查找数据方法,供参考!

    EF封装类 增加版,增加从缓存中查找数据方法,供参考! 这个类是抽象类,我这里增加了需要子类验证的方法ValidateEntity,方便扩展,若想直接使用该类,可以将该类更改成静态类,里面所有的方法都 ...

  9. 以神经网络使用为例的Matlab和Android混合编程

    由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是...) ...

  10. GitHub Extension for Visual Studio 2.0 is now available

    GitHub Extension for Visual Studio 2.0 is now available We're pleased to announce that version 2.0 o ...