WebScriptObject
Objective-C (OS X) の WebView でa を使用してJavaScript メソッドを呼び出しています。配列や辞書などのオブジェクトを送受信したい。
次のように受け取ることができます。
// JWJSBridge
+ (BOOL)isSelectorExpludedFromWebScript:(SEL)selector {
if (selector == @selector(log:)) {
return NO;
}
return YES;
}
+ (NSString *)webScriptNameForSelector:(SEL)selector {
if (selector == @selector(log:)) {
return @"log";
}
return nil;
}
- (void)log:(WebScriptObject *)object {
NSLog(@"object: %@", [[object JSValue] toObject]);
}
このオブジェクトは、次のように JavaScript 環境に設定されます。
WebScriptObject *windowObject = [[self webView] windowScriptObject];
[windowObject setValue:[[JWJSBridge alloc] init] forKey:@"external"];
次に、オブジェクトをログwindow.external.log({key: "value"});
に記録するような JavaScript 呼び出しを行うと、.JWJSBridge
NSDictionary
今、私はそれを他の方法でも実装したいと考えています。そのために、次のような JavaScript オブジェクトを作成しました。
window.internal = {log = function(a) { console.log(a); }};
配列で完全に機能します。
WebScriptObject *internal = [[self webView] valueForKey:@"internal"];
[internal callWebScriptMethod:@"log" withArguments:@[@[@"value", @"value"]]];
しかし、辞書を送信したい場合、それは不可能です:
[internal callWebScriptMethod:@"log" withArgument:@[@{@"key": @"value"}]];
残念ながら、オブジェクトが空のコンソール メッセージが表示されることを知っておいてくださいObjCRuntimeObject
。どうやら、Objective C は辞書を JavaScript オブジェクトにシリアライズしない / できないようです。私が見つけることができたドキュメントの小さなチャンク (ここで参照するために再び見つけることはできませんでした) は、それが配列でのみ機能することを示しています。
Apple にバグレポートを提出しました: 19464522
Objective-C API は、すべてをオブジェクト形式の JavaScript に変換するメソッドを提供するのに、その逆は提供しないのはなぜですか?!
可能性があるに違いないので、どうすればこれを達成できますか?