【问题标题】:html 5 appcache user controlled updatinghtml 5 appcache 用户控制更新
【发布时间】:2011-05-31 22:45:15
【问题描述】:

我正在开发一个 ipad 网络应用程序,该应用程序每月都会收到更改。 但是我不知道如何让用户决定是否更新缓存。当 ipad 注意到清单文件发生更改时,它往往会继续更新。我想防止这种情况发生,以便尚未阅读本月刊的用户可以在他们喜欢的时候进行更新。我已经搜索了这个问题的解决方案,但我找不到任何有用的信息。

我的应用程序的设置方式是我有一个从数据库中获取数据的内容页面,并且所有其他文件(来自添加到内容页面的媒体的应用程序)都是静态的。

我有一个包含每个文件的 cache.manifest,并且版本号会在评论顶部的更新时自动更改。

因此,对内容的更新意味着一个新的清单,这意味着 updateReady 事件被触发。如果有人能给我任何关于如何捕捉它并防止它自动切换到新版本的指示,那就太好了。

谢谢!

【问题讨论】:

    标签: html caching


    【解决方案1】:

    如何停止应用更新?

    一旦应用程序处于离线状态,它就会一直处于缓存状态,直到发生以下情况之一:

    • 用户为您的网站清除了浏览器的数据存储空间。
    • 清单文件已修改。注意:更新清单中列出的文件并不意味着浏览器会重新缓存该资源。清单文件本身必须交替。
    • 应用缓存以编程方式更新。

    http://www.html5rocks.com/tutorials/appcache/beginner/#toc-updating-cache

    简而言之:不要修改清单文件。

    如何为每个用户单独更新清单文件?

    如果用户第一次访问网站,他的浏览器会加载当前清单,所以我们会使用动态 URL 并动态生成清单文件:

    <html manifest="manifest.php?version=2">
    

    浏览器记住 URL manifest.php?version=2 并且每次生成的清单文件都保持不变,因此浏览器不会更新(清单文件未修改)。 脚本文件如下所示:

    <?php
    
        header ( "Content-Type: text/cache-manifest" ) ;
    
        echo "CACHE MANIFEST\n\n" ;
    
        echo "# version " . $_GET [ "version" ] . "\n" ;
    
        echo "index.php\n" ;
        echo "styles.css\n" ;
        echo "scripts.js\n" ;
    
    ?>      
    

    现在,如何强制浏览器从另一个 URL 加载清单,例如 manifest.php?version=5

    我尝试更改manifest属性内容并调用window.applicationCache.update() 但浏览器从旧 URL 请求清单文件。

    另一种可能是:

    • 询问用户是否要更新;
    • 如果是,则保存 cookie ("wish_to_update=1");
    • 在 manifest.php 中读取 cookie 并检查用户是否希望更新;

    在 manifest.php 中:

    if ( $_COOKIE [ "wish_to_update" ] == "1" )
    {
        // generate modified version
        echo "# version another than in your URL" ;
        setcookie ( "wish_to_update", "0" ) ;
     }
     else
     {
        // generate unmodified version
        echo "# version " . $_GET [ "version" ] . "\n" ;
     }
    
    • 修改后的清单文件将强制浏览器重新下载所有资源。

    【讨论】:

    • 缓存工作正常,这不是问题。问题是我不希望它在清单更改时自动更新,而是询问用户他/她是要更新还是继续使用当前版本。
    • 这究竟如何防止设备自动更新?
    • @Thomas 清单文件取决于 version 属性,因此如果 URL 为 manifest.php?version=3,则生成的文件对于该版本将始终相同。您可以询问用户他/她是否想要更新内容,如果是,则更改为 version=4 或其他任何内容。
    • 您会使用ajax 来检查最新版本,将其与缓存的版本进行比较并更改html 标记中的manifest 属性吗?这会启动更新吗?
    • 如果没有,那么我会删除 html 标签,并使用正确的 URL 追加新标签 - 这将强制浏览器再次加载清单文件。
    猜你喜欢
    • 2011-10-12
    • 2013-10-06
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多