2010-01-04 10 views
16

Mi aplicación para iPhone fue rechazada únicamente por usar el (privado, muy seguro) método privado +setAllowsAnyHTTPSCertificate:forHost: para NSURLRequest. ¿Hay una API no privada para emular esta funcionalidad?Método alternativo para el archivo privado "setAllowsAnyHTTPSCertificate: forHost:" de NSURLRequest

+2

¿Por qué quieres permitir certificados HTTPs no válidos en primer lugar? –

+0

Hola ... su problema está resuelto, pero ¿para eso ha excluido el método anterior en su código fuente? –

Respuesta

1

Una solución realmente estúpido es hacer que su propia categoría método:

@implementation NSURLRequest (IgnoreSSL) 

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

@end 

Esto debe llegar a funcionar cheques API privadas de Apple, pero sigue siendo lo mismo (mediante una API privada, no documentada [1] que es susceptible de romperse en cualquier momento). En realidad, es peor porque permite todo, no solo ese host.

[1]: Se debe hacer pública una API privada que , pero una API privada sin embargo.

+1

Por lo que sé, esto aún no pasará los controles de Apple, ya que parecen usar un análisis bastante simple basado únicamente en selectores, no su uso. –

+0

@Mike: ¿Estás seguro? No estoy "usando" el selector, solo lo estoy redefiniendo. Son los internos de Apple lo que lo llaman. Por supuesto, esto no es del todo seguro, pero no veo cómo no pasaría los controles de Apple. – Michael

+1

De esta forma definitivamente se rechazará tu aplicación. – Franklin

1

Tome un vistazo a este enlace: http://www.abstractec.co.uk/blog/iPhone.php?itemid=70

podría ser una mejor solución para usted que simplemente engañando al cheque API privada.

+0

¿Es posible utilizar un NSURLConnection en lugar de un CFHTTPMessageRef? Preferiría que la descarga sea asincrónica. – Michael

0

No es una solución, sino una sugerencia. ¿Has pensado en usar ASIHttpRequest Framework para esto? Este marco está completo en todos los aspectos. Verifique la documentación, tal vez también pueda ayudarlo.

0

setAllowsAnyHTTPSCertificate parece ser ahora sin soporte en OS X 10.6.6 completo.

¿He dicho 10.6.6? Tal vez debería haber dicho "Snow Vista".

6

En realidad, estoy probando con 10.6.8 y este código todavía funciona: está usando la API privada pero verifica que el selector exista (myurl es el NSURL que intento cargar en una WebView o una NSURLConnection) :

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

    fp = [NSURLRequest methodForSelector:selx]; 

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

Tenga en cuenta que "@selector" no se utilizó de manera que absolutamente todo el trabajo se realiza en tiempo de ejecución. Eso lo hace tan seguro y tan oculto de los controles de Apple como puede ser, especialmente si oculta la cadena.

+0

¡Funciona bien! Gracias – Chris

+1

No es una solución recomendada: (1) no le da a su usuario la opción de aceptar o no. (2) Estás escribiendo en un foro público si Apple se da cuenta de que podrían hacerlo bien. (3) Ver la respuesta de Yonel: http://stackoverflow.com/a/2145367/818352 – George

+0

Solo quería decir que esto funcionó para mí hasta que salió el 5S y el iPad Air - se cuelga aquí (en el elenco) en cualquiera de esos dispositivos. – Luke

Cuestiones relacionadas