2015-01-26 16 views
6

Ho una classe NSURLProtocol personalizzata che ho implementato con l'aiuto di this tutorial. Le mie implementazioni sono praticamente le stesse del tutorial, a parte nomi, modello di dati, ecc ...iOS - Utilizzare AFNetworking con classe NSURLProtocol personalizzata

In sostanza, sto tentando di inviare una richiesta HTTP, ma invece dell'URL che inizia con: "http: // ", deve iniziare con, dire:" bla: // "

Ora, sto provando a registrare la classe di protocollo e ad usarla tramite il framework AFNetworking, e ho qualche problema.

Il metodo canInitWithRequest: inizia a restituire NO ad un certo punto e, a questo punto, la richiesta non riesce e continuo a ricevere un errore "URL non supportato".

Oltre alla registrazione della classe protocollo, ho cercato di aggiungere la classe di AFHTTPSessionManager s' protocolClasses chiamando questo nel metodo 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]; 

e ho anche aggiunto lo schema URL all'URL Schemi nel app info.plist

Ancora senza fortuna ... È quello che sto cercando di fare anche possibile? E se sì, cosa potrei mancare? Grazie

+0

I tuoi metodi nella classe NSURLProtocol vengono richiamati? – gnasher729

+0

Sì, i metodi del protocollo sembrano funzionare correttamente. Inoltre, quando inserisco "http: //" all'inizio dell'URL della richiesta, il server risponde (ovviamente con la risposta sbagliata, perché è il protocollo sbagliato). Quindi le richieste sono state sicuramente inviate. – orenk86

+1

Ho appena provato ciò che ryanwa suggerisce e funziona. –

risposta

5

Così, per altri alla ricerca di informazioni su questo:

Insieme con il fatto che AFURLSessionManager non usa lo standard NSURLProtocol registrazioni, elabora anche la matrice First-In-First-Out, non ultimo-in -Prima uscita come NSURLProtocol.

Significato, se si desidera sovrascrivere il comportamento del AFURLSessionManager (dire a scopo di test), non si può semplicemente aggiungere il NSURLProtocol sottoclasse a session.configuration.protocolClasses, è invece necessario aggiungerlo al l'inizio della matrice (o almeno di fronte al comportamento che stai sovrascrivendo/modificando).

+0

Risposta corretta: cambiare la riga '[protocolsArray addObject: [MyURLProtocol class]];' a '[protocolsArray insertObject: [MyURLProtocol class] atIndex: 0 ]; 'shuld funziona. –

-1

Ciao [AFHTTPSessionManager manager] non restituisce un oggetto singleton invece restituisce una nuova istanza. Quindi, se si imposta protocolClasses in didFinishLaunchingWithOptions per un'istanza di AFHTTPSessionManager ma si utilizza un'altra istanza creata da [AFHTTPSessionManager manager] altrove, il nuovo gestore non ha la propria classe di protocollo personalizzata registrata. Questo potrebbe causare problemi.

+0

Grazie! è molto bello saperlo. Ho spostato l'istanza di AFHTTPSessionManager in una classe di utilità singleton nella mia app, ma sfortunatamente questo non ha risolto il mio problema. BTW, si scopre che il progetto di esempio mi dà lo stesso risultato quando faccio un pugno nell'indirizzo del mio server. Ho la sensazione che ci sia qualcosa di sbagliato nell'implementazione del protocollo stesso ... – orenk86

2

Quindi, in primo luogo @dopcn ha ragione che è necessario conservare l'istanza di AFHTTPSessionManager.

@ryanwa era parzialmente corretto che è necessario inserire il nuovo protocollo all'inizio dell'array, ma non funzionerà ancora perché la configurazione non può essere modificata dopo aver effettuato il NSURLSession. La soluzione corretta è quella di utilizzare 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! 

Per quanto io sappia non è necessario registrare il proprio NSURLProtocol sottoclasse con registerClass. Questo ha funzionato per me su iOS 9.1 su un iPad Mini 4.

Dalla documentazione sulla NSURLSession:

@property(readonly, copy) NSURLSessionConfiguration *configuration

Descrizione

Una copia dell'oggetto di configurazione per questa sessione. (sola lettura) La modifica dei valori mutabili nell'oggetto di configurazione non ha alcun effetto sulla sessione corrente, ma è possibile creare una nuova sessione con l'oggetto di configurazione modificato.

Problemi correlati