JK-вызов WKWebview возвращает ноль
Я пытаюсь перейти от использования UIWebview к WKWebview, и мне нужно вызвать различные функции Javascript, которые живут в веб-представлении.
В UIWebview у меня нет проблем с этим, но WKWebview выдает ошибку WKErrorDomain 4 для всех без исключения вызовов. Я подумал, что это может быть условие гонки, когда я вызываю функции, которых еще не было в DOM, но я добавил оператор отладки, чтобы сделать те же самые вызовы после загрузки страницы, и они не работают. Я даже сделал 'document.body.innerHTML', который возвратил ноль, когда в веб-просмотре явно отображается контент.
Суть в том, что при проверке веб-кода с помощью Safari Web Inspector все работает хорошо и все вызовы работают.
Почему и как это могло быть? Я инициализирую WKWebView с помощью WKWebViewConfiguration, чтобы он мог обмениваться файлами cookie с различными веб-представлениями, поэтому там может быть что-то, но я в тупике.
Вот как я инициализирую WKWebView
WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init];
config.processPool = [[WKProcessPool alloc] init];
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie = 'cookie1=value1; domain=blah; path=/;';" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
config.userContentController = userContentController;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0,0,50,50) configuration:config];
Вот оператор отладки, в котором я записываю innerHTML документа в консольный журнал, который печатает (nil) вместо HTML.
NSLog(@"%@", [self.webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:nil]);
1 ответ
WKWebView выполняет асинхронную JS в отличие от UIWebView; Вы не можете печатать так, как вы делаете..
Попробуй это
[self.webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) {
NSLog(@"Error is %@",error);
NSLog(@"JS result %@" ,result);
}];