2009-03-03 11 views
8

मैं वर्तमान में एक मानक एएस 3 आवेदन, और एक एआईआर आवेदन दोनों से बाहरी एसडब्ल्यूएफ फाइलों को लोड करने के साथ प्रयोग कर रहा हूं। ऐसा लगता है कि एआईआर एप्लीकेशन फ़्लैश प्लेयर द्वारा संचालित एक मानक एसडब्ल्यूएफ के समान तरीके से कार्य नहीं करता है।लोडर कॉन्टेक्स्ट और एप्लीकेशनडोमेन एडोब एयर के साथ बदलता है?

documentation के अनुसार, applicationDomainLoaderContext की संपत्ति एआईआर एप्लिकेशन में भी उपयोग योग्य है, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है।

मैं निम्नलिखित कोड है:

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

    public class Invoker extends Sprite 
    { 
     private var _ldr : Loader; 

     public function Invoker() 
     { 
      _ldr = new Loader(); 
      _ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onChildOneComplete); 

      var ldrC : LoaderContext = new LoaderContext(false, 
       new ApplicationDomain(ApplicationDomain.currentDomain) 
      ); 

      _ldr.load(new URLRequest("otherSwf.swf"), ldrC); 
     } 

     private function onChildOneComplete(e : Event) : void 
     { 
      var c1ad : ApplicationDomain = (e.target as LoaderInfo).applicationDomain; 
      var inad : ApplicationDomain = ApplicationDomain.currentDomain; 

      trace("Child One parentDomain : " + c1ad.parentDomain); 
      trace("Invoker parentDomain : " + inad.parentDomain); 

      trace("Child One has Invoker : " + c1ad.hasDefinition("Invoker")); 
      trace("Invoker has Invoker : " + inad.hasDefinition("Invoker")); 
     } 
    } 
} 

SWF फ़ाइल के रूप में इस कोड संकलन और फ़्लैश प्लेयर के साथ इसे शुरू करने से करता है इस उत्पादन है, जो सही लगता है:

Child One parentDomain : [object ApplicationDomain] 
Invoker parentDomain : null 
Child One has Invoker : true 
Invoker has Invoker : true 

लेकिन एक ही कोड एक एआईआर अनुप्रयोग के रूप में एक अलग आउटपुट करता है:

Child One parentDomain : null 
Invoker parentDomain : null 
Child One has Invoker : false 
Invoker has Invoker : true 

दस्तावेज के अनुसार एन, पहला आउटपुट (फ्लैश प्लेयर के साथ एक एसडब्ल्यूएफ का उपयोग करके, और एआईआर एप्लीकेशन नहीं) सही है। साथ ही, इस स्निपेट के साथ खेलना और अन्य लोगों को संभावित कॉन्फ़िगरेशन (जैसे new ApplicationDomain(null), या ApplicationDomain.currentDomain) में एप्लिकेशन डोमेन को बदलना एसडब्ल्यूएफ के साथ प्रलेखन कहता है, लेकिन एआईआर एप्लिकेशन के आउटपुट को नहीं बदलता है।

कोई संकेत क्यों एआईआर लोडर संदर्भ में पास किए गए एप्लिकेशन डोमेन को अनदेखा कर रहा है? इस विशेष मुद्दे के बारे में कोई दस्तावेज?

बहुत बहुत धन्यवाद।

उत्तर

14

समझ गया।

यह समस्या एआईआर अनुप्रयोग के भीतर SecurityDomain प्रणाली में एक अलग व्यवहार के कारण हुई थी। जब एक एआईआर आवेदन के भीतर एक एसडब्ल्यूएफ फ़ाइल लोड की जाती है, तो यह हमेशा एक अलग सैंडबॉक्स पर निर्भर करती है। इस प्रकार, एआईआर इस एसडब्ल्यूएफ के लिए एक नया SecurityDomain बनाता है।

एक SecurityDomain के बाद से एक या अधिक ApplicationDomain रों का एक समूह है, इस व्यवहार की आवश्यकता बढ़ती लगी एक नया ApplicationDomain (नई SecurityDomain के अंदर), निर्दिष्ट एक (जो 'मुख्य' SecurityDomain के हैं) की अनदेखी।

URLLoader का उपयोग कर एक कार्यवाही है। बाइटकोड से लोड होने पर (Loader.loadBytes का उपयोग करके), एक एसडब्ल्यूएफ उसी SecurityDomain के भीतर लोड किया जाता है। यही कारण है कि आपको allowLoadBytesCodeExecution को सत्य में रखना होगा, क्योंकि यह असुरक्षित हो सकता है। तो अप्रत्यक्ष रूप से एसडब्ल्यूएफ लोड करना, पहले URLLoader, और फिर Loader.loadBytes के साथ, इस समस्या को हल करें।

package { 
    import flash.display.Loader; 
    import flash.display.LoaderInfo; 
    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; 
    import flash.utils.ByteArray; 

    public class Invoker extends Sprite 
    { 
     public function Invoker() 
     { 
      var uldr : URLLoader = new URLLoader(); 
      uldr.dataFormat = URLLoaderDataFormat.BINARY; 
      uldr.addEventListener(Event.COMPLETE, onBytesComplete); 

      uldr.load(new URLRequest("otherSwf.swf")); 
     } 

     private function onBytesComplete(e : Event) : void 
     { 
      var bytes : ByteArray = (e.target as URLLoader).data; 

      var ldr : Loader = new Loader(); 
      ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onChildComplete); 

      var ldrC : LoaderContext = new LoaderContext(); 

      // This property was for AIR 1.0. 
      //ldrC.allowLoadBytesCodeExecution = true; 

      // Since AIR 2.0, it's allowCodeImport. 
      ldrC.allowCodeImport = true; 

      ldr.loadBytes(bytes, ldrC); 
     } 

     private function onChildComplete(e : Event) : void 
     { 
      var c1ad : ApplicationDomain = (e.target as LoaderInfo).applicationDomain; 
      var inad : ApplicationDomain = ApplicationDomain.currentDomain; 

      trace("Child One parentDomain : " + c1ad.parentDomain); 
      trace("Invoker parentDomain : " + inad.parentDomain); 

      trace("Child One has Invoker : " + c1ad.hasDefinition("Invoker")); 
      trace("Invoker has Invoker : " + inad.hasDefinition("Invoker")); 
     } 
    } 
} 

आशा इस मदद करता है:

यहाँ टुकड़ा है।

+0

ध्यान दें कि आप [allowCodeImport] का उपयोग करने के रूप में @pigiuz –

+0

से कहा कि मैं समय इसे ध्यान में करने के लिए अपने जवाब संपादित किया है की आवश्यकता होगी। धन्यवाद! – Tyn

1

है कि एक अच्छा एक, thanx :)

बस एक और विस्तार: allowLoadBytesCodeExecution अब एक विरासत संपत्ति है, यह आकाशवाणी 1.0 में परिभाषित किया गया था। उपयोग पर एआईआर 2.0 से इसके बजाय कोड Import अनुमति दें।

Ciao, पीजी

संबंधित मुद्दे