PhoneGap.exec() passing objects between JS

2020-06-04 15:52发布

问题:

The only way I found to passing objects between the JS and Obj-C it's by encoding the JS object by using JSON.stringify() and pass the json string to PhoneGap.exec

PhoneGap.exec('Alarm.update',JSON.stringify(list));

... and rebuild the object in Obj-C:

NSString *jsonStr = [arguments objectAtIndex:0];
jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@"\\\"" withString:@"\""];
jsonStr = [NSString stringWithFormat:@"[%@]",jsonStr];
NSObject *arg = [jsonStr JSONValue];

It's that correct ? there is a better/proper/official way for doing this ?

回答1:

I think this is the best way to do it, if not the only way.

The PhoneGap.exec call just takes a NSDictionary of objects under the covers so I don't see of a better way to handle it.

most methods are structured like

- (void)someMethod:(NSArray*)arguments withDict:(NSDictionary*)options {
}


回答2:

PhoneGap.exec was designed for simple types. Your way is ok, alternately you can just pass your single object in (would only work for a single object only, see footer about how we marshal the command), and it should be in the options dictionary for the command. Then on the Objective-C side, use key-value coding to automatically populate your custom object with the dictionary.

e.g. MyCustomObject* blah = [MyCustomObject new]; [blah setValuesForKeysWithDictionary:options];

If you are interested in how PhoneGap.exec works, read on...

* --------- *

For PhoneGap.exec, the javascript arguments are marshaled into a URL.

For the JS command: PhoneGap.exec('MyPlugin.command', 'foo', 'bar', 'baz', { mykey1: 'myvalue1', mykey2: 'myvalue2' });

The resulting command url is: gap://MyPlugin.myCommand/foo/bar/baz/?mykey1=myvalue1&mykey2=myvalue2

This will be handled and converted on the Objective-C side. foo, bar, baz are put in the arguments array, and the query parameters are put in the options dictionary. It will look for a class called 'MyPlugin' and will call the selector 'myCommand' with the arguments array and options dictionary as parameters.

For further info, see phonegap.js, look at PhoneGap.run_command