我需要更改一个函数,将JavaScript从UIWebView判断为WKWebView.我需要返回这个函数中的求值结果.

现在,我打电话:

[wkWebView evaluateJavaScript:call completionHandler:^(NSString *result, NSError *error)
{
    NSLog(@"Error %@",error);
    NSLog(@"Result %@",result);
}];

但我需要得到返回值这样的结果,比如UIWebView.

推荐答案

Update: This is not working on iOS 12+ anymore.


我通过等待结果直到返回结果值来解决这个问题.

我用nsrunlop等待,但我不确定这是不是最好的方式...

下面是我现在使用的类别扩展源代码:

@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

示例代码:

NSString *userAgent = [_webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

NSLog(@"userAgent: %@", userAgent);

Objective-c相关问答推荐

将 NSMutableAttributedString 转换为 NSString

Objective-c 点表示法或方括号表示法中首选什么?

Objective-c中release和dealloc的区别

为什么 UICollectionView 的 UICollectionViewCell 没有在用户时突出显示?

如何将 NSDate 转换为今天、昨天、一周前、一个月前、一年前等相对格式?

碰撞技术如何运作?

ARC的正确桥接?

.m 文件中的空@interface 声明是做什么用的?

如何计算多边形的圆角?

AdMob 因 [GADObjectPrivate changeState:] 崩溃:无法识别的 Select 器

带有块的 Objective-C 延迟动作

Xcode 7 UI 测试:如何在代码中消除一系列系统alert

如何将 NSOperationQueue 与 NSURLSession 一起使用?

UIDatePicker 中的最小和最大日期

在 iOS 7 上运行应用程序时显示黑条(4 英寸视网膜显示屏)

从视图中删除所有子图层

字符串常量和字符串文字有什么区别?

iPhone SDK:如何在视图中播放视频?而不是全屏

如何判断 WkWebView 是否在 Objective-C 中完成加载?

找出窗口中的 UIBarButtonItem 框架?