首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Cocoa/WebKit应用程序中从Javascript调用Objective-C方法?

在Cocoa/WebKit应用程序中从Javascript调用Objective-C方法需要使用JavaScriptCore库和WebKit框架进行集成。以下是在应用程序中实现此操作的一般步骤。

步骤 1:集成JavaScriptCore库

要在项目中集成JavaScriptCore库,只需在Xcode中添加相关依赖项和Objective-C头文件。

  1. 首先,打开终端(Terminal)并导航到您的项目文件夹。
  2. 运行以下命令来构建JavaScriptCore库:
代码语言:bash
复制
mkdir JavaScriptCore
cd JavaScriptCore
curl -L https://github.com/WebKit/JavaScriptCore/releases/download/javascriptcore-156795961.tar.gz | tar xz --strip-components=1
cd ../../
pod update
pod install

现在您应该已经获得了构建JavaScriptCore库所需的源文件。

步骤 2:导入JavaScriptCore框架

在您的应用程序的目标文件中导入JavaScriptCore。

在"YourAppName.mm"(或"YourAppName.m")文件的开头添加以下代码:

代码语言:objective-c
复制
#import<JavaScriptCore/JavaScriptCore.h>

步骤 3:创建Objective-C函数

为了编写Objective-C函数,您需要首先创建一个类。您可以在您想要调用JavaScriptCore的类的.m文件中定义该函数,并为其添加@synthesize注解:

代码语言:objective-c
复制
// In your_ObjC_class.m

#import "your_ObjC_class.h"

@interface your_ObjC_class ()

@property (nonatomic, readonly) JSContext *javascriptContext;

@end

@implementation your_ObjC_class

@synthesize javascriptContext = _javascriptContext;

// 添加方法实现:
- (void)callObjectiveCFunction {
    // 使用WebKitJavaScriptClass调用Objective-C方法
    void *scriptObject = (void *)__objc_exec_closure_pd;
    JSValue *global = JSValueMakeFromJSObject(self.javascriptContext, scriptObject);
    JSContextRef jsContextRef = JSContextGetGlobalContext(self.javascriptContext);
    
    JSObjectRef objCFunction = JSStaticFunctionCreate(self.javascriptContext, "your_objc_call", 1.0, NULL, "your_objc_function_name");
    JSValueRef jsValueRef = JSObjectCallAsFunction(jsContextRef, objCFunction, global, 0.0, NULL, NULL);
    
    NSLog(@"Javascript Returned: %@", [JSValue toNSValue:jsValueRef]);
}

@end

"your_objc_function_name"替换为您希望在JavascriptCore上调用的Objective-C方法名。

步骤 4:链接JavaScriptCore库和框架

最后,将JavaScriptCore库连接到您的目标应用程序。

  1. 在您的主项目的Podfile中添加以下行:
代码语言:ruby
复制
pod 'JavaScriptCore'
  1. 在您的主项目Target的Build Settings中添加以下设置:
代码语言:cmake
复制
JavaScriptCore.framework -> SystemConfiguration.framework

结论

遵循上述步骤,您应该在Objective-C应用程序中成功从Javascript中调用Objective-C方法。在项目实践中可能会遇到许多其他问题,但以上过程为您提供了一个良好的起点和实现细节。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【IOS】IOS开发问题解决方法索引(三)

· JS 里头传一个空对象给 Objective-C 程序,用的不是 Objective-C 里头原本表示「没有东西」的方式,像是 NULL、nil、NSNull 等,而是专属 WebKit...JavaScriptfunction 要用 Objective-C 调用网页的 JS function,大概有几种方法。...程序可以调用 Objective-C 对象,方法是把某个 Objective-C 对象注册成 JS window 对象的属性。...的用法 除了 Mac OS X,WebKit 这几年也慢慢移植到其他的作业系统与framework ,也或多或少都有 Native API 要求 WebView 执行 Js,以及 JS 调用 Native...GTK 方面,因为是 C API,所以在应用程序与 JS 之间,就不是透过操作包装好的对象,而是调用 WebKit 里头 JavaScript Engine 的 C API。

86720

iOS学习——iOS 整体框架及类继承框架图

每一个子框架都是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源,共享资源库定义应用程序可以调用的函数和方法。...二 Cocoa框架的类继承体系   Cocoa框架是iOS应用程序的基础,是OS X和 iOS操作系统的程序的运行环境,了解Cocoa框架,对开发iOS应用有很大的帮助。...通知 归档和序列化 表达式和条件判断 Objective-C语言服务 对于Foundation框架的一些基本类的使用方法详情参见:iOS开发系列—Objective-C之Foundation框架  ...框架的入口: #import   ,当引入此头文件后,便可以在程序里使用任何在UIKit里声明的类。(PS: 当然还要把这个框架链接到你的应用程序)。...动态能力有三种: 动态类——运行时确定类的对象 动态绑定——运行时确定要调用方法 动态加载——运行时为程序加载新的模块 3.3 动态能力相关的isa指针   每个Objective-C对象都有一个隐藏的数据结构

3.2K70

更多关于CocoaScript目录

---- Sketch插件可以通过Mocha和CocoaScript实现,它允许您使用JavaScript编写的外部脚本使用Objective-C / Cocoa代码。...所以,当你在CocoaScript编写代码时,你确实在编写JavaScript。 CocoaScript还包含一个桥梁,可让您通过JavaScript访问Apple的Cocoa框架。...访问Cocoa和Sketch API 您可以CocoaScript访问所有Cocoa和Sketch API。 Objective-C属性的行为与在桥的JavaScript端应该一样。...Objective-C方法作为对象的不透明JavaScript代理的属性公开。 将选择器名称转换为JavaScript属性名称时采取以下步骤: 所有冒号都转换为下划线(最新的下划线是可选的)。...这在JavaScript不存在,所以有一种全局方法来创建一个: var ptr = MOPointer.alloc().init() var ptrToSomething = MOPointer.alloc

1.3K60

Sketch 插件开发官方文档合集插件基础您的第一个插件开发环境调试ActionAPI发布插件插件捆绑插件,脚本和命令插件位置更多关于CocoaScriptSketchTool参考资源

生成一个新的插件 将自己的功能添加到Sketch的最简单方法是通过添加命令。一个命令注册一个回调函数,该函数可以插件菜单或键绑定调用。 我们编写了一个小工具链,skpm以帮助您入门。...这是一个桥梁,可让您编写可调用本机Objective-C / CocoaJavaScript脚本。...基础如下: 你会像往常一样编写JavaScript代码 使用桥接器,您可以主机应用程序(在本例为Sketch)或系统本身获取Objective-C对象 基本的Objective-C对象具有等同的JavaScript...(字符串和数字),通常可以以与JS版本相同的方式使用 您可以像在JS中一样读取和写入自定义Objective-C对象的属性 您可以使用熟悉的JavaScript语法或Objective-C方括号语法来调用自定义...访问Cocoa和Sketch API 您可以CocoaScript访问所有Cocoa和Sketch API。 Objective-C属性的行为与在桥的JavaScript端应该一样。

6.3K90

简述OC语言

Objective-C,没有方法调用这种说法,只有消息传递。在C++或Java调用某个类的方法,在Objective-C是给该类发送一个消息。...而在Objective-C中就比较简单了,类和消息之间是松耦合的,方法调用只是向某个类发送一个消息,该类可以在运行时再确定怎么处理接受到的消息。...强大的Method Swizzling(方法交叉使用) 在Objective-C调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。...2、applicationWillResignActive:在应用程序将要由活动状态切换到非活动状态时候,要执行的委托调用 按下 home 按钮,返回主屏幕,或全屏之间切换应用程序等。...如果超过时间还有未完成的任务,你的程序就会被终止而且内存清除。

2K20

iOSCocoa框架·Runtime及isa指针知识·填坑

Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。 1、Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境。...是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发你可以使用各种语言;也不是开发工具,你可以在命令行上就可以创建Cocoa程序。...1.1、Cocoa框架 iOSCocoa众多框架中最重要最基本的两个框架是:Foundation 和 UIKit。...通知 归档和序列化 表达式和条件判断 Objective-C语言服务 1.3 UIKit框架 应用程序可以通过三种方式使用UIKit创建界面 在用户界面工具(interface Buidler)对象库里...动态能力有三种: 动态类-运行时确定类的对象 动态绑定-运行时确定要调用方法 动态加载--运行时为程序加载新的模块 2.3 动态能力相关的isa指针 每个Objective-C对象都有一个隐藏的数据结构

95320

iOS开发入门笔记

iOS开发入门笔记 本文面向已有其它语言(Java,C,PHP,Javascript)编程经验的iOS开发初学者,初衷在于让我的同事一小时内了解如何开始开发iOS App,学习目标包括: 能使用Xcode...不仅是学习一门新语言 有过脚本开发经验的人(Javascript,PHP,Shell)在刚开始学习iOS开发的时候,会觉得iOS开发的学习曲线比脚本语言要高,是的,这种感觉是对的。...在Java、C++世界,我们调用一个对象的某方法,在Objective-C里,这称作给类型发送一个消息,这可不仅仅是文字游戏,他们的技术细节也是不同的。...“@”符号在Objective-C是个很神奇的符号。 冒号也是方法名的一部分,method和method:是两个不同的方法名,不是overload,第二个带参数。...Cocoa多任务、多窗口的特性,在Cocoa Touch也是没有的(或者跟Cocoa不完全一样的)。

3.8K60

【IOS开发进阶系列】iOS系统架构专题

Touch层的很多技术都是基于Objective-C语言的。...Cocoa Touch层的其他框架,对我们在应用程序的开发来说也是非常有用的,访问用户通信录功能框架、获取照片信息功能的框架、负责加速感应器和三维陀螺仪等硬件支持的框架。...应用层的角度看进程通过访问数据守护进程获取用于数据交换的程序框架接口,调用并通过接口共享数据,而其他进程要访问数据也只需与程序框架接口进行交互方便了程序员开发需要交互数据的应用程序。         ...CoreAnimation集成到iPhone OS的许多部分,包括UIKit类UIView,提供许多标准系统行为的动画。开发者也能利用这个框架Objective-C接口创建客户化的动画。...我们编写的应用程序项目,都是Cocoa Touch层开始的,具体来说就是UIKitFramework开始的。

52141

JavaScriptCore全面解析 (上篇)

JavaScript越来越多地出现在我们客户端开发的视野ReactNative到JSpatch,JavaScript与客户端相结合的技术开始变得魅力无穷。...使用Apple提供的JavaScriptCore框架,你可以在Objective-C或者基于C的程序执行Javascript代码,也可以向JavaScript环境插入一些自定义的对象。...这段代码展示了如何在Objective-C执行一段JavaScript代码,并且获取返回值并转换成OC数据打印 //创建虚拟机 JSVirtualMachine *vm = [[JSVirtualMachine...可使用这个方法将native的对象或者方法桥接给JavaScript调用 */ (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying...通过调用JSValue的实例方法返回的其他的JSValue对象都属于与最始的JSValue相同的JSContext。

13.7K141

JavaScriptCore全面解析

| 导语JavaScript越来越多地出现在我们客户端开发的视野ReactNative到JSpatch,JavaScript与客户端相结合的技术开始变得魅力无穷。...这段代码展示了如何在Objective-C执行一段JavaScript代码,并且获取返回值并转换成OC数据打印 Output 三、 JSVirtualMachine 一个JSVirtualMachine...六、 JSExport JSExport协议提供了一种声明式的方法去向JavaScript代码导出Objective-C的实例类及其实例方法,类方法和属性。 1....在OC代码我们这样导出: 在JS代码可以这样调用: 2. 导出OC方法和属性给JS 默认情况下,一个Objective-C类的方法和属性是不会导出给JavaScript的。...设置给context的exception属性 因此,默认的表现就是JavaScript抛给native的未处理的异常又被抛回到JavaScript,异常并未被捕获处理。

1.3K20

Swift是花拳绣腿吗?——谈谈开发语言与程序员的职业发展

无独有偶,在WWDC2015,苹果在新版的Safari和WebKit增加了一个针对JavaScript的新特性。这个特性可以使用${变量}的符号,代替传统的使用“+”对字符串进行拼接的操作。...闭包有以下3个特点: 匿名函数(方法); 可以被执行; 可以被作为参数传递。 提到闭包,想必很多人都会想到JavaScript。我们就来对比一下JavaScript的闭包。...此时myDelegate可以被调用和传递,因此就成为了一个闭包。 更广义的说,C的“指向函数的指针”也满足上述的3个条件。...客观上讲,Swift确实包含了“安全、现代、强大”的特性,但是这些特性在其他语言上早就有支持。因此这些特性与其他语言相比(包括Objective-C)并没有绝对优势。...学习Swift语法可能比Objective-C容易一些,但是也不会是零门槛的。 此外使用Swift开发应用必须依赖Cocoa框架,对于之前没有接触Cocoa的程序员,这是一块很大的隐性成本。

1.3K30

2021 年 iOS 应用程序开发七种最佳语言

Swift 旨在与 CocoaCocoa Touch 等框架以及用 Objective-C 为 Apple 产品编写的大量代码库一起使用。 ...它是一种通用语言,主要用于为 Apple 的操作系统( OS X 和 iOS)及其 API:CocoaCocoa Touch 进行编程。 ...它使用 JavaScript 创建本机应用程序,允许软件开发人员使用网站技术构建移动应用程序。 ...该解决方案将使您能够节省时间和金钱,而且 - 考虑到它在世界上最流行的移动应用程序的流行度 - 您可以确定它是一个经过验证的解决方案。 7....该工具允许构建跨平台应用程序,为Flutter 开发人员提供一种简单的方法来制作具有视觉吸引力、本地编译的移动、Web 和桌面应用程序,仅使用一个代码库。

4.1K40

iOS - 老生常谈内存管理(二): MRC 说起

内存泄漏会导致应用程序不断增加内存使用量,进而可能导致系统性能下降或应用程序被终止。 但是,引用计数的角度考虑内存管理通常会适得其反,因为你会倾向于根据实现细节而不是实际目标来考虑内存管理。...相反,你应该对象所有权和对象图的角度考虑内存管理。 Cocoa 使用简单的命名约定来指示你何时持有由方法返回的对象。...super是编译器指令,使用super调用方法当前消息接收者类的父类开始查找方法的实现,但消息接收者还是子类。...当集合移除对象或集合本身被销毁时,集合将放弃对象的所有权。...Autorelease Pool Blocks 和线程 Cocoa 应用程序的每个线程都维护自己的 autorelease pool blocks 栈。

1.5K21

IOS框架概览

从上图中我们能够发现Mac OS X与iOS的系统架构层次仅仅有最上面一层不同,由Cocoa框架换成了Cocoa Touch,因此开发iOS应用程序与开发Mac OS X程序是相似的,如今就让我们来详细看看每层所包括的内容...Touch层的非常多技术都是基于Objective-C语言的。...Cocoa Touch层的其它框架,对我们在应用程序的开发来说也是非常实用的,訪问用户通信录功能框架、获取照片信息功能的框架、负责加速感应器和三维陀螺仪等硬件支持的框架。...我 们编写的应用程序项目,都是Cocoa Touch层開始的,详细来说就是UIKit Framework開始的。...当在编敲代码的过程须要用到一些特殊功能的时候,我们应该框架的最顶端技术開始寻找对应的框架,仅仅有在上层结构无法解决时,才干使用其下层的技术。事实上,顶层的框架已经涵盖了我们绝大多数须要的功能。

89510

iOS系统架构及常用框架

提供一系列的Class(类)来建立和管理iPhone OS应用程序的用户界面接口、应用程序对象、事件控制、绘图模型、窗口、视图和用于控制触摸屏等的接口。...当引入此头文件后,便可以在程序里使用任何在UIKit里声明的类 CoreGraphics 它是iOS的核心图形库,平时使用最频繁的point,size,rect等这些图形,都定义在这个框架,类名以CG...通常我们会将他们分为几类: 值对象 集合 操作系统服务:文件系统、URL、进程通讯 通知 归档和序列化 表达式和条件判断 Objective-C语言服务 NSObject Objective-C NSObject...在Objective-C,类也是用对象来表示的,而类的isa指针指向它的metaclass(存储静态成员变量和类方法)。 super_class指针:指向父类。 name:类名称。...cache:因为Objective-C的消息转发需要查找dispatch table甚至可能需要遍历继承体系,所以缓存最近使用的方法。 protocols:类需要遵守的协议。

7.1K21

别再手写RPC了,Apache Thrift帮你自动生成RPC客户端及服务端代码

Thrift为数据传输提供了干净的抽象和实现, 数据序列化和应用程序级处理。代码生成 系统以简单的定义语言为输入并生成代码 跨使用抽象堆栈构建的编程语言 可互操作的 RPC 客户端和服务器。...传输层(Transport Layer):传输层负责直接网络读取和写入数据,它定义了具体的网络传输协议;比如说TCP/IP传输等。...客户端:只需要拷贝IDL定义好的客户端桩和服务对象,然后就像调用本地对象的方法一样调用远端服务。...(四) 多语言/跨语言支持 Thrift支持C++、 Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、CocoaJavaScript、Node.js、Smalltalk...对于我们经常使用的Java、PHP、Python、C++支持良好,虽然对iOS环境的Objective-C(Cocoa)支持稍逊,但也完全满足我们的使用要求。

54830

Cocoa编程学习笔记之MVC

你或许把这些数据保存在数据库、XML文件,或者甚至Web Service得到,不过MVC不那么关心它们是在何处/如何来持久保存的(乃至它们是什么)。...在我们这个假设的任务应用程序,会在一个网页(以HTML的方式)来显示这些任务,也会在一个WPF页面(以XAML的方式)来显示,或者在一个iPhone应用程序显示为UITableView 。...控制器的目的就是获取模型的数据,告知视图来显示。控制器还侦听着视图的事件,在用户选中一个任务来删除的时候,控制着任务模型删除。...然而,在Cocoa(及Cocoa Touch),还是或多或少有所不同,苹果用MVC来代表Views(视图)、View Controller(视图控制器)和Models(模型);但是在不同的控件,它们却不是完全一致的...在Objective-C/Cocoa的世界里,我们建立的controller通常是指应用程序(Application)的委托(Delegate),或者可以简单称做app delegate。

85570
领券