我如何监视WKWebview的请求?

我如何监视WKWebview的请求?

我尝试使用NSURLprotocol(canInitWithRequest),但它不会监视Ajax请求(XHR),只有导航请求(文档请求)

最后我解决了它

由于我无法控制Web视图内容,因此我向WKWebview注入了一个包含jQuery AJAX请求侦听器的Java脚本。

当侦听器捕获一个请求时,它会在方法中发送本地应用程序的请求主体:

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() ,我创build了一个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内的内容的控制权,则只要您发出ajax请求,您就可以使用window.webkit.messageHandlers将消息发送到您的本机应用程序,该请求将作为WKScriptMessage接收,可以通过您指定的任何WKScriptMessageHandler 。 消息可以包含任何你想要的信息,并且会自动转换成Objective-C或Swift代码中的本地对象/值。

如果您无法控制内容,您仍然可以通过使用WKUserScript注入您自己的JavaScript来跟踪Ajax请求并使用上述方法发回消息。