Как я могу отслеживать запросы на WKWebview?

Как я могу отслеживать запросы на WKWebview?

Я попытался использовать NSURLprotocol (canInitWithRequest), но он не будет отслеживать запросы ajax (XHR), только навигационные запросы (запросы на документы)

Ответ 1

Наконец, я решил его

Поскольку у меня нет контроля над содержимым веб-представления, я ввел WKWebview в java script, который включает в себя прослушиватель запросов JQuery AJAX.

Когда слушатель улавливает запрос, он отправляет собственное приложение в тело запроса в методе:

webkit.messageHandlers.callbackHandler.postMessage(data);

Собственное приложение ловит сообщение в делегате с именем:

(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

и выполните соответствующие действия

вот соответствующий код:

ajaxHandler.js -

//Every time an Ajax call is being invoked the listener will recognize it and  will call the native app with the request details

$( document ).ajaxSend(function( event, request, settings )  {
    callNativeApp (settings.data);
});

function callNativeApp (data) {
    try {
        webkit.messageHandlers.callbackHandler.postMessage(data);
    }
    catch(err) {
        console.log('The native context does not exist yet');
    }
}

Мой делегат ViewController:

@interface BrowserViewController : UIViewController <UIWebViewDelegate, WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler, UIWebViewDelegate>

И в моем viewDidLoad(), я создаю WKWebView:

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init];
[self addUserScriptToUserContentController:configuration.userContentController];
appWebView = [[WKWebView alloc]initWithFrame:self.view.frame configuration:configuration];
appWebView.UIDelegate = self;
appWebView.navigationDelegate = self;
[appWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: @"http://#############"]]];                                                     

Вот addUserScriptToUserContentController:

- (void) addUserScriptToUserContentController:(WKUserContentController *) userContentController{
    NSString *jsHandler = [NSString stringWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"ajaxHandler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:NULL];
    WKUserScript *ajaxHandler = [[WKUserScript alloc]initWithSource:jsHandler injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
    [userContentController addScriptMessageHandler:self name:@"callbackHandler"];
    [userContentController addUserScript:ajaxHandler];
}

Ответ 2

Если вы контролируете содержимое внутри WkWebView, вы можете отправлять сообщения в свое родное приложение с помощью window.webkit.messageHandlers всякий раз, когда вы делаете запрос ajax, который будет получен как WKScriptMessage, которые могут обрабатываться тем, что вы указали как WKScriptMessageHandler. Сообщения могут содержать любую необходимую информацию и будут автоматически преобразованы в собственные объекты/значения в ваш код Objective-C или Swift.

Если у вас нет контроля над содержимым, вы все равно можете сделать это, введя свой собственный JavaScript через WKUserScript для отслеживания запросов ajax и отправки сообщений используя указанный выше метод.