Rozwiązałem ten problem, czekając na wynik, dopóki nie zostanie zwrócona wartość wyniku.
użyłem NSRunLoop oczekiwania, ale nie jestem pewien, że to najlepszy sposób, czy nie ...
Oto kod źródłowy kategoria przedłużenie że używam teraz.
@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
Przykład kodu)
NSString *userAgent = [_webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"userAgent: %@", userAgent);
'NSString * returnVal = [self.webView stringByEvaluatingJavaScriptFromString: @ "func (\" arg \ ")"];' nie ta praca? – l0gg3r
Brak tej funkcji w UIWebView i działa, muszę zmienić ją na WKWebView. Mogę go rozwiązać za pomocą wywołania zwrotnego, ale jest to zbyt skomplikowane w moim projekcie. – redak105
hm ... dziwne, co robi wyjście konsoli? po NSLogs – l0gg3r