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: "?
risposta
Sembra che ci sia un'API pubblica per questo;) How to use NSURLConnection to connect with SSL for an untrusted cert?
Grazie! Strano che Google non l'abbia presentato. – Michael
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.
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. –
@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
In questo modo la tua app verrà sicuramente respinta. – Franklin
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.
È possibile utilizzare un NSURLConnection invece di un CFHTTPMessageRef? Preferirei che il download fosse asincrono. – Michael
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.
setAllowsAnyHTTPSCertificate sembra essere ora supportato in OS X 10.6.6 del tutto.
Ho detto 10.6.6? Forse avrei dovuto dire "Snow Vista".
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.
Funziona a meraviglia! Grazie – Chris
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
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
Perché si desidera consentire i certificati HTTP non validi in primo luogo? –
Ciao .. il tuo problema è stato risolto ma per questo hai escluso il metodo sopra nel tuo codice sorgente? –