2

我有一个正在开发的 AIR 应用程序,需要加载一个 swf(总是从本地主机),它将访问其父级中的一些方法,反之亦然。不过,我并不担心在桌面应用程序中打开巨大的安全漏洞。我一直在搜索,但在每个实现中都遇到了困难。

我当前的设置加载到 swf 中并且它可以播放,但是我从沙箱中收到一个小错误,因为我与应用程序不在同一个中。有谁知道如何克服这个错误,以便在 AIR 应用程序和 swf 之间打开完全的自由?

* 违反安全沙盒 *

SecurityDomain 'http://localhost/test.swf' 试图访问不兼容的上下文 'app:/Test_Player.swf'

public function loadSWF():void {

//var context:LoaderContext = new LoaderContext();
//context.checkPolicyFile = true;
//context.applicationDomain = ApplicationDomain.currentDomain;
//context.securityDomain = SecurityDomain.currentDomain;

var req:URLRequest = new URLRequest(swfURL);
adLoader = new Loader();

videoCanvas.rawChildren.addChild(adLoader);

loader.contentLoaderInfo.addEventListener(Event.INIT, adLoadedHandler, false, 0, true);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError, false, 0, true);

//loader.load(req, context);
loader.load(req);
}
4

1 回答 1

5

您需要使用 UrlLoader 加载远程 SWF,然后通过 loadByte 重新加载。使用这种方法,您将通过安全性。

package
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    public class TestDistantSwf extends Sprite
    {
        private var _urlLoader : URLLoader = new URLLoader;
        private var _loader : Loader = new Loader;

        public function TestDistantSwf()
        {

            addChild(_loader);
            // Won't work
            //_loader.load(new URLRequest("http://localhost/test.swf"));

            // Load it as binary
            _urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
            _urlLoader.addEventListener(Event.COMPLETE, onLoad);
            _urlLoader.load(new URLRequest("http://localhost/test.swf"));
        }

        private function onLoad(e : Event) : void
        {
            // Load distant swf data locally
            _loader.loadBytes(_urlLoader.data, new LoaderContext(false, ApplicationDomain.currentDomain));
        }
    }
}

如果你需要像 flash var 这样传递参数,有两种方法,如果使用 Air 2.6 或更高版本,你可以使用 LoaderContext.parameters :

private function onLoad(e : Event) : void
{
    var lc : LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
    lc.parameters ={
        foo:"hello !"
    };
    lc.allowCodeImport = true;

    // Load distant swf data locally
    _loader.loadBytes(_urlLoader.data, lc);
}

然后在加载的 SWF 中使用 loaderInfo.parameters 获取它。

或者您可以调用已加载的 Swf 函数:

private function onLoadBinary(e : Event) : void
{
    e.target.content.init("hello 2 !");
}

private function onLoad(e : Event) : void
{
    var lc : LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
    lc.allowCodeImport = true;

    // Load distant swf data locally
    _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadBinary);
    _loader.loadBytes(_urlLoader.data, lc);
}

这将从其主类中加载的 swf 调用:

public function init(foo : String) : void
{
    trace(foo);
}
于 2012-08-21T07:16:48.563 回答