iOS:JavaScriptCore.framework的使用.OC篇

JavaScriptCore是Apple为iOS和macOS提供的一种框架,它允许Objective-C(简称OC)应用程序与JavaScript代码进行交互。在iOS开发中,JavaScriptCore被广泛应用于实现动态内容加载、富文本编辑、以及App与Web页面之间的数据交换等场景。本文将详细讲解如何在Objective-C项目中使用JavaScriptCore.framework进行OC与JS的交互。为了使用JavaScriptCore,你需要在项目中引入`JavaScriptCore.framework`。在Xcode中,可以通过选择`Target` -> `General` -> `Frameworks, Libraries, and Embedded Content`,然后点击"+"按钮来添加这个框架。确保在"Embed"选项中选择"Embed & Sign",这样JavaScriptCore就会在运行时随你的应用一起加载。 **OC调用JS方法** 1. **创建JSContext对象**: `JSContext`是JavaScriptCore中的主要类,代表一个JavaScript执行环境。你可以通过以下方式创建一个`JSContext`实例: ```objc JSContext *context = [[JSContext alloc] initWithJSGlobalContextRef:JSGlobalContextCreate(NULL)]; ``` 2. **加载JS代码**:使用`evaluateScript:`方法可以将JavaScript代码字符串执行并返回执行结果。 ```objc NSString *jsCode = @"function add(a, b) { return a + b; }"; [context evaluateScript:jsCode]; ``` 3. **调用JS函数**:上述代码中定义了一个名为`add`的函数,我们可以在OC中调用它并传递参数。 ```objc JSValue *result = [context[@"add"] callWithArguments:@[@10, @20]]; NSLog(@"Result: %@", result); ``` **JS调用OC方法** 1. **暴露OC方法给JS**:使用`@objc`和`JSExport`协议来标记OC类和方法,使得它们可以被JavaScript调用。 ```objc @interface MyExportedClass : NSObject - (NSString *)greetWithName:(NSString *)name; @end @implementation MyExportedClass - (NSString *)greetWithName:(NSString *)name { return [NSString stringWithFormat:@"Hello, %@", name]; } @end //在JSContext中设置该类实例MyExportedClass *exportedObject = [[MyExportedClass alloc] init]; context[@"greet"] = exportedObject; ``` 2. **在JS中调用OC方法**:现在在JavaScript中,可以像调用本地函数一样调用`greet`方法。 ```javascript var greeting = greet("World"); console.log(greeting); //输出"Hello, World" ``` **数据类型转换**在OC与JS之间进行方法调用时,需要注意数据类型的转换。JSValue是JavaScriptCore中的核心类,它表示JavaScript值,可以是任何JavaScript的数据类型,如数字、字符串、对象等。JSValue提供了多种方法用于与Objective-C对象进行转换: - `toNumber`:将JSValue转换为NSNumber。 - `toString`:转换为NSString。 - `toObject`:转换为JSObject,可以进一步获取属性或调用方法。 - `callWithArguments:`和`invokeMethod:withArguments:`:用于调用JS方法。 - `valueWithObject:`:将Objective-C对象转换为JSValue,以便在JavaScript环境中使用。通过上述步骤,你可以在iOS应用中使用Objective-C调用JavaScript代码,同时让JavaScript能够访问并调用Objective-C的方法。在实际开发中,结合`JavaScriptCore_demo`中的示例代码,可以更好地理解这些交互过程。这种交互方式不仅提高了代码的灵活性,还为跨平台开发提供了可能。
zip
JavaScriptCore_demo.zip 预估大小:50个文件
folder
JavaScriptCore_demo 文件夹
folder
JavaScriptCore_demo.xcodeproj 文件夹
folder
project.xcworkspace 文件夹
file
contents.xcworkspacedata 164B
folder
xcuserdata 文件夹
folder
shaoting.xcuserdatad 文件夹
file
UserInterfaceState.xcuserstate 16KB
file
project.pbxproj 12KB
folder
xcuserdata 文件夹
folder
shaoting.xcuserdatad 文件夹
folder
xcschemes 文件夹
file
JavaScriptCore_demo.xcscheme 3KB
file
xcschememanagement.plist 491B
folder
JavaScriptCore_demo 文件夹
file
AppDelegate.h 286B
file
ViewController.h 362B
folder
Base.lproj 文件夹
file
Main.storyboard 2KB
file
LaunchScreen.storyboard 2KB
folder
Assets.xcassets 文件夹
folder
AppIcon.appiconset 文件夹
file
Contents.json 1KB
file
main.m 343B
file
Test.html 601B
file
Info.plist 1KB
file
AppDelegate.m 2KB
file
ViewController.m 4KB
folder
.git 文件夹
file
HEAD 23B
file
index 2KB
file
COMMIT_EDITMSG 15B
folder
objects 文件夹
folder
d4 文件夹
file
902c25ab3d029713c921d0a09bbe5279eb240d 146B
folder
59 文件夹
file
fbe3a1c1b3f95cf877f060d727398b9076ee9f 97B
folder
e6 文件夹
file
a47ecced68e42111a473fba53e94ba4ef12342 314B
folder
f5 文件夹
file
6d2f3bb56e8474d49393008be744986bd41c3c 719B
file
bb1d76619bd15417fd5d88a605dbe67ce2dfa3 131B
folder
07 文件夹
file
943558713b5ffc926b13d088f6ba1560faf40f 925B
folder
c0 文件夹
file
d01a2223c2addaad47e25efc822a18ba063c87 234B
folder
36 文件夹
file
d2c80d8893178d7e1f2964085b273959bfdc28 201B
folder
2e 文件夹
file
721e1833f03bb0e1b962a84491d7e43e3fef9c 753B
folder
90 文件夹
file
906a068ac0958893ce4fd10e373572c8901219 510B
folder
pack 文件夹
folder
db 文件夹
file
3c7d360271aa8dd16427c0b8a0b8141684542e 127B
file
3f0ce163c8033a175d27de6a4e96aadc115625 59B
folder
11 文件夹
file
d81695fa01195cb0bb8c7f4c898bb8437eb196 848B
file
ec78544de222ece136042ccd7bdc8a9d1c3e1d 270B
folder
16 文件夹
file
1761258e6870d9049325adf087facc75e8a6a3 323B
folder
b0 文件夹
file
4364089fdc64fe3b81bcd41462dd55edb7a001 57B
folder
54 文件夹
file
8be297029868413991b7e0290282b3de1fa2dd 95B
folder
c1 文件夹
file
3d37ffbd800d55da679e0b44704cbbf9779dca 285B
folder
fb 文件夹
file
cbe80f0033dd017fa590bf77c1217c8c79db65 51B
folder
79 文件夹
file
8e1534ad77907672b85cd974e6e43f599d762e 3KB
folder
74 文件夹
file
01ee4205407905b0e24d02d99bfb14c407f022 69B
folder
ee 文件夹
file
724d5b577d0029cf9ede2a258385ea22e5e2c0 62B
folder
f7 文件夹
file
0fde2277c1dbbbdc2e7bf9a907e61b6954377f 184B
folder
d2 文件夹
file
34897026d9e28b5778b4ddb2b524d487c4ec28 115B
folder
40 文件夹
file
c6215d906736d7b2a439c17cf9ee0776580474 535B
folder
info 文件夹
file
description 73B
file
config 137B
folder
info 文件夹
file
exclude 40B
folder
hooks 文件夹
file
README.sample 177B
folder
logs 文件夹
file
HEAD 161B
folder
refs 文件夹
folder
heads 文件夹
file
master 161B
folder
refs 文件夹
folder
tags 文件夹
folder
heads 文件夹
file
master 41B
...
zip 文件大小:55.66KB