2

WebScriptObjectObjective-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 呼び出しを行うと、.JWJSBridgeNSDictionary

今、私はそれを他の方法でも実装したいと考えています。そのために、次のような 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 に変換するメソッドを提供するのに、その逆は提供しないのはなぜですか?!

可能性があるに違いないので、どうすればこれを達成できますか?

4

1 に答える 1