JS与OC的互调

现在,大部分App都是采用Native(OC 、 Swift) + HTML5开发的,所以我们要明白Objective-C与JavaScript如何互相调用。

JS和OC交互的第三方框架:WebViewJavaScriptBridge

OC与JS的交互最好都是字符串

OC调用JS代码

调用以下方法,即可实现在OC中调用JS代码

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

简单的应用

利用JS获得当前网页标题,然后将标题设置到导航条上

self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title;"];

在OC中调用JS的函数

NSString *result = [webView stringByEvaluatingJavaScriptFromString:@"login();"];

JS调用OC代码

学习JS调用OC代码之前,首先我们学习封装一个方法performSelector,该方法可以传入多个参数(数组),而系统提供的方法performSelector,只能是有限的参数;

最好将该方法封装为给NSObject增加的分类,方便以后直接调用

详细封装代码的注释如下:

// 首先明确返回值类型为id,而不是instancetype,instancetype是能自动检测对象的真实类型,编译器特性,而id能存放任何类型

- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects

{

// 方法签名(方法的描述)

NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];

if (signature == nil) {

// 抛出异常的

// 学习系统,如果方法找不到,直接抛出错误

@throw [NSException exceptionWithName:@"error" reason:@"方法找不到" userInfo:nil];

}

// NSInvocation : 利用一个NSInvocation对象包装一次方法调用(方法调用者、方法名、方法参数、方法返回值)

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

invocation.target = self;

invocation.selector = selector;

// 设置参数

// signature.numberOfArguments中有两个系统默认的参数self、_cmd

NSInteger paramsCount = signature.numberOfArguments - 2; // 除self、_cmd以外的参数个数

// 获得paramsCount和objects.count的最小值,是为了防止传入的objects有可能是空值,如果坚持访问出现角标越界的问题

paramsCount = MIN(paramsCount, objects.count);

// 这里使用paramsCount来循环是防止数组object中对象的个数大于参数个数,造成的角标越界的问题

for (NSInteger i = 0; i < paramsCount; i++) {

id object = objects[i];

if ([object isKindOfClass:[NSNull class]]) continue;

// 传入的是地址值

// i + 2 也是因为默认的参数问题

[invocation setArgument:&object atIndex:i + 2];

}

// 获取返回值

id returnValue = nil;

// 根据返回值的长度,判断有没有返回值,如果有返回值类型,才去获得返回值

if (signature.methodReturnLength) {

// 获得返回值

[invocation getReturnValue:&returnValue];

}

// 调用方法

[invocation invoke];

return returnValue;

}

上例中,抛出异常信息,还可以使用以下方法直接抛出

[NSException raise:@"error" format:@"%@方法找不到", NSStringFromSelector(selector)];

JS调用OC的关键方法

本质:解析JS中请求路径的字符串,然后调用OC的方法

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

JS代码示例

function login()

{

// 在JS中调用OC的方法

location.href = 'zmj://sendMessage_number2_number3_?&100';

}

OC代码示例

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

{

// 获取请求路径的字符串

NSString *url = request.URL.absoluteString;

// 根据规范,设置协议头

NSString *scheme = @"zmj://";

if ([url hasPrefix:scheme]) {

// 获得协议后面的路径

NSString *path = [url substringFromIndex:scheme.length];

// 利用?切割路径,如果字符串中没有?,返回值是整个字符串

NSArray *subpaths = [path componentsSeparatedByString:@"?"];

// 获取方法名

NSString *methodName = [[subpaths firstObject] stringByReplacingOccurrencesOfString:@"_" withString:@":"];

// 设置参数数组

NSArray *params = nil;

// 如果有参数

if (subpaths.count == 2) {

// 获得所有的参数

params = [[subpaths lastObject] componentsSeparatedByString:@"&"];

}

// 调用上文封装的方法

[self performSelector:NSSelectorFromString(methodName) withObjects:params];

return NO;

}

NSLog(@"调用其它的请求");

return YES;

}

js与c语言互相调用,JavaScript与Objective-C的互相调用相关推荐

  1. JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应其他操作,这是为了安全考虑...

    JavaScript 内存管理 & 垃圾回收机制 标记清除 js 中最常用的垃圾回收方式就是标记清除.当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为"进入环境&q ...

  2. JS 逆向的时候 Python 如何调用 JavaScript 代码?「建议收藏哦!」

    你好,我是悦创.关注公众号:AI悦创,抢先阅读优质文章. 公众号原文:https://mp.weixin.qq.com/s/PYEiSMgP2LT0DmcHX08PCw 博客原文:https://ww ...

  3. JS学习篇(一) JavaScript语言特性

    最近在学习Web开发,除了之前学习笔记提到的HTML和CSS,Web开发三件套的第三样就是JavaScript(即JS).说到JavaScript,大家就算没接触过应该也会熟悉,只要稍微看过Web开发 ...

  4. python操作js中的输入_Python调用JavaScript代码的方法

    准备阶段: 以一段简单的JS脚本为例,将代码写入到文件中,其中,定义了一个方法,计算两个数的和. //norm.js //计算两个数的和 function add(num1, num2) { retu ...

  5. java rhino import_java调用javascript :js引擎rhino

    前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式. 结果方案五花八门: 1.jakarta commons JEXL. 2.Beanshell 3.Java Math E ...

  6. MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)

    ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object ...

  7. js方式调用php_javascript调用PHP和PHP调用javascript的方法

    javascript调用PHP和PHP调用javascript的方法 发布时间:2020-06-22 17:03:14 来源:亿速云 阅读:262 作者:Leah 这篇文章将为大家详细讲解有关java ...

  8. js ajax通用方法,目前5个流行的AJAX调用JavaScript库

    在这篇文章中,我们将看一些用于进行AJAX调用的最好的JavaScript库,包括jQuery,Axios和Fetch. AJAX是由客户端框架和库用来对服务器进行异步HTTP调用的一组Web开发技术 ...

  9. BurpSuite调用JavaScript处理Payload,通过JS完全自定义处理逻辑

    BurpSuite调用JavaScript处理Payload,通过JS完全自定义处理逻辑 0×01 引言 大家在使用burp的intruder模块时,一定遇到过已有payload processing ...

  10. dw中html中无法使用js,在Dreamweaver中调用JavaScript行为

    调用JavaScript行为可以指定在事件发生时要执行的自定义函数或者JavaScript代码.可以自己书写这些JavaScript代码,也可以使用网络上免费发布的各种JavaScript库. 一.D ...

最新文章

  1. Springboot 多文件上传
  2. HSV颜色空间 HSV空间各通道分离实验
  3. 系统学习NLP(三)--NLP入门综述
  4. TensorFow的基本使用
  5. log-slave-updates 引起 MySQL 从节点同步异常慢
  6. 【强化学习】数据科学,从计算到推理
  7. nyoj 1216 整理图书(dp)
  8. HDU 2546 饭卡(01背包裸题)
  9. 云智慧压测实战分享之JMeter脚本录制实例
  10. 推荐系统国内外团队介绍
  11. 为什么用python写爬虫_零基础,是怎么开始写Python爬虫的
  12. Dubbo3.0 简介
  13. 15-TypeScript策略模式
  14. C# 父类代码动态转换子类
  15. bzoj 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(SG函数)
  16. pytorch: 网络层参数初始化
  17. 机器学习:使用梯度下降实现逻辑回归求解多元分类问题的原理
  18. oracle64位 32位plsql,64位oracle 安装32位plsql develop
  19. 如何安全的使用密码登录账号(在不知道密码的情况下)
  20. android手机电量测试,Android手机app耗电量测试工具 - Gsam Battery Monitor

热门文章

  1. 饕餮族北京之选(四)
  2. linux禁用快捷键,用CTRL+Shift+Q不能关闭Chrome浏览器,附新关闭的快捷方法
  3. 松隆子 ほんとの気持ち 歌词
  4. Android系统启动流程--init进程的启动流程
  5. 第二章 DDR3实验
  6. 网络上爆火的短视频形式:表情包配音?|别犹豫,学到就是赚到
  7. 单页应用优化--权限
  8. 小红书种草文案应该怎么写?记住这几个技巧
  9. js实现批量下载图片
  10. 读论文:基于自监督知识的无监督新集域适应学习