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

时间:2012-08-31 16:50:08

标签: ios actionscript-3 file-io flash

我有一个使用AS3和AIR的iOS应用。我从服务器下载外部swfs并正常播放 - 所有这一切都很好。

我不希望用户每次启动应用程序时都必须下载这些swfs,所以在第一次下载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的数据和数据长度(我假设这是一个字节数?)。有没有人解决过这个问题,或者有资源可以指向我的方向?


更新:基于@LondonDrugs_MediaServices的评论,我发现了writeBytes行:

stream.writeBytes(mySwf.loaderInfo.bytes, 0, mySwf.loaderInfo.bytesTotal);

这似乎有效,因为它编译和运行没有错误。但是,当我尝试抓取文件并将其放回影片剪辑时,我收到此错误:

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.

这意味着该文件实际上并未正确保存。但是,当我打印文件位置时,它们似乎是正确的!当我将文件保存到applicationStorageDirectory时:

/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);

我的onVideoLoadComplete函数包含以下行:

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

但是我收到错误2044并且它认为该文件不存在。谁能发现问题?谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用loaderInfo.bytes参数获取已加载的swf文件的原始字节。所以对于你的例子你可以这样做:

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(); 

然后将其拉回到MovieClip中:

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);