Como chamar um método Objective-C do JavaScript em um aplicativo de cacau/webkit?
-
01-07-2019 - |
Pergunta
Eu tenho um aplicativo de cacau que usa um WebView para exibir uma interface HTML. Como eu chamaria um método Objective-C de uma função JavaScript dentro da interface HTML?
Solução
Isso está documentado em desenvolvedor.apple.com.
Outras dicas
Se você quiser fazer isso em aplicativos para iPhone, precisará fazer um truque com o método UIWebViewDelegate deve servir de cargaWithRequest:
Esta API http://code.google.com/p/jsbridge-to-cocoa/ faz isso por você. É muito leve.
Sendo bastante verde, a documentação da Apple é bastante inutilizável para mim, então fiz uma prova de conceito de chamar métodos C Objetivos de JavaScript e vice -versa no cacau, embora o último fosse muito mais fácil.
Primeiro, certifique -se de ter seu WebView como o SetFramEloadDelegate:
[testWinWebView setFrameLoadDelegate:self];
Você precisa dizer ao WebView para observar um objeto específico assim que estiver carregado:
- (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"];
}
Então o negócio da comunicação:
// 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;
}
A chave é que, se você tiver vários métodos que deseja ligar, precisará que todos eles sejam excluídos no método ISSELECTOREXCLUDEDFROMWEBScript e precisará da chamada JavaScript para mapear para o método OBJC no WebScriptNameForSelector.
Arquivo completo de prova de conceito do projeto:https://github.com/bytestudios/js-function-and-objc-method-conector
Eu tenho uma solução usando o NimbleKit. Ele pode chamar funções objetivas C do JavaScript.