Ho risolto questo problema attendendo il risultato finché non viene restituito il valore del risultato.
ho usato NSRunLoop per l'attesa, ma non sono sicuro che sia meglio o no ...
Ecco il codice sorgente di categoria estensione che sto usando ora.
@interface WKWebView(SynchronousEvaluateJavaScript)
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
@end
@implementation WKWebView(SynchronousEvaluateJavaScript)
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
{
__block NSString *resultString = nil;
__block BOOL finished = NO;
[self evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
if (error == nil) {
if (result != nil) {
resultString = [NSString stringWithFormat:@"%@", result];
}
} else {
NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
}
finished = YES;
}];
while (!finished)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
return resultString;
}
@end
codice di esempio)
NSString *userAgent = [_webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"userAgent: %@", userAgent);
'NSString * returnVal = [self.webView stringByEvaluatingJavaScriptFromString: @ "func (\" arg \ ")"];' non si questo lavoro? – l0gg3r
No questa funzione è in UIWebView e funziona, ho bisogno di cambiarlo in WKWebView. Posso risolverlo con qualche callback, ma è troppo complicato nel mio progetto. – redak105
hm ... strano, cosa produce la console? after NSLogs – l0gg3r