IOS7中苹果提供了javascriptCore的框架,通过这个框架可以让OC与JavaScript之间的转换更加方便,这个框架基于之前的webkit库,现在被苹果引入标准库来使用,其中JSValue 的作用就是在 Objective-C 对象和 JavaScript 对象之间起转换作用,下面是转换的对应图:
执行javaScript脚本
可使用
- (JSValue *)evaluateScript:(NSString *)script;
[编辑]转换例子
- 简单的数值转换
JSContext *context = [[JSContext alloc] init]; JSValue *jsVal = [context evaluateScript:@"21+7"]; int iVal = [jsVal toInt32]; NSLog(@"JSValue: %@, int: %d", jsVal, iVal); //Output: // JSValue: 28, int: 28
- NSArray的转换
JSContext *context = [[JSContext alloc] init]; [context evaluateScript:@"var arr = [21, 7 , 'iderzheng.com'];"]; JSValue *jsArr = context[@"arr"]; // Get array from JSContext NSLog(@"JS Array: %@; Length: %@", jsArr, jsArr[@"length"]); jsArr[1] = @"blog"; // Use JSValue as array jsArr[7] = @7; NSLog(@"JS Array: %@; Length: %d", jsArr, [jsArr[@"length"] toInt32]); NSArray *nsArr = [jsArr toArray]; NSLog(@"NSArray: %@", nsArr); //Output: // JS Array: 21,7,iderzheng.com Length: 3 // JS Array: 21,blog,iderzheng.com,,,,,7 Length: 8 // NSArray: ( // 21, // blog, // "iderzheng.com", // "<null>", // "<null>", // "<null>", // "<null>", // 7 // )
- 关于block在JS中的使用
JSContext *context = [[JSContext alloc] init]; context[@"log"] = ^() { NSLog(@"+++++++Begin Log+++++++"); NSArray *args = [JSContext currentArguments]; for (JSValue *jsVal in args) { NSLog(@"%@", jsVal); } JSValue *this = [JSContext currentThis]; NSLog(@"this: %@",this); NSLog(@"-------End Log-------"); }; [context evaluateScript:@"log('ider', [7, 21], { hello:'world', js:100 });"]; //Output: // +++++++Begin Log+++++++ // ider // 7,21 // [object Object] // this: [object GlobalObject] // -------End Log-------
相关链接:
JavaScript into Native Applications - Tracy E
JavaScriptCore and iOS 7
Execute Javascript in iOS Applications