Un’applicazione iPhone xcode può leggere i cookie precedentemente memorizzati da Safari Mobile?

Un’applicazione iPhone può leggere i cookie precedentemente memorizzati da Safari Mobile?

Per rispondere effettivamente alla tua domanda:

No.

I cookie di Mobile Safari non sono accessibili dalle app SDK. Ogni app dell’SDK è dotata della propria cache WebKit e di depositi di cookie, quindi, mentre i cookie rimarranno all’interno della stessa app, non sono accessibili tra le app.

A partire da iOS 9 questo è ansible!

Usa un sfSafariViewController .

Avrai bisogno di impostare:

  • Uno schema URL personalizzato nella tua app per ricevere i dati dei cookie.
  • Il sito Web da cui ricevi i cookie dovrà implementare un’API specifica dello schema URL personalizzato della tua app per redirect la tua app.

È ansible clonare questo repository che ha una demo pienamente funzionante di questo.

Spero che questo ti aiuti,

Liam

C’è in realtà un modo interessante se si ha accesso a un URL del server.

  1. Nella tua app avvia l’url del server con mobile safari.
  2. L’URL del server di destinazione legge il cookie e reindirizza a un URL specifico dell’app (myapp: // cookie = 123)
  3. L’app viene quindi ripristinata e puoi leggere quel valore dal gestore dell’URL

È un po ‘hacky in quanto l’app cambierà Safari mobile e quindi tornerà immediatamente all’app. Ma è ansible.

Nota che su iOS 8, probabilmente stai meglio usando Safari Password Sharing per risolvere alcuni dei casi d’uso che danno origine a questo problema.

Questo non è direttamente ansible, ma con la collaborazione del sito web è ansible.

Per chiarire, il caso dell’utente è che un’applicazione Objective C vuole leggere il valore di un cookie che è stato impostato da un sito Web in Safari mobile. (in particolare, UIWebView non è stato coinvolto nell’impostazione del cookie)

La tua app dovrebbe fare questo:

  1. Avvia Safari mobile, utilizzando [[UIApplication sharedApplication] openURL: url];
  2. L’URL dovrebbe essere speciale, ad es. http://yourwebsite.com/give-ios-app-the-cookie
  3. Sul tuo sito web, quando viene lanciato l’url, invia un reindirizzamento al tuo schema-app-url: cookievalue = (ad esempio angrybirds: cookievalue = hh4523523sapdfa)
  4. quando l’app delegata riceve l’applicazione (BOOL): (applicazione UIApplication *) openURL: (NSURL *) url sourceApplication: (NSString *) sourceApplication annotation: (id) annotation process l’url per ottenere il valore del cookie

Nota che non dovresti farlo automaticamente all’avvio dell’applicazione – l’utente vedrà il trasferimento a Mobile Safari e ritorno, che non è una buona esperienza utente e Apple rifiuterà la tua app (Apple considera anche questo come “caricamento dei dati personali dell’utente al server senza il loro previo consenso “). Sarebbe meglio farlo in risposta all’utente, prestando attenzione all’esperienza dell’utente – es. attendi che l’utente prenda un pulsante “login”, poi fallo e se l’utente non è collegato al tuo sito web, http://yourwebsite.com/give-ios-app-the-cookie dovrebbe mostrare all’utente il login schermo all’interno di safari. Se l’utente ha effettuato l’accesso, è ansible visualizzare brevemente una schermata “Accedi automaticamente in …” per un secondo o due in Safari prima di redirect l’utente.

Non c’è modo di farlo funzionare con hotmail / gmail / etc ovviamente – deve essere il tuo sito web.

Il credito va all’identificatore univoco sia per Safari mobile che in app in iOS per suggerire questo tipo di approccio.

A causa della sandboxing su iPhone, non hai accesso ai cookie di Safari. È ansible accedere solo ai cookie creati all’interno della propria applicazione, ad esempio da un UIWebView.

Anche se hai già fatto due volte la stessa domanda, ecco un approccio non ancora menzionato …

Questo può essere un po ‘contorto, ma puoi fare cose Greasemonkey con UIWebView . Qualcosa come questo:

  • Carica la tua pagina di destinazione
  • crea alcuni javascript che leggeranno il documento.cookie e restituiranno i dati di cui hai bisogno
  • Nel delegato webViewDidFinishLoad , inserisci questo javascript in UIWebView con il messaggio stringByEvaluatingJavaScriptFromString

Ho usato questa tecnica per migliorare le pagine di terze parti in un’app per iPhone, ma non sono sicuro che leggerà i cookie dallo stesso posto di Safari mobile.

Vale la pena sparare comunque?

Ecco i miei metodi get get / set per i cookie.

+(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; } 

Potresti voler controllare

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

Ma apparentemente NSHTTPCookieStorage non tiene nemmeno i cookie dall’ultima richiesta nell’applicazione corrente su iOS (rdar: // 8190706)