Comment appeler une méthode Objective-C à partir de Javascript dans une application Cocoa / WebKit?

StackOverflow https://stackoverflow.com/questions/92471

Question

J'ai une application Cocoa qui utilise une WebView pour afficher une interface HTML. Comment puis-je appeler une méthode Objective-C à partir d'une fonction Javascript dans l'interface HTML?

Était-ce utile?

La solution

Ceci est documenté à l'adresse . apple.com .

Autres conseils

Si vous voulez le faire dans les applications iPhone, vous devrez faire un tour avec la méthode UIWebViewDelegate shouldStartLoadWithRequest:

Cette api http://code.google.com/p/jsbridge- to-cacoa / le fait pour vous. Il est très léger.

Etant plutôt verte, la documentation d’Apple est assez inutilisable pour moi. J’ai donc fait une preuve de concept en appelant des méthodes Objective C à partir de javascript et vice versa dans Cocoa, bien que cette dernière soit beaucoup plus simple.

Assurez-vous d’abord que votre vue Web est définie comme étant setFrameLoadDelegate:

[testWinWebView setFrameLoadDelegate:self];

Vous devez indiquer à la vue Web de surveiller un objet spécifique dès qu'il est chargé:

- (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"];
}

Ensuite, les affaires de la communication:

// 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;
}

La clé est que si vous souhaitez appeler plusieurs méthodes, vous devez toutes les exclure de la méthode isSelectorExcludedFromWebScript, et vous avez besoin de l'appel javascript pour mapper la méthode ObjC dans webScriptNameForSelector.

Fichier complet de la preuve de concept du projet: https://github.com/bytestudios/JS-function-and-ObjC -method-connector

J'ai une solution utilisant NimbleKit. Il peut appeler des fonctions Objective C à partir de Javascript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top