2011年8月26日 星期五

如何自動更新清除使用者的swf檔案

瀏覽器清快取檔案的觸發條件有以下:
1.使用者手動清除
 說明:使用者手動使用瀏覽器的選項做清除動作
 優點:
   1.可以保證ㄧ定清除乾淨!!!
 缺點:
   1.不是每位使用者都懂清快取的指令~Orz
2.網頁宣告不做暫存快取
 說明:在網頁META設定不做快取,每次都會重新讀取檔案
 優點:
   1.可以保證ㄧ定是最新的檔案
 缺點:
   1.每次都重新讀取,如果檔案過大,會造成很大的網路負載=  ="
 code:
  <meta http-equiv="expires" content="0" />
3.關閉瀏覽器
 說明:IE9預設關閉瀏覽器後自動清除快取
 優點:
   1.可以確認有某種程度快取檔案是被清除
 缺點:
   1.如果是舊版的或是不同的瀏覽器這個動作就不見得會發生
  
4.swf檔案連結跟本機的swf檔案的連結不同
 說明:快取的儲存方式是用連結去判斷,所以只要給新的連結,就會重新讀取
 優點:
   1.可以保證ㄧ定是最新的檔案
 缺點:
   1.只能對一個swf檔案有作用,除非每個swf檔案都用新連結去讀取
  
那我用什麼方法?答案是3跟4,因為IE9是沒有4的清快取機制,那我只要處理第4個答案的缺點 解法:
 1.網頁在讀取main.swf的時候,flash url位置設成main.swf?ver=檔案大小或是日期,這樣就會自動更新了
 2.如果讀取main.swf之後,還要再讀取其他的swf檔案要怎麼做? 
   flash有分成本機跟遠端安全沙箱模式,在本機沙箱中loader是不可以設置SecurityDomain.currentDomain做為連接遠端機制,會出現2142安全性違規
   所以我們可以要從目前的沙箱狀態去判斷說現在是本機還是遠端沙箱再來決定要不要在讀取swf的url加上更新連結的動作
  code:
  /*-------------------------------------------------------------
  宣告
  -------------------------------------------------------------*/
  private var appDomain:ApplicationDomain = ApplicationDomain.currentDomain;
 private var context:LoaderContext = new LoaderContext();
 private var loadMode:Boolean = false;//本機沙箱或是網路沙箱 true為本機 false為網路
 private var nowVer:String = '0001';
 private var loader:Loader;
 /*-------------------------------------------------------------
  Main
  -------------------------------------------------------------*/
  private function Main():void{
    setSecuityMode();
    loadSwf('a.swf');
  }
  /*-------------------------------------------------------------
  setSecuityMode
  設定安全沙箱旗標
  -------------------------------------------------------------*/
  private function setSecuityMode():void{
  context.applicationDomain = appDomain;   
  if(Security.sandboxType == Security.LOCAL_TRUSTED)
   loadMode = true;
  else if(Security.sandboxType == Security.REMOTE){
   loadMode = false;
   context.securityDomain = SecurityDomain.currentDomain;
  }
 }
 /*-------------------------------------------------------------
  loadSwf
  讀取swf檔案
  參數:_file:檔案名稱
  -------------------------------------------------------------*/
 private function loadSwf(_file:String):void{
  var url:String;//檔案位置
  if(!loadMode){
   //Url為HTTP才能使用帶參數的方式去讀取
   url = 'http://www.yourdomain.com/' + _file + '?ver=' + nowVer;
  }else
   //本機檔案,使用相對位置讀檔
   url =  _file;
  trace('the url:' + url);
  loader.load(new URLRequest(url), context);
 }
 
 

沒有留言:

張貼留言