AS3将SWF保存到iOS设备,然后将其加载回MovieClip

AS3将SWF保存到iOS设备,然后将其加载回MovieClip,ios,actionscript-3,file-io,flash,Ios,Actionscript 3,File Io,Flash,我有一个使用AS3和AIR的iOS应用程序。我有从服务器下载的外部主权财富基金,并能正常运行——所有这些都非常好 不过,我不希望用户每次启动应用程序时都必须下载这些swf,所以在第一次下载swf后,我希望将其保存到磁盘。这样,我可以在将来需要时从本地副本加载,而不是再次下载。我在网上找到了在AS3中保存文件的示例: var file:File = File.applicationStorageDirectory.resolvePath("Swfs/" + "mySwfName" + ".swf"

我有一个使用AS3和AIR的iOS应用程序。我有从服务器下载的外部主权财富基金,并能正常运行——所有这些都非常好

不过,我不希望用户每次启动应用程序时都必须下载这些swf,所以在第一次下载swf后,我希望将其保存到磁盘。这样,我可以在将来需要时从本地副本加载,而不是再次下载。我在网上找到了在AS3中保存文件的示例:

var file:File = File.applicationStorageDirectory.resolvePath("Swfs/" + "mySwfName" + ".swf");
var wr:File = new File(file.nativePath);
var stream:FileStream = new FileStream();
stream.open(wr, FileMode.WRITE);
stream.writeBytes(SWF_FILE_GOES_HERE, 0, SWF_FILE_DATA_LENGTH_GOES_HERE);
stream.close();
问题出在
writeBytes
行中。我找到的示例用于将图像保存到磁盘,该行的内容如下:

stream.writeBytes(imageData, 0, imageData.length);
但我需要为swf而不是图像执行此操作,并且我不确定如何从swf文件中获取必要的数据。我在网上搜索过保存swf文件,从swf文件中获取数据等等。。。但我什么也没找到。我需要获得swf的数据和数据长度(我假设这是一个字节数?)。以前有没有人解决过这个问题,或者有什么资源可以为我指点方向


更新:根据@LondonDruges\u MediaServices的评论,我算出了
writeBytes
行:

stream.writeBytes(mySwf.loaderInfo.bytes, 0, mySwf.loaderInfo.bytesTotal);
这似乎是可行的,因为它编译和运行时没有错误。但是,当我试图抓取文件并将其放回电影剪辑时,会出现以下错误:

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.
这意味着文件实际上没有正确保存。然而,当我打印文件位置时,它们似乎是正确的!将文件保存到ApplicationStorage目录时:

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf
以及我尝试将其从存储器中加载到电影剪辑中时的文件名:

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf
var videoFileName:String = "Swfs/" + ENVAR.currentVideoSelected + ".swf";
var videoFilePath:File = File.applicationStorageDirectory.resolvePath(videoFileName);   
var inFileStream:FileStream = new FileStream(); 
trace("[Loading] filepath: ", videoFilePath.nativePath);
inFileStream.open(videoFilePath, FileMode.READ); 
var fileContents:String = inFileStream.readUTFBytes(inFileStream.bytesAvailable);   
inFileStream.close(); 

var req:URLRequest = new URLRequest(videoFilePath.nativePath);
var mLoader:Loader = new Loader();
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onVideoLoadComplete);
mLoader.load(req);
这是我用来尝试将其加载回电影剪辑的代码:

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf
var videoFileName:String = "Swfs/" + ENVAR.currentVideoSelected + ".swf";
var videoFilePath:File = File.applicationStorageDirectory.resolvePath(videoFileName);   
var inFileStream:FileStream = new FileStream(); 
trace("[Loading] filepath: ", videoFilePath.nativePath);
inFileStream.open(videoFilePath, FileMode.READ); 
var fileContents:String = inFileStream.readUTFBytes(inFileStream.bytesAvailable);   
inFileStream.close(); 

var req:URLRequest = new URLRequest(videoFilePath.nativePath);
var mLoader:Loader = new Loader();
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onVideoLoadComplete);
mLoader.load(req);
我的
onVideoLoadComplete
函数包含以下行:

var myMC:MovieClip = e.target.content as MovieClip;
addChild(myMC);

但我得到了错误2044,它认为该文件不存在。有人能发现问题吗?谢谢

您可以使用加载的swf文件的
loaderInfo.bytes
参数获取该文件的原始字节。例如,您可以这样做:

var file:File = File.applicationStorageDirectory.resolvePath("Swfs/" + key + ".swf"); 
var wr:File = new File(file.nativePath); 
var stream:FileStream = new FileStream(); 
stream.open(wr, FileMode.WRITE); 
stream.writeBytes(mySwf.loaderInfo.bytes, 0, mySwf.loaderInfo.bytesTotal); 
stream.close(); 
然后将其拉回到电影剪辑中:

var videoFileName:String = "Swfs/" + ENVAR.currentVideoSelected + ".swf";
var videoFilePath:File = File.applicationStorageDirectory.resolvePath(videoFileName); 
var inFileStream:FileStream = new FileStream(); 
inFileStream.open(videoFilePath, FileMode.READ); 
var swfBytes:ByteArray = new ByteArray();
inFileStream.readBytes(swfBytes);
inFileStream.close(); 

var mLoader:Loader = new Loader();
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loaderContext.allowCodeImport = true;
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onVideoLoadComplete);
mLoader.loadBytes(swfBytes, loaderContext);

因此,从理论上讲,我认为您应该能够使用swf的loaderInfo.bytes属性使用stream.writeBytes再次保存它们,但从未尝试过,这就是为什么我不这样做作为答案。如果您打算将此应用提交到应用商店,我认为它将被拒绝,因为它加载并运行外部代码(swf)。如果swf只是像电影播放或资产一样的内容,而没有代码,那应该没问题。@Londonu MediaServices感谢您提供的信息!我试试看。巴里苏萨克利是的,情况就是这样。这只是一部电影:)