Domanda

Ho un Cacao applicazione che utilizza una WebView per visualizzare un'interfaccia HTML.Come posso fare per chiamare un Obiettivo-C metodo da una funzione Javascript nel codice HTML interfaccia?

È stato utile?

Soluzione

Questo è documentato developer.apple.com.

Altri suggerimenti

Se vuoi farlo in applicazioni per iPhone, si avrebbe bisogno di fare un trucco con il UIWebViewDelegate metodo shouldStartLoadWithRequest:

Questa api http://code.google.com/p/jsbridge-to-cocoa/ che fa per voi.È molto leggero.

Piuttosto verde, la documentazione di Apple è praticamente inutilizzabile per me, così ho fatto una prova di concetto di chiamare Obiettivo C metodi di javascript e viceversa nel Cacao, anche se quest'ultimo era molto più facile.

Prima assicurati di avere il vostro webview come setFrameLoadDelegate:

[testWinWebView setFrameLoadDelegate:self];

È necessario indicare la webview a guardare per un oggetto specifico non appena si è caricato:

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

Quindi il business della comunicazione:

// 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 chiave è che se si dispone di più metodi che desideri chiamare, è necessario disporre di tutti esclusi isSelectorExcludedFromWebScript metodo, e hai bisogno di javascript chiamata a fare una mappa per l'ObjC metodo webScriptNameForSelector.

Progetto "prova di concetto" file:https://github.com/bytestudios/JS-function-and-ObjC-method-connector

Ho una soluzione che utilizza NimbleKit.È possibile chiamare Obiettivo C funzioni Javascript.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top