2010-12-06 16 views
0

J'ai deux fichiers swf hébergés sur différents domaines aaa.com/a.swf et bbb.com/b.swf. a.swf charge b.swf et essaye de le transtyper sur une interface. Lorsque ces deux fichiers swf sont sous le même domaine, tout fonctionne correctement. Mais quand ils sont sous des domaines différents, je reçois null après avoir lancé b.swf à l'interface implémentée IComponent. Ces deux swfs sont compilés avec use-network = true et avec le même IComponent.as.Problèmes de domaine croisés dans Flash

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 
    } 

} 
+0

je suppose Wrapper est la classe de document pour a.swf et le composant est le classe de document pour b.swf. Le chargement de target.content est-il du tout? pouvez-vous le retracer? – momo

+0

Oui, c'est. Wrapper charge le composant, puis essaie de le convertir en IComponent –

Répondre

-1

mon idée sur les erreurs de syntaxe était inutile, voici une édition:

ce code:

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

fonctionne bien, même si les fichiers sont sur des domaines complètement différents.
cela fonctionne-t-il si vous traitez votre IComponent comme Sprite?

+0

si c'était le problème, le code ne serait jamais exécuté! le code OP est valide ... – PatrickS

+0

Votre code fait exactement la même chose que le mien.) Casting à Sprite n'est pas une bonne idée. –

+0

@Pul Yuriychuck votre code fonctionne-t-il si vous le traitez comme Sprite? imho c'est une information utile – www0z0k

0

Peut-être que vous devez définir la politique de sécurité inter-domaines par fichier crossdomain.xml

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

Par exemple:

<?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

Ajout d'une ligne au code de chargement loaderContext.securityDomain = SecurityDomain.currentDomain; et obtenu l'exception SecurityError, d'où votre hypothèse est juste. –

1

Essayez ceci:

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

Il semble que la raison pour laquelle cela ne fonctionne pas a à voir avec le fait que eit son IComponent n'est pas reconnu ou qu'il y a un conflit de définition. J'aurais pensé qu'avec ApplicationDomain mis à currentDomain, un conflit de définition aurait dû être évité ... mais il peut être utile d'essayer de laisser chaque SWF dans leur propre domaine.

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

Vous pouvez également vérifier si IComponent "existe" avant de charger l'autre fichier SWF. Cela pourrait aider à diagnostiquer ce qui se passe ...

var ClassName:Object = getDefinitionByName('IComponent'); 
trace(ClassName); 
+0

Laissez-moi essayer celui-ci, merci –

+0

Merci pour l'idée, j'espère que cela aiderait;) à la fois Wrapper.swf et Component.swf sont compilés en utilisant exactement la même interface IComponent, ce n'est pas conflit de définition. Néanmoins, je vais essayer getDefinitionByName juste pour être sûr. –

0

Merci à tous pour les réponses, j'ai trouvé une solution de travail aujourd'hui. Au lieu de jeter le contenu chargé à IComponent je le jeter à l'objet

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

I est confimed de test que même lorsque nous utilisons la classe partagée avec des champs statiques et des méthodes qu'il ne fonctionne pas. Le wrapper et le composant instancient leurs propres instances de classe partagée. C'est vraiment étrange.

Si vous avez les mêmes problèmes que votre s'il vous plaît assurer wrapper/classes de composants ont Security.allowDomain appelle

0

C'est un bug dans le lecteur:

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

Il arrive lorsque vous essayez de "partager" une interface entre des swfs chargés depuis différents domaines. Cela devrait fonctionner à condition de mettre les deux swfs sous le même domaine d'application (comme vous l'avez fait).

L'utilisation d'un objet fonctionne, mais en quelque sorte, elle va à l'encontre du but de l'utilisation d'une interface.

Voici une solution de contournement qui charge essentiellement le swf comme binaire et utilise ensuite Loader::loadBytes pour charger réellement le swf en mémoire:

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

+0

Merci beaucoup pour la cause première d'un problème. Les interfaces fonctionnent correctement lorsque les fichiers swf parent et enfant sont hébergés sous le même domaine. –