Adobe AIR:Worker 无法加载文件

3
我在AIR中使用Workers时遇到了问题:当我尝试在非原生Worker中打开文件时,会出现安全错误。但当我在原生Worker中尝试相同的代码时,它可以正常运行。创建第二个Worker时,我加载另一个swf并传递其字节码。

首先,我尝试使用URLLoader(代码在第二个Worker中):

// Loading XML test
var loader:URLLoader = new URLLoader(new URLRequest('app:/config/generator/galaxy.xml'));
loader.addEventListener(Event.COMPLETE, function(evt:Event):void
{
    // Trace
    CEThreadDebugger.log(XML(loader.data).toString());
});
loader.addEventListener(IOErrorEvent.IO_ERROR, function(evt:IOErrorEvent):void
{
    CEThreadDebugger.log(evt.text, CEThreadDebugger.ERROR);
});
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(evt:SecurityErrorEvent):void
{
    CEThreadDebugger.log(evt.text, CEThreadDebugger.ERROR);
});

我收到了以下错误信息:
[LOG]ERROR->Error #2048: Security sandbox violation: app:/SombresCieux.swf cannot load data from app:/config/generator/galaxy.xml.

然后我尝试使用文件(File:):
var file:File = File.applicationDirectory.resolvePath('config/generator/galaxy.xml');
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ);
var xml:XML = XML(stream.readUTFBytes(stream.bytesAvailable));
stream.close();

而且我遇到了这个错误(我的代码在_mainToWorker方法中):
[LOG]INFO->Error #0 : SecurityError -> file
SecurityError: file
    at flash.filesystem::File$/initAppResourceDir()
    at flash.filesystem::File$/get appResourceDirectoryPath()
    at flash.filesystem::File$/get applicationDirectory()
    at generator::Generator/_mainToWorker()
    at engine.generic.system.concurrency::CEThreadMain/Evt_mainToWorker()

我注意到错误仅来自这一行:

var file:File = File.applicationDirectory.resolvePath('config/generator/galaxy.xml');

所以它在主应用程序中的原始工作者中有效,但不适用于线程...

工作者无法访问系统文件,也无法加载任何文件,这是一个相当巨大的限制...

感谢回复!

1个回答

4

public function createWorker(swf:ByteArray, giveAppPrivileges:Boolean = false):Worker

giveAppPrivileges(默认为false)——表示是否应该在AIR中向worker授予应用程序沙箱特权。在Flash Player中,此参数将被忽略。


谢谢你的回答,我已经弄明白了,准备自己回答。^^ - Akryum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接