Как я могу отслеживать запросы на WKWebview?
Я попытался использовать NSURLprotocol (canInitWithRequest), но он не будет отслеживать запросы ajax (XHR), только навигационные запросы (запросы на документы)
Как я могу отслеживать запросы на WKWebview?
Я попытался использовать NSURLprotocol (canInitWithRequest), но он не будет отслеживать запросы ajax (XHR), только навигационные запросы (запросы на документы)
Наконец, я решил его
Поскольку у меня нет контроля над содержимым веб-представления, я ввел 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];
}
Если вы контролируете содержимое внутри WkWebView
, вы можете отправлять сообщения в свое родное приложение с помощью window.webkit.messageHandlers
всякий раз, когда вы делаете запрос ajax, который будет получен как WKScriptMessage
, которые могут обрабатываться тем, что вы указали как WKScriptMessageHandler
. Сообщения могут содержать любую необходимую информацию и будут автоматически преобразованы в собственные объекты/значения в ваш код Objective-C или Swift.
Если у вас нет контроля над содержимым, вы все равно можете сделать это, введя свой собственный JavaScript через WKUserScript
для отслеживания запросов ajax и отправки сообщений используя указанный выше метод.