尝试检查并替换我的 AIR 应用程序中使用的 xml 文件

Trying to check & replace the xml file used in my AIR app

我有一个正在向用户显示信息的应用程序。这些信息位于 xml 文件中,直接嵌入到应用程序中。 每年,我都必须更新 xml 文件中的信息,因此,我必须通过 Google Play Store 和 Apple Store 提交新的应用程序更新。

我想到了一个方法,或许可以避免更新所有应用程序。

我在想应用程序在启动时是否正在检查 xml 文件的文件大小以及我在服务器上拥有的 xml 文件的文件大小。 如果大小相同,则文件不会是 download/replace。 如果大小不同,文件将被下载并替换当前的 xml 文件。

问题:

我试过了,但没用:

function checking_Files():void
{
    var size_of_horaires_local;
    var size_of_horaires_online;

    var url_local:URLRequest = new URLRequest("horaires3.xml");


    var url_online:URLRequest = new URLRequest("http://****.vps.ovh.ca/horaires3.xml");
;
// Define the URLLoader.
    var loader_local:URLLoader = new URLLoader();
    var loader_online:URLLoader = new URLLoader();



loader_local.load(url_local);
loader_online.load(url_online);
    


// Listen for when the file has finished loadingloader_local_Complete
loader_local.addEventListener(Event.COMPLETE, loader_local_Complete);
loader_online.addEventListener(Event.COMPLETE, loader_online_Complete);
    

function loader_local_Complete(e:Event):void
{
    // The output of the text file is available via the data property
    // of URLLoader.
     trace("size: " + (URLLoader(e.target).bytesTotal));
    size_of_horaires_local = URLLoader(e.target).bytesTotal; 
    
}



function loader_online_Complete(e:Event):void{
    // The output of the text file is available via the data property
    // of URLLoader.
     trace("size: " + (URLLoader(e.target).bytesTotal));
    size_of_horaires_online = URLLoader(e.target).bytesTotal;
    check_if_size_different();
    
}

function check_if_size_different():void{
    trace("checking if size is different");
    if(size_of_horaires_local == size_of_horaires_online){
        trace("do nothing");
        log_txt.text="Do nothing, same size. Copy File to specific path";   
        dontWait = true;
    //do nothing
    }else{
        log_txt.text="download the new xml file";
        download_the_new_xml();
        wait = true;
        log_txt.text="Récupération de données en cours...";
    }
}



function download_the_new_xml():void{
var urlString:String = "http://****.vps.ovh.ca/horaires3.xml";
var urlReq:URLRequest = new URLRequest(urlString);
var urlStream:URLStream = new URLStream();
var fileData:ByteArray = new ByteArray();
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq);

 

function loaded(event:Event):void {
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
writeFile();
}

 

function writeFile():void {

fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length);
fileStream.close();
    wait = false;
    dontWait = true;
    introFinish(null);
    //log_txt.text="The new XML file is written here : "+file.url;
    trace("The new XML file is written here : "+file.url);

}
}

新xml文件的“路径”似乎有误。我找不到编写和替换应用程序中嵌入的旧 xml 的方法。

有什么想法可行吗?

我认为您无法覆盖捆绑到您的应用中的文件。

一个可能的解决方案是将 XML 写入一个新的本地 XML 文件并将其保存在 documentsDirectory 或 appStorageDirectory 中并包含一个版本号作为节点。

public static var _xmlFile:File = File.documentsDirectory.resolvePath("yourapp.xml");

private static const _initialXML:String = "<?xml version='1.0' encoding='UTF-8'?><contents><version>100</version></contents>";

//only write to local on first launch                 
if(!_xmlFile.exists){
_writeFileStream.open(_xmlFile, FileMode.WRITE);
_writeFileStream.writeUTFBytes(_initialXML);        
_writeFileStream.close();
} 

然后,每当应用程序启动时,它都会加载本地 xml 以及来自服务器的新 xml,比较版本号并在必要时用服务器版本覆盖本地版本。

应用随后使用本地版本进行配置。