Tôi đã giải quyết vấn đề này bằng cách đợi kết quả cho đến khi giá trị kết quả được trả về.
tôi đã sử dụng NSRunLoop chờ đợi, nhưng tôi không chắc chắn đó là cách tốt nhất hay không ...
Đây là mã nguồn mở rộng chủng loại mà tôi đang sử dụng bây giờ.
@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
Ví dụ mã)
NSString *userAgent = [_webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"userAgent: %@", userAgent);
'NSString * returnVal = [self.webXem chuỗiByEvaluatingJavaScriptFromString: @" func (\ "arg \") "];' không làm việc này? – l0gg3r
Không có chức năng này trong UIWebView và đang hoạt động, tôi cần thay đổi nó thành WKWebView. Tôi có thể giải quyết nó với một số cuộc gọi lại, nhưng nó quá phức tạp trong dự án của tôi. – redak105
hm ... lạ, đầu ra của bàn điều khiển là gì? sau NSLogs – l0gg3r