首页 > 解决方案 > 评估 WKWebview 的 javascript 方法会出现问题

问题描述

我正在使用以下函数来评估 javascript,但在主线程上运行此方法会阻止应用程序。while循环永远不会结束。有没有其他方法可以做到这一点或这种方法有任何修复?

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

            return resultString;
        }

标签: iosobjective-cwkwebview

解决方案


当您调用 时-[NSRunLoop runMode:beforeDate:],该调用将在运行循环等待输入时阻塞。

您需要创建一个 NSPort 并将其添加为 NSRunLoop 的输入源,然后再运行它。在你的异步 evaluateJavaScript 回调中,创建一个 NSPortMessage,然后将它发送到 NSPort。这将导致-[NSRunLoop runMode:beforeDate:]调用返回,触发您完成的检查。

但是,也许您可​​以备份并发布您要解决的问题?最好避免像这样的同步进程间通信,以使您的应用程序的主线程尽可能自由。这可能是 WKWebView 不公开 evaluateJavaScript 的同步变体的原因。


推荐阅读