キャッシュマニフェストを使用してオフラインで動作し、Webアプリをホーム画面に追加するiPhoneWebアプリがあります。私が見つけたいのは、アプリが終了していることを検出する方法です。これにより、ハウスキーピングを実行してデータを保存できます。
SafariでWebページとして実行している場合、window.onunloadがこれを実行しますが、ホーム画面から実行している場合、このイベントは発生しません。
キャッシュマニフェストを使用してオフラインで動作し、Webアプリをホーム画面に追加するiPhoneWebアプリがあります。私が見つけたいのは、アプリが終了していることを検出する方法です。これにより、ハウスキーピングを実行してデータを保存できます。
SafariでWebページとして実行している場合、window.onunloadがこれを実行しますが、ホーム画面から実行している場合、このイベントは発生しません。
以下のコードを使用して pagehide イベントをテストしたところ、サファリにいるときにユーザーが別のリンクに移動したのか、単に新しいタブを開いたのかを検出するのにうまく機能することがわかりました。
ただし、(説明したように) ホームスクリーンに保存された Web アプリを使用している場合、pagehide イベントは、Web アプリが閉じられたかどうかを判断するのに役に立ちません。
特に必要なものに応じて、データを localStorage に保存し、アプリを再度開いたときに localStorage を確認することで、この制限を回避できます。その後、アプリを完全に再起動する前に必要な追加作業を実行できます。
function myLoadHandler(evt)
{
if (evt.persisted) {
alert('user returns to page from another tab');
return;
}
alert('loading new page');
}
function myUnloadHandler(evt)
{
if (evt.persisted) {
alert('user goes to new tab');
return;
}
alert('user truly leaves the page');
}
if ("onpagehide" in window) {
window.addEventListener("pageshow", myLoadHandler, false);
window.addEventListener("pagehide", myUnloadHandler, false);
} else {
window.addEventListener("load", myLoadHandler, false);
window.addEventListener("unload", myUnloadHandler, false);
}
答えがあります。それは私たちが望んでいたものではありません。
http://www.w3.org/TR/DOM-Level-2-Events/events.htmlからのアンロードの技術的な定義は次のとおりです。
unload イベントは、DOM 実装がウィンドウまたはフレームからドキュメントを削除するときに発生します。このイベントは、BODY および FRAMESET 要素に対して有効です。
また、Apple の一部の有識者から、次のような返信がありました。 「タブ」ビューに切り替えて新しいページを開くと、iOS の Safari で実際にイベントが発生しますが、ホーム画面のアイコンをクリックすると発生しません :-("
iOS3 またはマルチタスク非対応の端末・アプリでは、applicationDidTerminate メソッドでハウスキーピングを行うことができます。
iOS4 およびマルチタスク対応のデバイス/アプリでは、applicationDidEnterBackground メソッドでハウスキーピングを行うことができます。iOS がアプリをメモリから削除することを決定した場合に備えて、applicationDidTerminate メソッドも実装することをお勧めします。applicationDidTerminate はアプリで呼び出されます。
乾杯。