引入类拓展UIWebView+TS_JavaScriptContext, 这个类拓展是能在JSCotext出现的时候就可以拿到. 因为一般情况下JSCotext在webViewDidFinishLoad:才拿到, JS端可能在我们没有执行webViewDidFinishLoad:方法的时候就已经调用了我们的方法.

在交互类中创建一个实现了JSExport协议的协议, 协议中提供暴露的方法给JS端. 并在交互类中实现我们定义的方法. 如果需要相关控制器相关参数的话, 可以写个通知(代理或block也行)然后让相关控制器去实现.

1.把拓展类UIWebView+TS_JavaScriptContext拖进项目.

2.创建交互类JavaOCInterRac, 给H5提供相关方法, 并在@implementation中实现方法.

// 首先创建一个实现了JSExport协议的协议
@protocol JavaOCInterRacProtocol <JSExport> // 调系统相册
- (void)callPicker;
// 调支付
- (void)callPay;
// 传一个参数回来
- (void)callPassParameter: (NSString *)orderNumber;
// 传两个参数回来
- (void)callTestParameterone: (NSString *)orderNumber AndParametertwo:(NSString *)name; @end // JavaOCInterRac.h @interface JavaOCInterRac : NSObject +(instancetype)getInstance
/** 定义block,回调到控制器中 */
@property (nonatomic, copy) void(^showPickerBlock)(); @end // JavaOCInterRac.m @interface JavaOCInterRac() <JavaOCInterRacProtocol> @end @implementation JavaOCInterRac // 提供交互类的单例单例对象
static JavaOCInterRac *JavaOCInterac = nil;
+(instancetype)getInstance
{
@synchronized(self)
{
if(!JavaOCInterac)
{
JavaOCInterac = [[self alloc] init];
}
}
return JavaOCInterac;
}
// 调用系统相册实现
- (void)callPicker { NSLog(@"%s %s [第%d行] ----- 点击了调用系统相册", __TIME__, __FUNCTION__, __LINE__);
self.showPickerBlock(); //定义block回调
}
// ...其他方法实现同理 @end

3.在对应控制器.m中

#pragma mark ----- TSWebViewDelegate
- (void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext*) ctx { ctx[@"object"] = [JavaOCInterRac getInstance];
} #pragma mark ----- UIWebViewDelegate
- (void)webViewDidStartLoad:(UIWebView *)webView { JavaOCInterRac *interac = [JavaOCInterRac getInstance];
interac.showPickerBlock = ^{
[self showImagePicker];
};
} - (void)showImagePicker { UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"请选择文件来源"
delegate:nil
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"拍照",@"从手机相册选择",nil];
[actionSheet showInView:self.view];
}

附上git托管地址: https://github.com/yemuhong/OCJS_Interac

OC和JS的交互的更多相关文章

  1. OC与JS的交互(iOS与H5混编)

    大神总结WKWebView的坑:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iO ...

  2. [转]OC与JS的交互详解

    事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...

  3. OC与JS的交互

    现在APP的开发已经不局限于原生开发,很多都是原生+html5这种混合开发 我们可以通过webView这个控件,实现混合开发. 1.首先你需要创建一个html页面 <html> <h ...

  4. OC和JS的交互---JavaScriptCore

    JavaScriptCore的简单介绍 JavaScriptCore是iOS7提供的原生框架,可以让Objective-C和JavaScript提供简单直接的交互. JavaScriptCore的使用 ...

  5. iOS OC与JS的交互(JavaScriptCore实现)

    本文包括JS调用OC方法并传值,OC调用JS方法并传值 本来想把html放进服务器里面,然后访问,但是觉得如果html在本地加载更有助于理解,特把html放进项目里 HTML代码 <!DOCTY ...

  6. OC与JS的交互详解

    事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...

  7. iOS OC和JS的交互 javaScriptCore方法封装

    一.javaScriptCore javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的 ...

  8. 实现OC与JS的交互

        oc-->js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数.一句js代码或他们 ...

  9. OC和JS之间的交互

    OC和JS之间的交互 目录 对OC和JS之间交互的理解 JS调用OC OC调用JS 对OC和JS之间交互的理解 JS调用OC JS文件 function sendCommand(cmd,param){ ...

随机推荐

  1. 【2017-06-27】Js中获取地址栏参数、Js中字符串截取

    一.Js中获取地址栏参数 //从地址栏获取想要的参数 function GetQueryString(name) { var reg = new RegExp("(^|&)" ...

  2. go语言返回变量存储地址

    package main import "fmt" func main() { e:= fmt.Println(e) fmt.Println(&e) //&e; 将 ...

  3. 在CentOS7上使用systemctl配置tomcat

    最近买了一台阿里云,现在阿里云CentOS都已经支持7了(前面都是使用CentOS6),索性直接使用CentOS7,7上面目前最大区别就是service变成了现在的systemctl,简单的查了一下并 ...

  4. Kafka 源代码分析之log框架介绍

    这里主要介绍log管理,读写相关的类的调用关系的介绍. 在围绕log的实际处理上.有很多层的封装和调用.这里主要介绍一下调用结构和顺序. 首先从LogManager开始. 调用关系简单如下:LogMa ...

  5. Nio经典工作方式

    public void selector() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); Selector ...

  6. 【JS】jquery通知插件toastr

    toastr是一款非常棒的基于jquery库的非阻塞通知提示插件,toastr可设定四种通知模式:成功,出错,警告,提示,而提示窗口的位置,动画效果都可以通过能数来设置,在官方站可以通过勾选参数来生成 ...

  7. 将ArrayList<HashMap<String, String>>转为ArrayList<Bundle>类型的解决方案

    Bundle是一种利用键值对存储的数据格式,而我们在程序中通常利用HashMap存储数据.在开发中,通过Http请求得到JSONArray类型的返回值,我选择利用ArrayList<HashMa ...

  8. Mac之OS系统下搭建JavaEE环境 <三> 之Eclipse 与 IntelliJ IDEA 的安装配置

    三.Eclipse 与 IntelliJ IDEA 的安装配置 1.Eclipse的安装配置 1 下载eclipse 到官网 https://www.eclipse.org/downloads/ecl ...

  9. CentOS 6.9上安装mysql-5.6.36

    CentOS 6.9上安装mysql-5.6.36 1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/data,而后需要创建/da ...

  10. Servlet 中为多项选择题判分---String类的indexOf()方法妙用

    首先来看一下String类的indexOf()方法的用法: public class FirstDemo1 { /** *API中String的常用方法 */ // 查找指定字符串是否存在 publi ...