How is an ObjC JS bridge translated?

后端 未结 2 813
轻奢々
轻奢々 2020-12-21 18:32

How does the JavaScriptCore framework translate JavaScript objects into Objective-C objects, and vice versa? Does the bridge use the same binary protocol to communicate for

相关标签:
2条回答
  • 2020-12-21 18:56

    The Objective-C framework introduced with iOS7 does all the heavy lifting for you. You don't need to think of the objects as the same binary but interpreted differently - the framework performs a copy when converting between ObjC and Javascript.

    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 framework will build JS getter/setters so inside Javascript you can just do:

    myJSPointVar.x = 10;
    

    For those readers looking for an intro to the JavaScriptCore framework, check out the 2013 WWDC video/pdf "Integrating JavaScript into Native Apps" session on Apple's developer network: https://developer.apple.com/videos/wwdc/2013/?id=615

    0 讨论(0)
  • 2020-12-21 19:10

    Have a look at this class: NSJSONSerialization.

    0 讨论(0)
提交回复
热议问题