Frage

Ich habe eine Cocoa -App, die eine WebView verwendet, um eine HTML -Schnittstelle anzuzeigen. Wie würde ich eine Ziel-C-Methode aus einer JavaScript-Funktion innerhalb der HTML-Schnittstelle aufrufen?

War es hilfreich?

Lösung

Dies wird bei dokumentiert Entwickler.apple.com.

Andere Tipps

Wenn Sie es in iPhone -Apps tun möchten, müssen Sie mit der UIWebViewDelegate -Methode einen Trick machen, der mithilfe von Withrequest starten sollte:

Diese API http://code.google.com/p/jsbridge-to-cocoa/ Macht es für dich. Es ist sehr leicht.

Die Dokumentation von Apple ist für mich ziemlich unbrauchbar. Deshalb habe ich einen Beweis für das Konzept des Aufrufens von Methoden C aus JavaScript und in Kakao vorgenommen, obwohl letztere viel einfacher war.

Stellen Sie zunächst sicher, dass Sie Ihre WebView als setFrameloaddelegate haben:

[testWinWebView setFrameLoadDelegate:self];

Sie müssen dem WebView mitteilen, dass sie nach einem bestimmten Objekt nach einem bestimmten Objekt achten sollen, sobald es geladen ist:

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame {
    //add the controller to the script environment
    //the "ObjCConnector" object will now be available to JavaScript
    [windowScriptObject setValue:self forKey:@"ObjCConnector"];
}

Dann das Geschäft der Kommunikation:

// a few methods to log activity
- (void)acceptJavaScriptFunctionOne:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionOne: %@",logText);
}
- (void)acceptJavaScriptFunctionTwo:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionTwo: %@",logText);
}

//this returns a nice name for the method in the JavaScript environment
+(NSString*)webScriptNameForSelector:(SEL)sel {
    NSLog(@"%@ received %@ with sel='%@'", self, NSStringFromSelector(_cmd), NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:))
        return @"functionOne"; // this is what you're sending in from JS to map to above line
    if(sel == @selector(acceptJavaScriptFunctionTwo:))
        return @"functionTwo"; // this is what you're sending in from JS to map to above line
    return nil;
}

//this allows JavaScript to call the -logJavaScriptString: method
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {
    NSLog(@"isSelectorExcludedFromWebScript: %@", NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:) ||
       sel == @selector(acceptJavaScriptFunctionTwo:))
        return NO;
    return YES;
}

Der Schlüssel ist, dass Sie, wenn Sie mehrere Methoden haben, die Sie anrufen möchten, alle in der Methode isSelectorexcludedFromWebscript ausgeschlossen werden müssen, und Sie benötigen den JavaScript -Aufruf, um der OBJC -Methode in WebScriptnameForSelector zuzuordnen.

Vollständiger Projektproof der Konzeptdatei:https://github.com/Bytestudios/js-function-objc-Method-Connector

Ich habe eine Lösung mit Nimblekit. Es kann objektive C -Funktionen von JavaScript aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top