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:
Propósito
Con configuraciones del navegador como "Navegación privada", se ha convertido en un problema confiar en una ventana de trabajo. LocalStorage, incluso en los navegadores más nuevos. Aunque pueda existir, arrojará excepciones cuando intente usar setItem o getItem. Este módulo ejecutará las verificaciones adecuadas para ver qué mecanismo de almacenamiento del navegador podría estar disponible y luego lo expondrá. Utiliza la misma API que localStorage, por lo que debería funcionar como un reemplazo directo en la mayoría de los casos.
Cuidado con las gotchas:
- CookieStorage tiene límites de almacenamiento. Ten cuidado aquí.
- MemoryStorage no persistirá entre cargas de página. Esto es más o menos un espacio intermedio para evitar bloqueos de página, pero puede ser suficiente para sitios web que no realizan cargas de página completa.
TL; DR:
Utilice el almacenamiento local alternativo (API unificada con .getItem(prop)
y .setItem(prop, val)
):
Verifique y use el adaptador de almacenamiento apropiado para el navegador (localStorage, sessionStorage, cookies, memory)
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
almacenamiento local
- IE 8+
- Firefox 3.5+
- Safari 4+
- Cromo
- Opera 10.5+
- iPhone 2+
- Android 2+
sessionStorage
- IE 8+
- Firefox 2+
- Safari 4+
- Cromo
- Opera 10.5+
- iPhone 2+
- Android 2+
globalStorage
datos del usuario
- IE 5 - 7
- userData también existe en versiones más nuevas de IE, pero debido a las peculiaridades en la implementación de IE 9, no registramos userData si se admite localStorage.
memoria
- Se proporciona un almacén en memoria como respaldo si ninguno de los otros tipos de almacenamiento está disponible.
Para PersistentJS
- flash: almacenamiento persistente de Flash 8.
- engranajes: almacenamiento persistente basado en Google Gears.
- localstorage: almacenamiento de borradores HTML5.
- almacenamiento global: almacenamiento de borradores HTML5 (especificación anterior).
- es decir: comportamientos de datos de usuario de Internet Explorer.
- cookie: almacenamiento persistente basado en cookies.
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.