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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top