iOS: use AFNetworking con la class personalizada NSURLProtocol

Tengo una class NSURLProtocol personalizada que he implementado con la ayuda de este tutorial . Mis implementaciones son más o less las mismas que en el tutorial, aparte de los nombres, el model de datos, etc.

Básicamente, estoy intentando enviar una request HTTP, pero en lugar de la URL que comienza con: "http: //", debe comenzar con, digamos: "bla: //"

Ahora, estoy tratando de registrar la class de protocolo y usarla a través del marco AFNetworking, y estoy teniendo algunos problemas.

El método canInitWithRequest: comienza a devolver NO en algún momento, y en este punto la request falla y sigo recibiendo un error de "URL no compatible".

Además de registrar la class de protocolo, he intentado agregar la class al protocolClasses AFHTTPSessionManager de AFHTTPSessionManager llamando a esto en el método didFinishLaunchingWithOptions :

 [NSURLProtocol registerClass:[MyURLProtocol class]]; NSMutableArray *protocolsArray = [NSMutableArray arrayWithArray:[AFHTTPSessionManager manager].session.configuration.protocolClasses]; [protocolsArray addObject:[MyURLProtocol class]]; [AFHTTPSessionManager manager].session.configuration.protocolClasses = [protocolsArray copy]; 

Y también agregué el esquema de URL al campo Esquemas de URL en la información de la aplicación.

Aún no hay suerte … ¿Es posible lo que bash hacer? Y si es así, ¿qué podría estar perdiendo? Gracias

Entonces, para otros que buscan información sobre esto:

Junto con el hecho de que AFURLSessionManager no utiliza los loggings estándar NSURLProtocol , también procesa el set Primero en NSURLProtocol , primero en salir, no en último en salir como el NSURLProtocol .

Es decir, si desea sobrescribir el comportamiento del AFURLSessionManager (por ejemplo, para propósitos de testing), no puede agregar su subclass NSURLProtocol a NSURLProtocol , sino que debe agregarlo al comienzo de la matriz (o al less delante del comportamiento que está sobreescribiendo / modificando).

Entonces, en primer lugar, @dopcn tiene razón al tener que retener su instancia de AFHTTPSessionManager .

@ryanwa fue parcialmente correcto que necesita insert el nuevo protocolo al inicio de la matriz, pero todavía no funcionará porque la configuration no se puede cambiar después de que se NSURLSession realizado la NSURLSession . La solución correcta es usar initWithSessionConfiguration :

 NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSMutableArray * protocolsArray = [sessionConfiguration.protocolClasses mutableCopy]; [protocolsArray insertObject:[MyURLProtocol class] atIndex:0]; sessionConfiguration.protocolClasses = protocolsArray; AFHTTPSessionManager * myManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:sessionConfiguration]; //retain this somewhere! 

Hasta donde yo sé, no es necesario que registre su subclass NSURLProtocol con registerClass . Esto funcionó para mí en iOS 9.1 en un iPad Mini 4.

De los documentos en NSURLSession :

@property(readonly, copy) NSURLSessionConfiguration *configuration

Descripción

Una copy del object de configuration para esta session. (de solo lectura) Cambiar los valores mutables dentro del object de configuration no tiene ningún efecto en la session actual, pero puede crear una nueva session con el object de configuration modificado.

Hola, [AFHTTPSessionManager manager] no devuelve un object singleton, sino que devuelve una nueva instancia. Por lo tanto, si acaba de establecer protocolClasses en didFinishLaunchingWithOptions para una instancia de AFHTTPSessionManager pero usa otra instancia creada por [AFHTTPSessionManager manager] otro lugar, el nuevo administrador no tiene registrada su class de protocolo personalizada. Esto puede llevar a un problema.