我有一个使用 AS3 和 AIR 的 iOS 应用程序。我有从服务器下载的外部 swfs 并正常播放——所有这些都很好。
不过,我不希望用户每次启动应用程序时都必须下载这些 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 的数据和数据长度(我假设这是字节数?)。以前有没有人解决过这个问题,或者有资源可以为我指明方向?
更新:根据@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,它认为该文件不存在。谁能发现问题?谢谢!