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を受け取り、ファイルが存在するとは思われません。誰かが問題を見つけることができますか?ありがとう!