首页 > 代码库 > 页游中资源版本更新问题之解决方案

页游中资源版本更新问题之解决方案

因为很多浏览器的缓存非常顽固,比如IE浏览器,所以在页游中经常会出现一个资源无法及时更新的问题。

比如你更新了背包的资源,是一个swf资源,你把它上传到服务器下面。可是因为缓存的原因,页游运行过程中可能还会运行老的背包swf资源,这样就出现了无法及时更新的问题。

业内常见的解决方案是使用版本号:

       1,首先你要新建一个资源xm,里面放的是是各个资源(比如背包swf资源)的版本号,比如1.0。

             <?xml version="1.0" encoding="UTF-8"?>
<info>
   <assets name="背包">
       <version>1.0</version>
   </assets>

   <assets name="res2">
        <version>1.0</version>
    </assets>
</info>

       2 ,在主swf里加载上面这个xml,这样可以获取到最新的资源的版本号。因为你需要保证你加载的该资源xml是最新的(xml的数据是会经常更新的。因为项目上线后,素材资源经常会出现更新,所以版本号也要更新),所以你在加载该xml的时候,需要这么写,private var xmlUrl:String ="assets/version.xml"+"?"+Math.random();红色部分可以保证你加载的xml是最新的,避免缓存问题。

      4,资源加载时,注意:url2="assets/pack.swf"+"?v"+version;(version这个值是从上面的xml里获取的)
            var request:URLRequest = new URLRequest(url2);

     3,当你需要更新资源时候,先修改上面xml里对应资源的版本号(比如v2.0,v3.0),然后修改把最新的资源swf,和该xml一起上传到服务器下,这样就可以解决缓存使你无法及时更新资源的问题了。


     ok,讲到这儿了,我做了个示例,可惜csdn现在无法在这儿上传项目附件。下面是主要代码:

      package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.text.TextField;
    
    public class TestLoader extends Sprite {
        private var str:String="?v";
        private var url2:String = "assets/1.swf";
        private var xmlUrl:String ="assets/version.xml"+"?"+Math.random();
        private var xmlUrl2:String ="assets/version.xml";
        private var urlLoader:URLLoader;
        private var curResVersion:String;//资源版本
        private var userVersion:String;
        private var userXmlUrl:String;
        private var isUseXmlVersion:Boolean=true;//是否使用xml版本控制
        public function TestLoader() {
            
            urlLoader=new URLLoader;
            if(isUseXmlVersion)
            {
                userXmlUrl=xmlUrl;
            }
            else
            {
                userXmlUrl=xmlUrl2;
            }
            
            var xmlUrlRequest:URLRequest=new URLRequest(userXmlUrl);
            urlLoader.load(xmlUrlRequest);
            urlLoader.addEventListener(Event.COMPLETE,xmlLoader);
        }
        
        private function xmlLoader(event:Event):void
        {
            var myxml:XML=new XML(urlLoader.data);
            curResVersion=myxml.child("assets")[0].version;//显示我们的版本值
            
            var loader:Loader = new Loader();
            configureListeners(loader.contentLoaderInfo);
            
            url2=url2+str+curResVersion;

            var request:URLRequest = new URLRequest(url2);
            loader.load(request);
            
            addChild(loader);
            
            var text:TextField=new TextField;
            text.width=300;
            var txt:String="";
            if(userXmlUrl==xmlUrl)
            {
                txt="使用了xml版本控制";
            }
            else
            {
                txt="没有使用xml版本控制";
            }
            text.text=txt+",资源版本:"+url2;
            this.addChild(text);
        }
        
        private function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
        }
        
        private function completeHandler(event:Event):void {
            trace("completeHandler: " + event);
        }
    }
}



页游中资源版本更新问题之解决方案