2015-07-10 31 views
15

Abbiamo un'app Web che viene eseguita su Facebook (ad esempio, una versione in un iFrame in un dominio diverso). Se un utente di Safari ha impostato i cookie e i dati del sito Web predefiniti, "Consenti ai siti Web visitati", i dati archiviati tramite localStorage.setItem agiscono come sessionStorage, ovvero non è disponibile oltre la sessione corrente dell'utente (ovvero dopo la chiusura dell'utente la scheda). Se modifichiamo l'impostazione su "Consenti sempre", funziona come in Chrome, IE, ecc.localStorage Safari non persistente tra le sessioni

Come prova, abbiamo provato a navigare direttamente nel dominio della nostra app (https://ourappname.appspot.com) e funziona correttamente Là. E poi dovrebbe essere davvero un sito visitato, ma quando si torna al gioco su Facebook, il problema esiste ancora.

Si noti che la chiamata setItem ha esito positivo, è solo che getItem non restituisce nulla in una sessione successiva. (Quindi non è come quando l'utente è la navigazione privata e la chiamata setItem fallisce con un errore superato.)

Cosa dobbiamo fare per supportare Safari in modo che la nostra app, in esecuzione su Facebook, possa utilizzare localStorage come inteso dove i dati sopravviveranno tra una sessione e l'altra?

+0

Strano, l'ho appena testato in Safari 8.0.7 (10600.7.12) con "Permetti dai siti web che visito". Ho impostato una chiave localStorage e poi chiuso il browser (con ⌘ + Q) e quando ho riaperto il browser e utilizzato localStorage.getItem era lì. – daviddoran

+0

@daviddoran grazie. Stavi testando un sito in esecuzione su un iFrame che era un dominio diverso rispetto al sito di livello superiore? Modificherò la mia domanda per renderlo più chiaro. – leontx

risposta

3

Sto ancora aspettando una risposta da Apple, ma è sicuro di dire che siamo bloccati con questo comportamento. Quindi la risposta di Anubhav è accurata, ma abbiamo ancora bisogno di una soluzione.

Quindi, come soluzione, abbiamo creato nuovi endpoint sul nostro server per mantenere/ripristinare lo stato del gioco. Usiamo questo solo per Safari, per tutti gli altri browser continuiamo a persistere il nostro stato di gioco in localStorage.

C'è una leggera penalizzazione delle prestazioni per l'utente. E un leggero costo del server. Non è una soluzione sexy, ma ora la nostra app canvas su Facebook supporta Safari.

+0

Hai mai sentito parlare di questo? Ho incontrato anche questo problema. Il mio scenario è molto simile (iFrame, ecc.). –

+2

@WesleyWorkman Nessuna nuova informazione da quando ho postato questa risposta e i miei commenti. Questa è stata la nostra soluzione, ed è stata in produzione per alcuni mesi e funziona bene. – leontx

7

È un errore in Safari o una funzionalità di sicurezza.

Stai visitando FaceBook e non il tuo sito web. La tua app è in iframe che viola il modello di sicurezza se ti consente di leggere qualsiasi dato dal browser. Pensa se un sito concorrente legge i dati che ha/non ha impostato. Ciò costituirebbe una perdita di informazioni.

Safari sta facendo bene il suo lavoro a tale riguardo.

Idealmente, nella modalità "Consenti dai siti Web che visito", nessun browser deve consentire agli iframe di impostare i dati su localStorage; anche se ogni dominio ha le proprie sandbox di archiviazione.

Ciò che mi preoccupa è perché ti consentono persino di scrivere su localStorage da iframe (nella modalità 'Permetti solo i siti che visito')? Questo potrebbe essere in realtà un bug: un attacco di spoofing di informazioni che consente bug.

Penso che sia perché le eccezioni di sicurezza sono state eliminate da localStorage in caso di origine non della stessa parte della richiesta. In questo modo Safari potrebbe effettivamente non generare un errore, ma lasciarlo fallire in modo silenzioso (in alcuni casi). Questo è probabilmente il motivo per cui la tua chiamata setItem sta avendo successo.

A questo punto, con le informazioni fornite, sospetto, signore, sei sfortunato a causa dei programmatori Safari che seguono standard alla lettera.

+0

grazie per la risposta riflessiva. Sembra che se un utente ha navigato direttamente sul nostro sito, il nostro sito sia abilitato a leggere/scrivere localStorage. Anche questa parte sembra che potrebbe essere un bug? E la mia domanda principale su cosa dobbiamo fare ... fammi sapere se sai di una soluzione alternativa. Penserei che la maggior parte delle app per canvas di Facebook debbano aver trovato qualche soluzione a questo problema? – leontx