web-dev-qa-db-ja.com

ローカルWebアプリのデータが消去されないようにするにはどうすればよいですか?

主にモバイルデバイスで、Webアプリをオフラインで利用できるようにしたいと考えています。 Service Workerを使用して、そのためのコードを記述しました。アプリケーションデータはIndexedDbに格納され、アプリケーションコード(html、js、cssなど)はSWキャッシュに格納されます。ここまでは順調ですね。ユーザーがブラウザのキャッシュとデータを削除できることは承知しており、問題ありません。しかし、ブラウザ自体がアプリのデータを消去することについてはどうでしょうか。その包括的な仕様は見つかりませんでした。主な情報は次のとおりです。

1) StorageManager 現在「実験的」としてマークされている機能(2016年以降)。

2)Googleからの短い記事 こちら それについて(同じく2016年から)。

コードサンプルは次のとおりです。

if (navigator.storage && navigator.storage.persist)
  navigator.storage.persist().then(granted => {
    if (granted)
      alert("Storage will not be cleared except by explicit user action");
    else
      alert("Storage may be cleared by the UA under storage pressure.");
  });

グーグルの記事は言う:

ローカルマシンのストレージがタイトに動作している場合(「ストレージ不足」)、ユーザーエージェントは自動的にストレージをクリアして、使用可能なスペースを増やします。もちろん、オフラインアプリの場合、データをサーバーに同期していない可能性があるため、これは残念なことかもしれません。または、ユーザーがオフラインで作業することを期待しているアプリ(音楽プレーヤーなど)かもしれません。したがって、ストレージ仕様では、特定のドメインのストレージに2つの異なるモード、「ベストエフォート」と「パーシステント」を定義しています。もちろん、デフォルトのモードは「ベストエフォート」です。 「ベストエフォート」(別名「永続的」ではない)のドメインのストレージは、ユーザーに割り込んだり質問したりせずに、自動的に消去できます。ただし、「永続的」なデータは自動的に消去されません。 (すべての非永続データを消去した後もシステムがまだストレージの圧力下にある場合、ユーザーは残りの永続ストレージを手動で消去する必要があります。)

...

Chrome 55で始まり、Chromeは、以下のいずれかに該当する場合に永続的なアクセス許可を自動的に付与します。

  • サイトがブックマークされている(ユーザーのブックマークが5個以下である)
  • サイトのエンゲージメントが高い
  • サイトがホーム画面に追加されました
  • このサイトではプッシュ通知が有効になっています

他のすべての場合、許可は自動的に拒否されます。

目標は、ユーザーがお気に入りのWebアプリを信頼して、突然クリアされたことがわからないようにすることです。

これはChrome 55の場合です。情報が最新のものであるとしましょう。一見すると、その目標は妥当に聞こえますが、詳しく見てみると、実装は「大規模」サイト向けです(à la Google)であり、よりタスク指向のニッチアプリケーション用ではありません。

実際、さまざまなAndroidの電話Chrome 80+)でテストする場合、永続性は常に拒否され、ユーザーの操作はありません。したがって、「ベストエフォート」は。

私たちはここで調査を中止し、それを1日と呼ぶこともできました。結局のところ、現在の電話とPCは驚異的な量のストレージを備えており、数百KBしか使用していないので、問題はありません。問題は、私たちがそうではないことです:真新しいフラグシップAndroid Chromeを搭載した電話でテストすると、コードは数秒いじるだけで消去されます(ページを数回閉じて開くだけで十分です) )他のプラットフォームでは異なりますが、Android + Chromeが最も使用されます。

奇妙なことに、SWキャッシュ(<100KB)のコードのみが消去され、より大きなIndexedDbは消去されません。そのため、IndexedDbにもコードを配置しようとしましたが、そのように「永続的」であるように見えますが、それを管理するコードも複雑であるため、多少ハックに感じられます。

私たちはその問題について一人でいますか?そうでない場合、あなたはそれをどのように扱っていますか?

おまけの質問:この件に関する最新のドキュメントはどこかにありますか?

5
Ilya

私が正しく理解している場合、主な問題はa Chrome browser on Androidがブラウザのキャッシュを空にし続けるChromeの条件を満たさないWebサイトに自動的に付与される永続化権限

これまで、私はまだこの状況に陥っていませんが、動作を観察しました。あなたは https://developers.google.com/web/updates/2016/06/persistent-storage から引用しています。 =-明示的に文書化されていることを今まで知りませんでした。

一部のWebサイトが永続的なユーザーデータストレージを適用する方法を3つ示します。

  1. 繰り返し、ユーザーにホーム画面にWebサイトを追加するか、プッシュ通知を有効にするように要求します。この要求はしばしば何らかの理由でfalseになることがわかります-flag、つまり「感謝を示す通知をサブスクライブする」ではなく「データを永続的に保存することを許可されていますか」「アプリをインストールする」は、基本的にフルスクリーンChromeインスタンスがアプリストアの実際のアプリではなく、モバイルデバイス。

  2. 一部のサイトは、Chrome extensionを提供し、そこにコンテンツを保存し、さらに多くのアクセス権を取得することもできます。そのアプローチを示唆しているのではなく、何らかの方法でセキュリティを意識したユーザーに奇妙な感覚を与えています。

  3. さらに別の代替案は、実際には単なるカスタマイズされたブラウザであるネイティブアプリを提供するハイブリッドアプローチです。これが一見奇妙に聞こえる場合は、少し待ってください。このオプションは実際には非常に簡単に利用できます。 in React Native as react-native-webbrowser component 。明らかにプログラミングの労力が必要ですが、かなりの数のニュースサイトがアプローチとして使用しているようです。

オプション1と2はどちらもChromeを使い続けますが、ユーザーの邪魔を避けたいだけなので、明らかに適用されません。

オプション3は型破りですが、検討する価値のあるオプションになる場合があります。プログラマーであるユーザーのみが、本質的に単なるブラウザーであるものをインストールすることにいくらかだまされていることに気づくかもしれません。それにもかかわらず、それは確かにクリーンなソリューションです。AppStoreがアクセス権制御を処理し、ユーザーはデータで何が起こるかを完全に選択できるようにします。

1
B--rian