アップデート(2016-11-01)
この問題を回避するには、下記のAmplifyJSを使用していました。ただし、プライベートブラウジングのSafariでは、メモリベースのストレージにフォールバックしていました。私の場合、ユーザーがまだプライベートブラウジングを行っていても、更新時にストレージがクリアされることを意味するため、適切ではありませんでした。
また、iOS Safariで常にプライベートモードでブラウジングしているユーザーが多いことに気づきました。そのため、Safariのより良いフォールバックは、Cookieを使用することです(可能な場合)。デフォルトでは、プライベートブラウジングでもCookieにアクセスできます。もちろん、プライベートブラウジングを終了するとクリアされますが、更新時にクリアされません。
local-storage-fallbackライブラリを見つけました。ドキュメントから:
目的
「プライベートブラウジング」などのブラウザ設定では、新しいブラウザでも、有効なwindow.localStorageに依存することが問題になっています。存在する場合でも、setItemまたはgetItemを使用しようとすると例外がスローされます。このモジュールは、適切なチェックを実行して、使用可能なブラウザーストレージメカニズムを確認し、それを公開します。これはlocalStorageと同じAPIを使用するため、ほとんどの場合、ドロップイン置換として機能するはずです。
落とし穴に注意してください:
- CookieStorageにはストレージ制限があります。ここで注意してください。
- MemoryStorageは、ページのロード間で保持されません。これは多かれ少なかれ、ページのクラッシュを防ぐための一時的なギャップですが、ページ全体をロードしないWebサイトには十分な場合があります。
TL; DR:
local-storage-fallbackを使用します(.getItem(prop)
およびで統一されたAPI .setItem(prop, val)
):
ブラウザに適切なストレージアダプタを確認して使用します(localStorage、sessionStorage、Cookie、メモリ)。
元の答え
以前の回答に加えて、1つの考えられる回避策は、保存方法を変更することです。AmplifyJSやPersistJSなどのライブラリがいくつかありますます。どちらのライブラリも、いくつかのバックエンドを介して永続的なクライアント側ストレージを許可します。
AmplifyJSの場合
ローカルストレージ
- IE 8以降
- Firefox 3.5以降
- Safari 4以降
- クロム
- Opera 10.5以降
- iPhone 2+
- Android 2+
sessionStorage
- IE 8以降
- Firefox 2以降
- Safari 4以降
- クロム
- Opera 10.5以降
- iPhone 2+
- Android 2+
globalStorage
userData
- IE 5〜7
- userDataは新しいバージョンのIEにも存在しますが、IE 9の実装の癖により、localStorageがサポートされている場合はuserDataを登録しません。
記憶
- インメモリストアは、他のどのストレージタイプも使用できない場合のフォールバックとして提供されます。
PersistentJSの場合
- flash:Flash 8永続ストレージ。
- gears:Google Gearsベースの永続的ストレージ。
- localstorage:HTML5ドラフトストレージ。
- globalstorage:HTML5ドラフトストレージ(古い仕様)。
- つまり、Internet Explorerのユーザーデータの動作です。
- cookie:Cookieベースの永続的ストレージ。
これらは抽象化レイヤーを提供するので、ストレージタイプの選択について心配する必要はありません。ただし、ストレージタイプによっては、サイズ制限などの制限がある場合があることに注意してください。現在、AmplifyJSを使用していますが、iOS 7 / Safariなどでさらにテストを行う必要があります。それが実際に問題を解決するかどうかを確認します。