2009-02-10 14 views

Respuesta

12

Para realmente respuesta a su pregunta:

las cookies de Safari móvil no son accesibles desde aplicaciones SDK. Y cada aplicación SDK recibe su propio caché WebKit y tiendas de cookies, por lo que aunque las cookies persistirán en la misma aplicación, no se podrá acceder entre ellas.

+0

Hola Marco, Gracias hombre. Eso es lo suficientemente alto y claro incluso para mí :). Usted dice que a cada aplicación SDK se le asigna su propio caché WebKit, supongo que se puede acceder a ellas usando la clase HSHTTPCookieStorage. ¿O estoy todavía lejos? – TonyNeallon

+0

No estoy seguro, nunca lo intenté. Pruébalo. Instalar UIWebView solo requiere unos minutos de trabajo, cargar una URL para un sitio que le dará una cookie e intentar leer las cookies. Probablemente lo haría con Javascript si la vista web todavía estaba accesible. (stringByEvaluatingJavascriptString :) – Marco

4

Debido a la zona de pruebas en el iPhone, no tiene acceso a las cookies de Safari. Solo puede acceder a las cookies creadas dentro de su aplicación, por ejemplo, mediante UIWebView.

+0

mfazekas hola, Gracias de nuevo por su respuesta. Las cookies se configuran a través de un javascript de una página que carga desde el directorio de documentos de mi aplicación en el control UIWebView de mi aplicación. ¿Esto garantizaría que las cookies se almacenaran en el arenero de mi aplicación? Gracias por su ayuda hombre. – TonyNeallon

3

A pesar de haber hecho la misma pregunta twicebefore, aquí hay un enfoque aún no se ha mencionado ...

Esto puede ser un poco complicado, pero se pueden hacer cosas Greasemonkey-esque con un UIWebView. Algo como esto:

He utilizado esta técnica para mejorar páginas de terceros en una aplicación de iPhone, pero no estoy seguro si leerá cookies del mismo lugar que Safari mobile.

¿Vale la pena intentarlo?

+0

Hola Paul, Gracias por la sugerencia.Inyectar el javascript para leer document.cookies aún no pasa nada asustado. Pero valió la pena intentarlo. Pensé que lo tenía :) – TonyNeallon

0

Es posible que desee comprobar

if ([[NSHTTPCookieStorage sharedHTTPCookieStorage] cookieAcceptPolicy] != NSHTTPCookieAcceptPolicyAlways) { 
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];  
} 

Pero al parecer NSHTTPCookieStorage ni siquiera mantener las cookies de la última solicitud en la aplicación actual en IOS (rdar: // 8190706)

2

Aquí está mi utilidades obtienen/establecer métodos de cookies



+(void)setCookie:(NSString *)key withValue:(NSString *)value { 
    NSArray *keys = [NSArray arrayWithObjects: 
        NSHTTPCookieDomain, 
        NSHTTPCookieExpires, 
        NSHTTPCookieName, 
        NSHTTPCookiePath, 
        NSHTTPCookieValue, nil]; 
    NSArray *objects = [NSArray arrayWithObjects: 
         @"YOURDOMAIN", 
         [NSDate distantFuture], 
         key, 
         @"/", 
         value, nil];  
    NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; 
    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:dict]; 
    NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    [sharedHTTPCookieStorage setCookie:cookie]; 
} 

+(NSString *)getCookie:(NSString *)key { 
    NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    NSArray *cookies = [sharedHTTPCookieStorage cookiesForURL:[NSURL URLWithString:@"YOURDOMAIN"]]; 
    NSEnumerator *enumerator = [cookies objectEnumerator]; 
    NSHTTPCookie *cookie; 
    while (cookie = [enumerator nextObject]) 
    { 
     if ([[cookie name] isEqualToString:key]) 
     { 
      return [cookie value]; 
     } 
    } 
    return nil; 
} 
+0

¿La cookie guardada con este método nunca caduca? –

10

De hecho, hay una manera interesante si tiene acceso a una URL del servidor.

  1. En su aplicación, inicie la url del servidor con safari móvil.
  2. la URL del servidor de destino lee la cookie y redirige a una URL específica aplicación (miaplicacion: // galletas = 123)
  3. La aplicación está encenderse nuevamente y se puede leer que el valor del controlador de URL

Es un poco hacky ya que la aplicación cambiaría de safari móvil y luego volvería de inmediato a la aplicación. Pero, es posible.

+0

Hola, este es un comentario a una respuesta bastante antigua. Apple comenzó a rechazar este cambio a safari y volver a la aplicación hace algunos años. Creo que fue una solución bastante buena para cuando se dio la respuesta. – lnjuanj

6

Tenga en cuenta que en iOS 8, probablemente sea mejor utilizar Safari Password Sharing para resolver algunos de los casos de uso que dan lugar a este problema.

Esto no es directamente posible, pero con la cooperación del sitio web es posible.

Para aclarar, el caso del usuario es que una aplicación Objective C quiere leer el valor de una cookie que ha sido establecida por un sitio web en el safari móvil. (. Es decir, en particular, un UIWebView no estaba involucrado en el establecimiento de la cookie)

Su aplicación debe hacer esto:

  1. Safari Mobile lanzamiento, usando [[UIApplication sharedApplication] openURL: url];
  2. La URL debe ser especial, ej. http://yourwebsite.com/give-ios-app-the-cookie
  3. En su página web, cuando esa url se pone en marcha, una redirección a su aplicación-url-esquema: = (por ejemplo angrybirds.: Cookievalue = hh4523523sapdfa) cookievalue
  4. al delegado de la aplicación recibe - (BOOL) aplicación : (UIApplication *) openURL aplicación: (NSURL *) sourceApplication url: (NSString *) sourceApplication anotación: (id) proceso de anotación de la URL para obtener el valor de la cookie

Tenga en cuenta que no debe hacer esto de forma automática cuando el se inicia la aplicación: el usuario verá la transferencia a Mobile Safari y viceversa, lo que no es una buena experiencia para el usuario y Apple rechazará su aplicación (Apple también considera que es "la carga de los datos personales del usuario a servidor sin su consentimiento previo "). Sería mejor hacerlo en respuesta al usuario, prestando atención a la experiencia del usuario, por ej. espere a que el usuario presione un botón de "inicio de sesión", luego hágalo, y si el usuario no ha iniciado sesión en su sitio web, http://yourwebsite.com/give-ios-app-the-cookie debe mostrarle al usuario la pantalla de inicio de sesión dentro de safari. Si el usuario ha iniciado sesión, puede mostrar brevemente una pantalla de "Iniciar sesión automáticamente ..." durante uno o dos segundos en Safari antes de redireccionar al usuario.

No hay forma de que esto funcione con hotmail/gmail/etc. por supuesto, tiene que ser su propio sitio web.

El crédito va a Unique Identifier for both mobile safari and in app in iOS por sugerir este tipo de enfoque.

+1

La mejor fuente de documentación para "Uso compartido de contraseñas de Safari" es WWDC2014 Session 506: "Su aplicación, su sitio web y Safari" –

11

¡A partir de iOS 9 esto es posible!

Utilice un sfSafariViewController.

Usted tendrá que configurar:

  • Un custom URL scheme en su aplicación para recibir datos de las cookies.
  • El sitio web del que obtiene las cookies deberá implementar una API específica del esquema de URL personalizado de su aplicación, para redireccionar a su aplicación.

Puede clonar este repo que tiene una demostración completamente funcional de esto.

Espero que esto ayude,

Liam

Cuestiones relacionadas