El uso de LocalStorage en iPhone con iOS 7 arroja este error. He estado buscando un resolutivo, pero considerando que ni siquiera estoy navegando en privado, nada es relevante.
No entiendo por qué localStorage estaría deshabilitado por defecto en iOS 7, pero parece que sí. También lo he probado en otros sitios web, pero sin suerte. Incluso intenté probarlo usando este sitio web: http://arty.name/localstorage.html , pero no parece que esté guardando nada en absoluto por alguna extraña razón.
¿Alguien ha tenido el mismo problema, solo que han tenido la suerte de solucionarlo? ¿Debo cambiar mi método de almacenamiento?
Traté de depurarlo almacenando unas pocas líneas de información, pero fue en vano. Usé la localStorage.setItem()
función estándar para guardar.
Respuestas:
Esto puede ocurrir cuando Safari está en modo privado de navegación. Durante la navegación privada, el almacenamiento local no está disponible en absoluto.
Una solución es advertir al usuario que la aplicación necesita un modo no privado para funcionar.
ACTUALIZACIÓN: Esto se ha solucionado en Safari 11 , por lo que el comportamiento ahora está alineado con otros navegadores.
fuente
if( typeof Storage != 'undefined' ) { ... }
) antes de intentar cargar y guardar información, pero recibí este error. Resulta queStorage
todavía está definido, incluso cuando es inutilizable. Usando try / catch de ahora en adelante cada vez que uso LocalStorage.Como se menciona en otras respuestas, siempre obtendrá QuotaExceededError en Safari Private Browser Mode en iOS y OS X cuando se llama
localStorage.setItem
(osessionStorage.setItem
).Una solución es hacer una prueba try / catch o Modernizr en cada instancia de uso
setItem
.Sin embargo, si desea una cuña que simplemente detenga globalmente este error, para evitar que el resto de su JavaScript se rompa, puede usar esto:
https://gist.github.com/philfreo/68ea3cd980d72383c951
fuente
Utilizo esta función simple, que devuelve
true
ofalse
, para probar la disponibilidad de almacenamiento local:Ahora puede probar la
localStorage.setItem()
disponibilidad antes de usarlo. Ejemplo:fuente
window.sessionStorage
usa en lugar dewindow.localStorage
para un método llamadoisLocalStorageNameSupported
?HTML local storage provides two objects for storing data on the client: window.localStorage - stores data with no expiration date window.sessionStorage - stores data for one session (data is lost when the browser tab is closed)
sessionStorage
hace más manejable para establecer puntos de interrupción si desea probar su desarrollo. No existe un argumento verdadero para cuál es "mejor" y en realidad es solo una preferencia personal aquí que se equivoca por el lado de la precaución. Lo principal a tener en cuenta es que ambassessionStorage
ylocalStorage
ambas son implementaciones de la API de almacenamiento web HTML5.Se me ocurrió ejecutar el mismo problema en iOS 7 (con algunos dispositivos sin simuladores).
Parece que Safari en iOS 7 tiene una cuota de almacenamiento más baja, que aparentemente se alcanza al tener un registro de historial largo.
Supongo que la mejor práctica será atrapar la excepción.
El proyecto Modernizr tiene un parche fácil, deberías probar algo similar: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
fuente
Aquí hay una solución ampliada basada en la respuesta anterior de DrewT que usa cookies si localStorage no está disponible. Utiliza la biblioteca docCookies de Mozilla :
En su fuente, simplemente use:
fuente
Como ya se explicó en otras respuestas, cuando está en modo de Navegación Privada, Safari siempre lanzará esta excepción cuando intente guardar datos con
localStorage.setItem()
.Para solucionar esto, escribí un localStorage falso que imita localStorage, tanto métodos como eventos.
Almacenamiento local falso: https://gist.github.com/engelfrost/fd707819658f72b42f55
Probablemente esta no sea una buena solución general al problema. Esta fue una buena solución para mi escenario, donde la alternativa sería la reescritura de una aplicación ya existente.
fuente
Actualización (2016-11-01)
Estaba usando AmplifyJS mencionado a continuación para solucionar este problema. Sin embargo, para Safari en la navegación privada, se estaba volviendo a un almacenamiento basado en memoria. En mi caso, no era apropiado porque significa que el almacenamiento se borra al actualizar, incluso si el usuario todavía está en navegación privada.
Además, he notado una cantidad de usuarios que siempre están navegando en modo privado en iOS Safari. Por esa razón, una mejor alternativa para Safari es usar cookies (si están disponibles). Por defecto, las cookies siguen siendo accesibles incluso en la navegación privada. Por supuesto, se borran al salir de la navegación privada, pero no se borran al actualizar.
Encontré la biblioteca local de almacenamiento de reserva . De la documentación:
Cuidado con las gotchas:
TL; DR:
Utilice el almacenamiento local alternativo (API unificada con
.getItem(prop)
y.setItem(prop, val)
):Respuesta original
Para agregar respuestas anteriores, una posible solución sería cambiar el método de almacenamiento. Hay algunas bibliotecas como AmplifyJS y PersistJS que pueden ayudar. Ambas bibliotecas permiten el almacenamiento persistente del lado del cliente a través de varios backends.
Para AmplifyJS
Para PersistentJS
Ofrecen una capa de abstracción para que no tenga que preocuparse por elegir el tipo de almacenamiento. Sin embargo, tenga en cuenta que puede haber algunas limitaciones (como límites de tamaño) dependiendo del tipo de almacenamiento. En este momento, estoy usando AmplifyJS, pero aún tengo que hacer más pruebas en iOS 7 / Safari / etc. para ver si realmente resuelve el problema.
fuente
En abril de 2017, un parche se fusionó con Safari, por lo que se alineó con los otros navegadores. Esto fue lanzado con Safari 11.
https://bugs.webkit.org/show_bug.cgi?id=157010
fuente
Esta pregunta y respuesta me ayudaron a resolver un problema específico al registrar nuevos usuarios en Parse.
Debido a que la función signUp (attrs, options) usa almacenamiento local para persistir la sesión, si un usuario está en modo de navegación privada, arroja el "QuotaExceededError: DOM Exception 22: Se intentó agregar algo al almacenamiento que excedió la cuota". excepción y las funciones de éxito / error nunca se llaman.
En mi caso, debido a que la función de error nunca se llama, inicialmente parecía ser un problema al activar el evento de clic en el envío o la redirección definida en el éxito del registro.
La inclusión de una advertencia para los usuarios resolvió el problema.
Referencia de Parse Javascript SDK https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp
fuente