How is the ObjC JS bridge translated?

How does the JavaScriptCore framework convert JavaScript objects to Objective-C objects and vice versa? Does the bridge use the same binary protocol for communication for both target languages?

+1
javascriptcore
source share
2 answers

The Objective-C framework introduced with iOS7 does all the heavy lifting for you. You do not need to think of objects as the same binary, but interpreted differently: when converting between ObjC and Javascript, the structure makes a copy .

From JSValue.h:

// Conversion between Objective-C and JavaScript types. // // When converting between JavaScript values and Objective-C objects a copy is // performed. Values of types listed below are copied to the corresponding // types on conversion in each direction. For NSDictionaries, entries in the // dictionary that are keyed by strings are copied onto a JavaScript object. // For dictionaries and arrays, conversion is recursive, with the same object // conversion being applied to all entries in the collection. Objective-C type | JavaScript type --------------------+--------------------- nil | undefined NSNull | null NSString | string NSNumber | number, boolean NSDictionary | Object object NSArray | Array object NSDate | Date object NSBlock * | Function object * id ** | Wrapper object ** Class *** | Constructor object *** * Instances of NSBlock with supported arguments types will be presented to JavaScript as a callable Function object. For more information on supported argument types see JSExport.h. If a JavaScript Function originating from an Objective-C block is converted back to an Objective-C object the block will be returned. All other JavaScript functions will be converted in the same manner as a JavaScript object of type Object. ** For Objective-C instances that do not derive from the set of types listed above, a wrapper object to provide a retaining handle to the Objective-C instance from JavaScript. For more information on these wrapper objects, see JSExport.h. When a JavaScript wrapper object is converted back to Objective-C the Objective-C instance being retained by the wrapper is returned. *** For Objective-C Class objects a constructor object containing exported class methods will be returned. See JSExport.h for more information on constructor objects. 

For example (for simple types):

 NSString *myString = [javascriptContext[@"myJSVar"] toString]; 

and

 javascriptContext[@"myJSVar"] = myString; 

or for a more complex object, use the JSExport protocol:

 @protocol MyPointExports <JSExport> @property double x; @property double y; @end @interface MyPoint : NSObject <MyPointExports> // Put methods and properties not visible to JavaScript code here. @end ... javascriptContext[@"MyPoint"] = [MyPoint class]; // Define the class in Javascript 

then

 MyPoint *p = [javascriptContext[@"myJSPointVar"] toObject]; 

and

 javascriptContext[@"myJSPointVar"] = p; 

For each property declared in the protocol, the structure will create a JS receiver / setters, so inside Javascript you can simply do:

 myJSPointVar.x = 10; 

For those readers who are looking for an introduction to the JavaScriptCore framework, check out the 2013 WWDC video / pdf session “Integrating JavaScript into Native Applications” on the Apple Developer Network: https://developer.apple.com/videos/wwdc/2013/?id= 615

+5
source share

Take a look at this class: NSJSONSerialization .

-one
source share

All Articles