2010-01-04 4 views
16

La mia applicazione iPhone è stata rifiutata esclusivamente per l'utilizzo del metodo privato (molto sicuro, sembra) +setAllowsAnyHTTPSCertificate:forHost: per NSURLRequest. Esiste un'API non privata per emulare questa funzionalità?Metodo alternativo per "setAllowsAnyHTTPSCertificate" privato di NSURLRequest: forHost: "?

+2

Perché si desidera consentire i certificati HTTP non validi in primo luogo? –

+0

Ciao .. il tuo problema è stato risolto ma per questo hai escluso il metodo sopra nel tuo codice sorgente? –

risposta

1

Una soluzione veramente stupido è quello di rendere il proprio metodo di categoria:

@implementation NSURLRequest (IgnoreSSL) 

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host 
{ 
    return YES; 
} 

@end 

Questo dovrebbe ottenere mediante controlli API private di Apple, ma è ancora la stessa cosa (usando un, privato API non documentate [1] che è passibile di rottura in qualsiasi momento). In realtà, è peggio perché consente tutto, non solo quell'host.

[1]: Un'API privata che deve essere pubblicata su ma un'API privata.

+1

Da quanto ne so, questo non supererà ancora i controlli di Apple, in quanto sembrano utilizzare un'analisi piuttosto semplice basata esclusivamente su selettori, non sul loro utilizzo. –

+0

@Mike: sei sicuro? Non sto affatto "usando" il selettore, solo ridefinendolo. È internals di Apple che lo chiamano. Certo, questo non è affatto sicuro, ma non vedo come non passerebbe gli assegni di Apple. – Michael

+1

In questo modo la tua app verrà sicuramente respinta. – Franklin

1

Date un'occhiata a questo link: http://www.abstractec.co.uk/blog/iPhone.php?itemid=70

potrebbe essere una soluzione migliore per voi che solo ingannando il controllo di API private.

+0

È possibile utilizzare un NSURLConnection invece di un CFHTTPMessageRef? Preferirei che il download fosse asincrono. – Michael

0

Non una soluzione, ma un suggerimento. Hai pensato di utilizzare ASIHttpRequest Framework per questo? Questo quadro è completo sotto tutti gli aspetti. Controlla la documentazione, forse può aiutarti anche tu.

0

setAllowsAnyHTTPSCertificate sembra essere ora supportato in OS X 10.6.6 del tutto.

Ho detto 10.6.6? Forse avrei dovuto dire "Snow Vista".

6

In realtà, sto testando con 10.6.8 e questo codice funziona ancora - sta usando l'API privata ma controllando che il selettore esista (myurl è l'NSURL che sto provando a caricare in una WebView o NSURLConnection) :

SEL selx = NSSelectorFromString(@"setAllowsAnyHTTPSCertificate:forHost:"); 
if ([NSURLRequest respondsToSelector: selx]) 
{ 
    IMP fp; 

    fp = [NSURLRequest methodForSelector:selx]; 

    (fp)([NSURLRequest class], selx, YES, [myurl host]); 
} 

nota che "@selector" non è stato utilizzato in modo che assolutamente tutto il lavoro sarebbe stato fatto a tempo di esecuzione. Ciò lo rende sicuro e nascosto dagli assegni di Apple, soprattutto se si oscura la stringa.

+0

Funziona a meraviglia! Grazie – Chris

+1

Non una soluzione consigliata: (1) non si offre all'utente la possibilità di accettare o meno. (2) Stai scrivendo in un forum pubblico se Apple capita su di esso che potrebbe farci saggio. (3) Vedi la risposta di Yonel: http://stackoverflow.com/a/2145367/818352 – George

+0

Volevo solo dire che questo ha funzionato per me finché non sono usciti i 5S e iPad Air - si blocca qui (sul cast) su uno di questi dispositivi. – Luke