iOS与JS交互开发知识总结

 2024-02-10 01:03:21  阅读 0

点击上方“iOS开发”,选择“热门公众号”

关键时刻,尽快交付!

前言

网页中的JS如何与iOS交互是每个iOS猿必须掌握的技能。 说到与JS交互,不得不提一下。

翻译结果不太文明(汗,不知道为什么很多翻译软件会把它翻译成“”,但我更喜欢翻译成“mixed,mixed-race”),App我理解为通过Web 网络技术(例如 HTML、CSS 和 .NET)与混合移动应用程序相结合。

那么我们来看看比较一下优缺点:

调用方法java_android中调用js方法_调用方法中的变量

.jpg

由于它的灵活性(更改时不必重新发布网页)和通用性(一份H5可以在所有平台上使用)和低门槛(前端猿可以轻松上手),用于非核心功能模块。 Web 的实现方式在各个方面都可能是优越的。 可以为JS调用核心函数和设备硬件提供强有力的支持。

指数

发展简史

以下是发展简史:

1.H5发布

调用方法java_android中调用js方法_调用方法中的变量

html5.png

Html5于2014年9月正式发布,此版本中最大的变化之一就是“从之前的XML子集升级为独立集合”。

2.H5渗透到App开发中

APP开发中有一个组件(在iOS中),该组件可以加载Html文件。

在H5流行之前,加载的网页非常单调(因为只能加载一些静态资源)。 自从H5流行以来,前端猿开发的H5页面在H5中表现出色,使得H5开发慢慢渗透到App开发中。 来。

三、现状

虽然出现了RN、Weex等使用JS编写App的技术,但并没有被淘汰。 市场上的大多数应用程序都不同程度地引入了Web页面。

这个库在iOS 7之后被苹果加入到标准库中,对iOS与JS之间的交互调用产生了划时代的影响。

它一般由4个类和1个协议组成:

android中调用js方法_调用方法中的变量_调用方法java

工作.jpg

以及协议:

实现用于将 -C 类及其实例方法、类方法和属性导出到代码的协议。

这里 , 比较容易理解。 我们把清单拿出来解释一下:

的用法及其关系

调用方法java_android中调用js方法_调用方法中的变量

.jpg

官方文档介绍:

实例代表一个独立的执行环境。 使用此类有两个主要目的:支持并发执行,以及管理在 -C 或 Swift 之间桥接的对象的内存。

关于使用,一般我们不需要手动创建。 因为当我们得到的时候,我们所得到的就属于一个人。

每个上下文(对象)都属于一个。 每个都可以包含多个上下文,允许值(对象)在上下文之间传递。 然而,每一个都是不同的,即我们不能将一个中创建的值传递到另一个中的上下文。

该 API 是线程安全的 - 例如,我们可以从任何线程创建对象或运行 JS 脚本 - 然而,尝试使用相同对象的所有其他线程都将被阻止。 要同时在多个线程上运行脚本,请为每个线程使用单独的实例。

AND 换算表

调用方法java_调用方法中的变量_android中调用js方法

iOS与JS交互

对于iOS与JS的交互,我们首先从调用方向上分为两种情况:

调用方法中的变量_android中调用js方法_调用方法java

呼叫-.jpg

JS调用

其实JS调用iOS也分为两种实现方式:

假方法

原理:该方法其实就是在启动时使用代理的方法来拦截请求,判断该请求是否是约定的假请求。 如果是假请求,说明JS想要按照约定调用我们的方法,按照约定执行我们的代码。

proxy有拦截请求的功能,直接在那里做判断即可:

- (BOOL):( *) :( *) :(ype) {

NSURL *url = .URL;

// 与约定的函数名进行比较

if ([[url] :@""]) {

// 去做就对了

有两个代理,一个是,另一个是。 我们将在后面的章节中讨论它,这里我们需要设置并实现它的方法:

- (void):( *) :( *) :(void (^)(licy)) {

NSURL *url = ..URL;

// 与约定的函数名进行比较

if ([[url] :@""]) {

// 去做就对了

();

;

();

注意:这是当您的应用程序决定是否允许或取消导航时调用的代码块。 此代码块采用单个参数,该参数必须是枚举类型 licy 的常量之一。 调用失败会导致崩溃。

这里添加JS代码:

() {

(“://xxx”);

然后获取一个标签并使用它:

称呼!

方法

iOS 7 是专门为与 JS 交互而设计的。 我们加载后就可以获取到,然后在JS中使用代码来解释或响应该对象:

//首先导入库

#

// 然后在代理方法中完成加载

- (空白):( *) {

// 获取JS上下文

= [:@"..."];

// 做一个引用,参考JS中的元素进行解释。 例如,方法可以解释为Block,对象也可以指向OC对象。

[@""] = 自我;

[@""] = ^(id){

// 注意,这里的线程默认是Web处理线程。 如果涉及到主线程操作,需要手动切换到主线程。

(eue(), ^{

// 你的代码

});

这里的JS代码比较简单。 只需声明一个未解释的函数(具有约定的名称)以供参考:

变量=xxx;

();

iOS调用JS

iOS调用JS的实现方式也分为:

直接注入JS并执行

在iOS平台上,有一个用于注入和执行JS的API。

有一种方法可以直接注入JS:

*jsStr = [ :@"('%@')", @"警报消息"];

[:jsStr];

注意:该方法将返回JS运行结果(*)。 它是一个同步方法,会阻塞当前线程! 尽管此方法并未被弃用,但最佳实践是使用 class::。

官方文档:

: 等待。 如果您加载未加载代码的网页,则可能会挂起您的应用程序。 最好的方法是采用该类并使用它的 :: 。

不同的是,注入和执行 JS 方法不会阻塞当前线程。 因为web中加载的JS代码可能没有被验证,如果线程被阻塞,App可能会挂掉。

*jsStr = [ :@"('%@')", @"北京市东城区南锣鼓巷纳福胡同xx号"];

[ :jsStr :^(id , * 错误) {

NSLog(@"%@----%@", , 错误);

}];

注意:该方法不会阻塞线程,其回调代码块始终在主线程中运行。

官方文档:

A。

发送 的(或错误)到 。 在 main 上运行。

方法

上面已经简单提到了图书馆提供的类。 以下是官方文档的介绍和翻译:

实例是对值的引用。 您可以使用类在 C 或 Swift 之间转换基本值(例如数字和字符串),以在本机代码和代码之间传递数据。

但你也看到了我上面贴的OC和JS数据类型转换表,它并不局限于官方文档中提到的基本值。 如果你对JS不熟悉,我在这里解释一下为什么JS中也可以指向对象和函数,因为JS语言不区分基本值、对象和函数。 在 JS 中,“一切都是对象”。

好吧,我们直接展示代码:

//首先导入库

#

//先获取JS上下文

自己。 = [:@"..."];

// 如果涉及到UI操作,则切换回主线程调用JS代码,通过数组@[]输入参数

(eue(), ^{

* = 自我。[@""];

[:@[]];

});

上面的代码调用了JS代码中的一个函数,并给函数添加了@[]作为输入参数。 为了方便阅读和理解,下面是JS代码:

(){

变量 = ;

// 做你想做的事

与 JS 交互的独特方式

android中调用js方法_调用方法中的变量_调用方法java

.jpg

和 之间的区别本文不会详细解释。 更多信息请自行查阅。 这里我要说的是与JS交互时的独特方法:

方法

如上所述,除此之外,它还有另外一种。 这是做什么用的?

该协议包含一些用于在 Web JS 想要显示警报或触发器时进行侦听的函数。 如果我们加载一个web进去,想要web JS提醒或者正常弹窗,我们就需要实现相应的代理方法。

注意:如果没有实现相应的代理方法,则按照默认的操作。

这里我们以alert为例。 相信读者可以自行推断。 下面是在监控web的代理方法中替换JS中的alert显示来显示alert的例子:

- (void):( *) :( *) :( *)框架 :(void (^)(void)) {

// 使用弹窗显示JS会提示的信息

*alert = [ itle:@"提醒"::];

[警报:[:@“明白了”风格:ncel:^(*){

// 必须在函数内调用

();

}]];

[自我r:警报:是:无];

方法

是JS拦截JS假请求后调用的另一个方法。 该方法是利用. 与拦截false的方法相比,传递参数更简单、更方便。

这是什么意思?

ler 类有一个方法:

- (void)ler:(id) 姓名:( *)姓名;

该方法用于添加一个脚本处理器,可以在处理器中处理JS脚本调用的方法,从而达到JS调用的目的。

那么ler类和毛羽有什么关系呢?

初始化函数中有一个输入参数,其类型为on。 on 包含属性 r,它是 ler 类型的实例。 我们可以使用这个 r 添加不同名称的脚本处理器。

调用方法java_android中调用js方法_调用方法中的变量

勒.jpg

然后回到 - (void)ler:name: 方法。 此方法添加脚本消息处理器(第一个输入参数)并为处理器指定名称(第二个输入参数名称)。 不过,使用这个函数有一个陷阱:输入参数会被强引用,所以如果你把当前参数作为第一个输入参数,而this又由它自己持有...r,就会造成循环引用。

android中调用js方法_调用方法java_调用方法中的变量

.jpg

我们可以通过-(void):方法删除对r的强引用。 所以一般我们的代码都会成对添加和删除:

- (无效):(布尔) {

[极好的 :];

[self...r ler:self name:@""];

- (无效):(布尔) {

[极好的 :];

[自我...r:@""];

呃协议

er 是脚本信息处理器协议。 如果你想让一个对象具有脚本信息处理能力(比如上面代码中的所有权是self),你必须让它遵守这个协议。

er协议内部非常简单,只有一个方法,我们必须实现这个方法(@):

// 呃协议方法,收到脚本信息时触发

- (void)r:(ler *)r 年龄:( *) {

// 有两个属性:name 和 body

// .name可以用来区分要进行的处理

if ([.name:@""]) {

// .body相当于JS传递的参数

NSLog(@"JS 调用 %@", .body);

补充JS代码:

// 改变,只需改变你想要的参数

....()

完成并收工!

调用iOS设备摄像头的JS Demo

我徒手做了一个demo,实现了JS与代码的交互,实现了使用JS调用iOS设备摄像头的功能。 demo中包含了权限申请、用户拒绝授权等细节(技术上就是JS和相互传值调用),请大家指教。

我向各位基佬低头跪下~(演示地址)

总结

送花完毕,希望我的文章能给您带来价值! 如果你觉得文章还过得去,请分享给我吧~!

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码