2012-08-31 4 views
1

AS3 및 AIR을 사용하는 iOS 앱이 있습니다. 외부 swfs 서버에서 다운로드하고 제대로 재생 - 모든이 완벽하게 작동합니다.AS3 iOS 기기에 SWF 저장 후 MovieClip에 다시로드

사용자가 앱을 실행할 때마다이 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의 데이터 및 데이터 길이를 가져와야합니다 (바이트 수가 있다고 가정합니다). 누구든지 전에이 문제를 해결 했습니까?


UPDATE :

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

이 그것을 컴파일하고 오류없이 실행만큼에 작동하는 것 같다 : @LondonDrugs_MediaServices의 의견을 바탕으로, 나는 writeBytes 라인을 알아 냈어.

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

파일이 실제로 제대로 저장되지 것을 의미한다 : 나는 파일을 잡고 무비 클립에 다시 넣어하려고 할 때, 나는이 오류가 발생합니다. 그러나 파일 위치를 인쇄 할 때 올바른 것으로 보입니다! 나는 시도하고 저장 벗어나 무비 클립에로드 할 때

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf 

그리고 파일 이름 : 나는 applicationStorageDirectory에 파일을 저장하면

/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 오류가 발생하며 파일이 존재하지 않는다고 생각합니다. 누구든지 문제를 발견 할 수 있습니까? 감사!

+0

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/ : 다음

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

는 무비 클립으로 다시 그것을 밖으로 당겨 3/flash/display/LoaderInfo.html # bytes – BadFeelingAboutThis

+0

그래서 이론적으로는 swf의 loaderInfo.bytes 속성을 사용하여 스트림으로 다시 저장하는 것이 가능해야한다고 생각합니다.writeBytes, 해본 적이 없기 때문에 나는 이것을 해답으로 생각하지 않는다. – BadFeelingAboutThis

+2

App Store에이 앱을 제출하려는 경우 외부 코드 (swf)를로드하고 실행하기 때문에 앱이 거부 될 것으로 생각됩니다. – sch

답변

2

로드 된 swf 파일의 원시 바이트는 loaderInfo.bytes 매개 변수를 사용하여 가져올 수 있습니다. 당신이 예를 들어이 작업을 수행 할 수 있도록 :

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); 
관련 문제