Междоменные проблемы во Flash - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть два swf-файла, размещенных на разных доменах aaa.com/a.swf и bbb.com/b.swf. a.swf загружает b.swf и пытается привести его к какому-либо интерфейсу. Когда оба эти SWF-файла находятся в одном домене, все работает нормально. Но когда они находятся в разных доменах, я получаю нулевое значение после приведения b.swf к реализованному интерфейсу IComponent. Оба эти swfs скомпилированы с использованием use-network = true и с тем же IComponent.as.

public class Wrapper extends Sprite
{
    public function Wrapper()
    {
        super();
        var request:URLRequest = new URLRequest("http://aaa.com/Component.swf");
        var loaderContext:LoaderContext = new LoaderContext();
            loaderContext.applicationDomain = ApplicationDomain.currentDomain;
        var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
            loader.load(request,loaderContext);
            addChild(loader);
    }

    private function onLoadingComplete(event:Event):void
    {
        var target:LoaderInfo = event.target as LoaderInfo;
        var component:IComponent = target.content as IComponent;
            component.init({"s":1});
            component.run();    
    }

}

public class Component extends Sprite implements IComponent
{
    public function Component()
    {
        super();
        Security.allowInsecureDomain("*");
    }

    public function init(params:Object):void
    {
        //some actions
    }

    public function run():void
    {
        //some actions
    }

}

Ответы [ 5 ]

1 голос
/ 07 декабря 2010

Попробуйте:

 //Assuming you've set a crossdomain policy file
 var loaderContext:LoaderContext = 
          new LoaderContext( true , ApplicationDomain.currentDomain )

Кажется, что причина, по которой он не работает, связана с тем, что либо IComponent не распознан, либо существует конфликт определений.Я бы подумал, что если для ApplicationDomain установлено значение currentDomain, следует избегать конфликта определений ... но, возможно, стоит попытаться оставить каждый SWF-файл в своем собственном домене.

 //Assuming you've set a crossdomain policy file
 var loaderContext:LoaderContext = 
          new LoaderContext( true );

Вы также можете проверить,IComponent «существует» перед загрузкой другого SWF.Это может помочь в диагностике того, что происходит ...

 var ClassName:Object = getDefinitionByName('IComponent');
 trace( ClassName );
0 голосов
/ 09 декабря 2010

Это ошибка в плеере:

http://bugs.adobe.com/jira/browse/ASC-3529

Это происходит, когда вы пытаетесь «поделиться» интерфейсом между swfs, которые были загружены из разных доменов.Это должно работать при условии, что вы поместили оба swfs в один домен приложения (как у вас).

Использование объекта работает, но в некоторой степени побеждает цель использования интерфейса.

Вот обходной путь, который в основном загружает SWF как двоичный файл, а затем использует Loader::loadBytes дляфактически загружаем SWF в память:

http://blog.aleksandarandreev.com/?p=42

0 голосов
/ 08 декабря 2010

Спасибо всем за ответы, сегодня я нашел рабочее решение. Вместо того, чтобы приводить загруженный контент в IComponent, я приводю его к объекту

var component:Object = (event.target as LoaderInfo).content as Object;
    component["init"](null);
component["run"]();

Я убедился в тестировании, что даже когда мы используем общий класс со статическими полями и методами, он не работает. И оболочка, и компонент создают свои собственные экземпляры разделяемого класса. Это действительно странно.

Если у вас возникли те же проблемы, убедитесь, что в ваших классах-оболочках / компонентах есть вызовы Security.allowDomain

0 голосов
/ 07 декабря 2010

Возможно, вам нужно установить междоменную политику безопасности с помощью файла crossdomain.xml

http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html

Например:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy 
  SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="*.example.com" />      
</cross-domain-policy>
0 голосов
/ 07 декабря 2010

моя идея о синтаксических ошибках была бессмысленной, вот правка:

этот код:

    private function ololo():void{
        var request:URLRequest = new URLRequest("http://domain/file.swf");
        var loaderContext:LoaderContext = new LoaderContext();
            loaderContext.applicationDomain = ApplicationDomain.currentDomain;
        var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
            loader.load(request,loaderContext);
    }

    private function onLoadingComplete(e:Event):void {
        var target:LoaderInfo = e.target as LoaderInfo;
        addChild(target.content as Sprite);
    }

работает хорошо, даже если файлы находятся в совершенно разных доменах.это работает, если вы рассматриваете ваш IComponent как Sprite?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...