2011-06-13 48 views
3

我嘗試下載外部SWF並在AIR安全沙箱中運行它。在AIR Security Sandbox中執行遠程SWF

這是AIR應用程序的代碼:

public class Downloader extends Sprite 
{ 

    private static const REMOTE_FILE:URLRequest = new URLRequest("http://myserver.com/downloadable.swf"); 
    private var _main:NativeWindow; 

    public function Downloader() 
    { 
     var loader:URLLoader = new URLLoader(REMOTE_FILE); 
     loader.dataFormat = URLLoaderDataFormat.BINARY; 
     loader.addEventListener(Event.COMPLETE, downloadComplete); 
    } 

    private function downloadComplete(e:Event):void{ 
     var ba:ByteArray = e.target.data; 
     var stream:FileStream = new FileStream(); 
     var file:File = File.applicationStorageDirectory.resolvePath("downloadable.swf"); 
     stream.open(file, FileMode.WRITE); 
     stream.writeBytes(ba); 
     stream.close(); 

     loadAndRunSwf(); 
    } 

    private function loadAndRunSwf(){  
     this._main = new NativeWindow(); 
     this._main.width = 1024; 
     this._main.height = 768; 

        ////obsolete? 
     //var context:LoaderContext = new LoaderContext(); 
     //context.allowLoadBytesCodeExecution = true; 
     //context.applicationDomain = ApplicationDomain.currentDomain; 

     var file:File = File.applicationStorageDirectory.resolvePath("downloadable.swf"); 
     var loader:Loader = new Loader(); 
     loader.load(new URLRequest(file.url)/*,context*/); 

     this._main.stage.addChild(loader); 
     this._main.activate(); 
    } 
} 

的downloadable.swf的代碼:

public class Downloadable extends Sprite 
{ 
    private var _btn:Button = new Button(); 
    private var _baseFolder:File = new File("app-storage:/"); 

    public function downloadable_test() 
    { 
     this.addChild(_btn); 
     _btn.label = "access Harddisk"; 
        ... 
    } 
} 

所以現在,如果我運行下載器,它會下載SWF文件,並嘗試運行它,但我會在下載得到一個異常就行

private var _baseFolder:File = new File("app-storage:/"); 

錯誤:

SecurityError: file 
at runtime::SecurityManager$/checkPrivilegeForCaller() 

那麼 - 我需要做什麼來防止這種安全錯誤?我希望將我的遠程SWF視爲在與AIR代碼相同的安全沙箱中運行的本機代碼。

回答

1

我對Android沒有把握,但對於普通的Web播放器,您需要指定SecurityDomain.currentDomain作爲Loader的上下文的安全域,以使加載的代碼在權限方面與加載器相同。另請注意,出於無法解釋的原因,如果您在從PC上的文件系統加載時使用SecurityDomain,則Flash Player會發出抱怨。但是,Flash Player的安全性通常是一種默默無聞的安全措施......因此,如果它不像您編碼它的方式那樣工作,請嘗試使用Loader.loadBytes()解決方法。

+0

我有一個類似的問題作爲墊。使用SecurityDomain不起作用=我遇到以下錯誤:SecurityError:錯誤#2142:安全沙箱衝突:本地SWF文件無法使用LoaderContext.securityDomain屬性。 app:/game.swf正在嘗試加載應用程序存儲:/levels/00_intro.swf。 – Oldes 2012-01-15 20:55:33

+0

你是對的......在這裏和那裏弄亂了代碼後,Loader.loadBytes()似乎工作到目前爲止。謝謝。 – Oldes 2012-01-16 17:22:13

+0

雖然它看起來這個技巧只適用於PC ..不適用於Android:/ – Oldes 2012-01-17 16:28:32

0
function loadAndRunSwf() 
{ 
    var context:LoaderContext=new LoaderContext(false); 

    context.allowCodeImport=true; 

    var ba:ByteArray=new ByteArray(); 
    var file:File = File.applicationStorageDirectory.resolvePath("downloadable.swf"); 
    var fileStream:FileStream=new FileStream(); 
    var loader:Loader = new Loader(); 

    fileStream.open(file,"read"); 
    fileStream.readBytes(ba); 
    ba.position=0; 
    loader.loadBytes(ba,context); 
    this._main = new NativeWindow(); 
    this._main.width = 1024; 
    this._main.height = 768; 
    this._main.stage.addChild(loader); 
    this._main.activate(); 
}