Comment puis-je surveiller les demandes sur WKWebview?

Comment puis-je surveiller les demandes sur WKWebview?

J'ai essayé d'utiliser NSURLprotocol (canInitWithRequest) mais il ne surveillera pas les requêtes ajax (XHR), seules les demandes de navigation (demandes de documents)

Finalement, je l'ai résolu

Puisque je n'ai pas le contrôle sur le contenu de la vue Web, j'ai injecté au WKWebview un script java qui inclut un auditeur de demande jjuery AJAX.

Lorsque l'auditeur attrape une requête, il envoie l'application native du corps de requête dans la méthode:

webkit.messageHandlers.callbackHandler.postMessage(data); 

L'application native capture le message dans un délégué appelé:

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

Et effectuer les actions correspondantes

Voici le code pertinent:

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'); } } 

Le délégué My ViewController est:

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

Et à mon avisDidLoad, je crée un 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://#############"]]]; 

Voici le 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]; } 

Si vous avez le contrôle du contenu à l'intérieur de WkWebView vous pouvez envoyer des messages à votre application native en utilisant window.webkit.messageHandlers chaque fois que vous faites une requête ajax, qui sera reçue en tant que WKScriptMessage qui peut être traitée par ce que vous avez désigné comme votre WKScriptMessageHandler . Les messages peuvent contenir toute l'information que vous souhaitez, et seront automatiquement transformés en objets / valeurs natives dans votre code Objective-C ou Swift.

Si vous ne maîtrisez pas le contenu, vous pouvez toujours le faire en injectant votre propre JavaScript via un WKUserScript pour suivre les requêtes ajax et envoyer des messages en utilisant la méthode indiquée ci-dessus.