Atualização (01/11/2016)
Eu estava usando o AmplifyJS mencionado abaixo para solucionar esse problema. No entanto, para o Safari na navegação privada, ele voltava a um armazenamento baseado em memória. No meu caso, não era apropriado porque significa que o armazenamento é limpo na atualização, mesmo se o usuário ainda estiver na navegação privada.
Além disso, notei vários usuários que estão sempre navegando no modo Privado no iOS Safari. Por esse motivo, uma alternativa melhor para o Safari é usar cookies (se disponível). Por padrão, os cookies ainda estão acessíveis, mesmo na navegação privada. Obviamente, eles são limpos ao sair da navegação privada, mas não são limpos na atualização.
Encontrei a biblioteca local-storage-fallback . A partir da documentação:
Objetivo
Com configurações do navegador como "Navegação privada", tornou-se um problema depender de uma janela de trabalho.localStorage, mesmo em navegadores mais recentes. Mesmo que exista, ele lançará exceções ao tentar usar setItem ou getItem. Este módulo executará verificações apropriadas para ver qual mecanismo de armazenamento do navegador pode estar disponível e, em seguida, expô-lo. Ele usa a mesma API que localStorage, portanto, na maioria dos casos, ele funciona como um substituto de entrada.
Cuidado com as dicas:
- O CookieStorage possui limites de armazenamento. Tenha cuidado aqui.
- O MemoryStorage não persistirá entre os carregamentos da página. Isso é mais ou menos um intervalo para evitar falhas de página, mas pode ser suficiente para sites que não carregam páginas inteiras.
TL; DR:
Use local-storage-fallback (API unificada com .getItem(prop)
e .setItem(prop, val)
):
Verifique e use o adaptador de armazenamento apropriado para o navegador (armazenamento local, armazenamento de sessão, cookies, memória)
Resposta original
Para adicionar respostas anteriores, uma solução possível seria alterar o método de armazenamento. Existem algumas bibliotecas como AmplifyJS e PersistJS que podem ajudar. Ambas as bibliotecas permitem armazenamento persistente do lado do cliente através de vários back-ends.
Para AmplifyJS
localStorage
- IE 8+
- Firefox 3.5 ou superior
- Safari 4+
- cromada
- Opera 10.5+
- iPhone 2+
- Android 2 ou superior
sessionStorage
- IE 8+
- Firefox 2+
- Safari 4+
- cromada
- Opera 10.5+
- iPhone 2+
- Android 2 ou superior
globalStorage
dados do usuário
- IE 5 - 7
- O userData também existe nas versões mais recentes do IE, mas devido a peculiaridades na implementação do IE 9, não registramos userData se o localStorage for suportado.
memória
- Um armazenamento na memória é fornecido como um substituto se nenhum dos outros tipos de armazenamento estiver disponível.
For PersistentJS
- flash: armazenamento persistente do Flash 8.
- engrenagens: armazenamento persistente baseado no Google Gears.
- localstorage: armazenamento de rascunho em HTML5.
- globalstorage: armazenamento de rascunho em HTML5 (especificação antiga).
- ou seja: comportamentos de dados do usuário do Internet Explorer.
- cookie: armazenamento persistente baseado em cookie.
Eles oferecem uma camada de abstração para que você não precise se preocupar em escolher o tipo de armazenamento. Lembre-se de que pode haver algumas limitações (como limites de tamanho), dependendo do tipo de armazenamento. No momento, estou usando o AmplifyJS, mas ainda preciso fazer mais testes no iOS 7 / Safari / etc. para ver se ele realmente resolve o problema.