2012-03-26 26 views
5

No estoy hablando de un UIWebView, quiero abrir la aplicación de safari móvil usando un NSURLRequest.iOS: ¿Es posible abrir NSURLRequest directamente en Safari?

¿Por qué? En mi aplicación, el usuario ya ha iniciado sesión en nuestro servidor web. Quiero darle al usuario la opción de iniciar la página web sin tener que volver a ingresar sus credenciales. Sin embargo, no puedo usar un GET porque eso pondría sus credenciales en la URL.

Entonces, ¿puedo abrir la aplicación Safari (no un UIWebView) desde mi aplicación con un NSURLRequest o un POST de alguna otra forma?

+2

¿Qué tipo de gestión de sesión está utilizando? Y, para el caso, ¿por qué es costoso hacer que un usuario vuelva a autenticarse a través de límites de credenciales? – MrGomez

+0

Nunca dije que fuera costoso, pero la razón principal es porque eso es lo que quiere nuestro cliente. En cuanto a la gestión de sesiones, el servicio web MVC 3 .NET, y yo creemos que es solo una cookie (que no nos gustaría enviar a través de la url por los mismos motivos que la contraseña). – mtmurdock

+0

Ya veo. En última instancia, debe enviar alguna forma de credencial a través del cable para mantener esto seguro. Si proporciona HTTPS y permite que Safari valide certs correctamente, le recomiendo cierta noción de identificador de sesión o cupón de autenticación enviado por su cliente a través del cable. ¿No sería esto suficiente? – MrGomez

Respuesta

10

Voy a poner mi cuello en la línea y decir no, no hay forma de pasar un NSURLRequest directamente a Safari. El medio de comunicación (principal) entre aplicaciones en iOS es acceder a las URL; no hay un mecanismo general para pasar objetos de una aplicación a otra.

Creo que lo mejor que podrás hacer es buscar un one-time key desde tu servidor web en la aplicación, y luego ingresar a Safari con eso en la URL. Y, si puede hacerlo, hágalo a través de HTTPS para que la ruta de URL y los componentes de consulta solo sean visibles una vez que la negociación de TLS haya tenido éxito. Esto debería evitar que otra persona vea las credenciales relevantes y evitar que sean útiles, incluso si se obtienen por otros medios (como que alguien junto a usted copie la URL de su pantalla).

+0

Esa es una solución interesante. No estoy seguro si puedo garantizar una conexión https, pero si puedo, eso puede funcionar. – mtmurdock

+0

Soy un poco neutral en esta respuesta. Quiero subirlo, pero deja mucho del detalle interesante, vis [cómo generar una fuerte clave única] (https://en.wikipedia.org/wiki/One-time_pad) y los detalles técnicos de Negociación HTTPS que garantiza que las credenciales en forma de ruta no se filtren al mundo. De lo contrario, estoy de acuerdo. :) – MrGomez

+0

@MrGomez deja los detalles porque mi conocimiento del detalle es bastante impreciso. He marcado la respuesta como wiki de la comunidad, así que espero que alguien agradable pueda llenar esos bits. – Tommy

0

Sería más fácil usar un NSURL, o simplemente un NSString, o simplemente un char * para ese asunto. No estoy seguro de si eso funciona en el iPhone, debería ser, ya que el iPhone corre paralelo con Darwin al igual que OSX, pero hay algunas restricciones para eso en el iPhone. Sin embargo, esto definitivamente funciona en un mac.

NSString *url = @"http://www.apple.com"; 
    NSURL *myURL = [NSURL URLWithString:url]; 
    system([ [NSString 
       stringWithFormat:@"Open -a Safari %@", 
       [NSString stringWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:NULL] ] 
      cStringUsingEncoding:NSUTF8StringEncoding]); 

Además, podría sugerir que esa es una mala idea (si se puede evitar). Como usuario de iPhone, estoy seguro de que no estoy solo al encontrarlo muy irritante cuando los desarrolladores me sacan de la aplicación en la que me encuentro actualmente.

+0

Al volver a leer su pregunta, creo haberla malentendido. Perdón por la respuesta inútil. – anthropomorphic

+1

En un iPhone usaría '[[UIApplication sharedApplication] openURL: myURL]' en lugar de hacer una llamada al sistema para abrir. Obtendrá Safari según las reglas de Apple sobre terceros que duplican la funcionalidad incorporada, por lo que es básicamente lo mismo que '[[NSWorkspace sharedWorkspace] openURL: myURL]' en OS X, excepto que puede estar seguro de que obtendrá Safari, como el cartel de origen estipulado. – Tommy

+0

Es bueno saberlo, gracias. Soy nuevo en este sitio, me pregunto si debería eliminar esta publicación o dejarla como está. – anthropomorphic

Cuestiones relacionadas