Problema de interceptación de la página web WKWebView
Como todos sabemos, después de iOS 8.0, Apple proporcionó un WKWebView para reemplazar UIWebView. El primero está mucho más optimizado en cuanto a velocidad de carga que el segundo, pero también hay muchos peligros ocultos. , como Cuando se trata de interceptar solicitudes WKWebView, Apple nunca ha proporcionado una API clara para que la utilicen los desarrolladores. Apple nunca ha proporcionado una API clara para que la utilicen los desarrolladores. En circunstancias normales, personalizamos una clase NSURLProtocol y luego la registramos en AppDelegate para interceptar todas las solicitudes de red en la APLICACIÓN, pero encontrará que wkwebView no acepta esto. ¡qué demonios! ? Algunas personas en Internet dicen que la solicitud de wkwebView está en un proceso separado. Por razones de rendimiento, no se usa NSURLProtocol, pero a través del punto de interrupción, se encontrará que usará + (BOOL) canInitWithRequest: (NSURLRequest *) solicitud, que La solicitud no va a NSURLProtocol, pero no va a NSURLProtocol, la solicitud no va a NSURLProtocol, la solicitud no va a NSURLProtocol. Sin embargo, esto es muy extraño, ¿por qué desaparece por un tiempo y luego nunca vuelve a hacerlo? Entonces comencé a participar en una ola de discusiones técnicas, pregunté a algunos expertos y encontré una solución: escribir un método de clasificación separado en la clase NSURLProtocol. Aquí hay un recordatorio: dado que este es un método privado, ¡puede resultar en una negación en línea! !!!!
Archivo .h:
Archivo .m:
Luego vaya a AppDelegate para registrar una ola de soluciones, generalmente http y https, y luego inicie una ola Breakpoint y descubrirá que puede interceptarlo y hacer lo que quiera. Generalmente, la razón por la que se intercepta wkwebView es para agregar algunos encabezados de solicitud específicos o interceptar anuncios (así es como se comunica con las personas en el proyecto)
+ (BOOL)canInitWithRequest: (NSURLRequest *)el juicio de filtrado de solicitudes se realiza aquí,
+ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request La solicitud interceptada se puede obtener aquí y la solicitud se puede procesar aquí ¡Realice un procesamiento secundario y luego personalícelo en el método startLoading!