Как читать программные журналы wkwebview программно

Я пытаюсь прочитать консольные журналы webapp, которые программно загружаются в мой WkWebview.

пока в моих исследованиях это невозможно.

Любая помощь в достижении этого будет оценена!

Ответ 1

Пожалуйста, используйте это красивое приложение " Bridge"

Edit:

self.webView = [[WBWKWebView alloc] initWithFrame:self.view.bounds];
self.webView.JSBridge.interfaceName = @"WKWebViewBridge";
WBWebDebugConsoleViewController * controller = [[WBWebDebugConsoleViewController alloc] initWithConsole:_webView.console];

Затем вы можете использовать метод делегата:

- (void)webDebugInspectCurrentSelectedElement:(id)sender
{
// To use the referenced log values
}

Ответ 2

Можно подключить браузер Safari на вашем Mac к WKWebView и получить доступ к консоли.

В Safari откройте вкладку "Разработка" и, пока симулятор iOS работает с открытым WKWebView, - просто щелкните по нему, чтобы открыть консоль. См:

enter image description here

Ответ 3

Вы можете переоценить (переопределить) реализацию Javascript console.log() по умолчанию, чтобы использовать window.webkit.messageHandlers.postMessage(msg) для передачи сообщений вперед. А затем перехватите вызов javascript postMessage (msg) в собственном коде, используя WKScriptMessageHandler :: didReceiveScriptMessage, чтобы получить зарегистрированное сообщение.

Шаг 1) Пересмотрите реализацию по умолчанию console.log, чтобы использовать postMessage()

// javascript to override console.log to use messageHandlers.postmessage
NSString * js = @"var console = { log: function(msg){window.webkit.messageHandlers.logging.postMessage(msg) } };";
// evaluate js to wkwebview
[self.webView evaluateJavaScript:js completionHandler:^(id _Nullable ignored, NSError * _Nullable error) {
    if (error != nil)
        NSLog(@"installation of console.log() failed: %@", error);
}];

Шаг 2) Перехват javascript postMessage в нативном коде в WKScriptMessageHandler :: didReceiveScriptMessage

- (void)viewDidLoad
{
    // create message handler named "logging"
    WKUserContentController *ucc = [[WKUserContentController alloc] init];
    [ucc addScriptMessageHandler:self name:@"logging"];
    // assign usercontentcontroller to configuration    
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    [configuration setUserContentController:ucc];
    // assign configuration to wkwebview    
    self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) configuration:configuration];
}


- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    // what ever were logged with console.log() in wkwebview arrives here in message.body property
    NSLog(@"log: %@", message.body);
}

Ответ 4

Обычно ведение журнала консоли определяется в js как

    "window.addEventListener("message",function(e){console.log(e.data)});"

Мой ответ был адаптирован из handling-javascript-events-in-wkwebview!

Инициализировать WKWebView с конфигурацией

    let config = WKWebViewConfiguration()
    let source = "document.addEventListener('message', function(e){
     window.webkit.messageHandlers.iosListener.postMessage(e.data); })"
    let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
    config.userContentController.addUserScript(script)
    config.userContentController.add(self, name: "iosListener")
    webView = WKWebView(frame: UIScreen.main.bounds, configuration: config)

Или используйте свойство KVO "оцененныйProgress" и введите js с помощью JavaScript JavaScript

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
    {
        if ([keyPath isEqualToString:@"estimatedProgress"])
        {
            CGFloat progress = [change[NSKeyValueChangeNewKey] floatValue];
            if (progress>= 0.9)
            {
                NSString *jsCmd = @"window.addEventListener(\"message\",function(e){window.webkit.messageHandlers.iosListener.postMessage(e.data)});";
        //@"document.addEventListener('click', function(e){ window.webkit.messageHandlers.iosListener.postMessage('Customize click'); })";

                [_webView evaluateJavaScript:jsCmd completionHandler:^(id _Nullable obj, NSError * _Nullable error) {
                    NSLog(@"error:%@",error);
                }];
            }
        }
    }

реализовать протокол WKScriptMessageHandler для получения сообщения:

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) 
    {
            print("message: \(message.body)")
            // and whatever other actions you want to take
    }