我有一个iPhone网络应用程序,它使用缓存清单脱机工作并将webapp添加到我的主屏幕。我想找到一种方法来检测应用程序是否正在退出,这样我就可以做一些内务管理并保存一些数据。
如果我在Safari中作为网页运行,window.onunload会为我执行此操作,但从主屏幕运行时不会发生此事件。
答案 0 :(得分:1)
我使用以下代码测试了网页隐藏事件,发现它可以很好地检测用户是否导航到另一个链接,或者只是在徒步旅行时打开一个新选项卡。
但是,如果您使用的是保存在主屏幕上的网络应用(如您所述),那么此网页隐藏事件对于告知网络应用是否已关闭无效。
根据具体需要,您可以通过将数据保存到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);
}
答案 1 :(得分:0)
我有一个答案。这不是我们所希望的。
从http://www.w3.org/TR/DOM-Level-2-Events/events.html卸载的技术定义是:
DOM时发生unload事件 实现从中删除文档 窗户或框架。此活动有效 对于BODY和FRAMESET元素。
我还得到了Apple的一些知情人士的回复:“不幸的是,当点击主页按钮时,我无法找到触发的事件!我认为最合适的事件可能是页面隐藏当你切换到“标签”视图打开一个新页面时,这个事件实际上会在iOS上的Safari中触发,但是当你点击主屏幕图标时则不会:-(“
答案 2 :(得分:-2)
在iOS3或多任务不支持的设备/应用程序中,您可以在applicationDidTerminate方法中进行内务管理。
在iOS4和多任务支持的设备/应用程序中,您可以在applicationDidEnterBackground方法中进行内务管理。最好实现applicationDidTerminate方法,以防iOS决定从内存中删除您的应用程序,将在您的应用程序中调用applicationDidTerminate。
干杯。