And forgot to mention but both the loader and the application needs to be compiled with -includes=mx.managers.systemClasses.MarshallingSupport
Frédéric THOMAS > From: [email protected] > To: [email protected] > Subject: RE: [AIR - loadForCompatibility] > Date: Fri, 26 Sep 2014 09:08:52 +0100 > > > Was the remote SWF able to make "secure" calls to the server? > Remote calls yes, but we're not in https, so, I can't say. > > Frédéric THOMAS > > > From: [email protected] > > To: [email protected] > > Subject: RE: [AIR - loadForCompatibility] > > Date: Fri, 26 Sep 2014 08:43:01 +0100 > > > > Hi Alex, > > It works perfectly, remote calls and all the AIR APIs, my app loader is in > > the last version of the SDK / AIR, it loads the old AIR project SDK 4.6 > > which in turn loads modules, the goal was to be able to raise the SDK and > > libs versions avoiding re-installing the application on devices where the > > users haven't got the admin rights, so, from now, they will do the install > > of the loader once which in turn will check if there is an updated version > > of the main app on the server and download it as needed. > > Next step is to do with RSLs from the main app to make the app and modules > > lighter. > > Thanks for having given me the clue. > > > > Frédéric THOMAS > > > > > From: [email protected] > > > To: [email protected] > > > Subject: Re: [AIR - loadForCompatibility] > > > Date: Thu, 25 Sep 2014 16:25:56 +0000 > > > > > > Makes sense. Thanks for sharing. > > > > > > Was the remote SWF able to make "secure" calls to the server? I was told > > > that in some web-apps, the servers check the headers to see if the request > > > came from a client served from the same domain and that whatever header > > > that is will not be "yourDomain" when the SWF is loaded in this way. > > > > > > -Alex > > > > > > On 9/25/14 8:34 AM, "Frédéric THOMAS" <[email protected]> wrote: > > > > > > >So, the trick to have an adobe AIR trusted remote multi-versioned > > > >application is as shown in this sample code: > > > ><?xml version="1.0" encoding="utf-8"?><s:WindowedApplication > > > >xmlns:fx="http://ns.adobe.com/mxml/2009" > > > >xmlns:s="library://ns.adobe.com/flex/spark" > > > > > > > >preinitialize="preinitializeHandler(event)" showStatusBar="false"> > > > > <fx:Script> <![CDATA[ import > > > > mx.events.FlexEvent; > > > > // Get the raw swf private > > > > function launchChildApp():void > > > >{ trace("applicationDirectory: " + > > > >File.applicationDirectory.nativePath); > > > >trace("applicationStorageDirecto > > > >ry: " + File.applicationStorageDirectory.nativePath); > > > > const urlRequest:URLRequest = new > > > >URLRequest("http://yourDomain/yourApplication/youRemoteTrustedMultiVerione > > > >dAirWindowedApplication.swf"); const > > > >urlLoader:URLLoader = new > > > >URLLoader(); urlLoader.dataFormat = > > > >URLLoaderDataFormat.BINARY; > > > >urlLoader.addEventListener(Event.COMPLETE, > > > >urlLoader_completeHandler); > > > >urlLoader.load(urlRequest); } > > > > private function > > > > preinitializeHandler(event:FlexEvent):void { > > > > maximize(); launchChildApp(); > > > > } > > > > private function > > > > urlLoader_completeHandler(event:Event):void { > > > > const urlLoader:URLLoader = event.currentTarget > > > > as URLLoader; > > > > // In isolation because the loaded code may be > > > > compile with another > > > >flex version. const > > > >applicationDomain:ApplicationDomain = new > > > >ApplicationDomain(null); > > > > const lc:LoaderContext = new > > > > LoaderContext(false, > > > >applicationDomain); lc.allowCodeImport = > > > >true; > > > > swfLoader.loaderContext = lc; > > > > swfLoader.load(urlLoader.data as > > > >ByteArray); } ]]> </fx:Script> > > > > <s:SWFLoader id="swfLoader" autoLoad="false" trustContent="true" > > > >loadForCompatibility="true" > > > >showBusyCursor="true" > > > >scaleContent="false"/> > > > ></s:WindowedApplication> > > > > > > > >Frédéric THOMAS > > > > > > > >> From: [email protected] > > > >> To: [email protected] > > > >> Subject: RE: [AIR - loadForCompatibility] > > > >> Date: Wed, 24 Sep 2014 13:29:15 +0100 > > > >> > > > >> > > > >> > > > >> > > > >> My bad, I had to add the listener to LoaderInfo instead of Loader, use > > > >>a child applicationDomain instead of a sibling one and instanciate from > > > >>the applicationDomain definitions my App before using it. > > > >> > > > >> Still exploring... > > > >> > > > >> Frédéric THOMAS > > > >> > > > >> > From: [email protected] > > > >> > To: [email protected] > > > >> > Subject: RE: [AIR - loadForCompatibility] > > > >> > Date: Wed, 24 Sep 2014 11:37:46 +0100 > > > >> > > > > >> > Hi Alex, > > > >> > So, I gave a try but I'm facing something weird, comment in code: > > > >> > The Loader:<?xml version="1.0" encoding="utf-8"?> > > > >> > <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" > > > >>xmlns:s="library://ns.adobe.com/flex/spark"> > > > >> > > > > >> > <s:layout> > > > >> > <s:VerticalLayout/> > > > >> > </s:layout> > > > >> > > > > >> > <fx:Script> > > > >> > <![CDATA[ > > > >> > import mx.core.IVisualElement; > > > >> > > > > >> > // Get the raw swf > > > >> > private function launchChildApp():void { > > > >> > const urlRequest:URLRequest = new > > > >>URLRequest("http://localhost:8080/mobilityworkspace/App.swf"); > > > >> > const urlLoader:URLLoader = new URLLoader(); > > > >> > urlLoader.dataFormat = URLLoaderDataFormat.BINARY; > > > >> > urlLoader.addEventListener(Event.COMPLETE, > > > >>urlLoader_completeHandler); > > > >> > urlLoader.load(urlRequest); > > > >> > } > > > >> > > > > >> > // load the raw swf into the same security context and > > > >>sibling application domain > > > >> > private function urlLoader_completeHandler(event:Event):void > > > >> > { > > > >> > const urlLoader:URLLoader = event.currentTarget as > > > >>URLLoader; > > > >> > > > > >> > // In isolation because the loaded code may be compile > > > >>with another flex version. > > > >> > const applicationDomain:ApplicationDomain = new > > > >>ApplicationDomain(null); > > > >> > > > > >> > const lc:LoaderContext = new LoaderContext(false, > > > >>applicationDomain); > > > >> > lc.allowCodeImport = true; > > > >> > > > > >> > // Throws [Fault] exception, information=Error: > > > >>addChild() is not available in this class. > > > >> > // Instead, use addElement() or modify the skin, if you > > > >>have one. > > > >> > //lc.requestedContentParent = panel; > > > >> > > > > >> > const ldr:Loader = new Loader(); > > > >> > > > > >> > // So wait for the COMPLETE Event to affect it to the > > > >>panel but > > > >> > // the Event is never fired (and even no other events, > > > >>errors). > > > >> > ldr.addEventListener(Event.COMPLETE, > > > >> > ldr_completeHandler); > > > >> > ldr.loadBytes(urlLoader.data as ByteArray, lc); > > > >> > } > > > >> > > > > >> > // Never goes here. > > > >> > private function ldr_completeHandler(event:Event):void { > > > >> > const ldr:Loader = event.currentTarget as Loader; > > > >> > panel.addElement(ldr.content as IVisualElement); > > > >> > } > > > >> > ]]> > > > >> > </fx:Script> > > > >> > > > > >> > > > > >> > <s:Button label="Launch child application" > > > >>click="launchChildApp()"/> > > > >> > > > > >> > <s:Panel id="panel" width="100%" height="100%"/> > > > >> > > > > >> > </s:WindowedApplication> > > > >> > > > > >> > The App:<?xml version="1.0"?> > > > >> > <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" > > > >> > xmlns:s="library://ns.adobe.com/flex/spark"> > > > >> > <fx:Script> > > > >> > <![CDATA[ > > > >> > import mx.controls.Alert; > > > >> > ]]> > > > >> > </fx:Script> > > > >> > <s:Button click="Alert.show('Hello, world')" label="Say Hello"/> > > > >> > </s:Group> > > > >> > > > > >> > Do you know why I can't reach ldr_completeHandler ?Frédéric THOMAS > > > >> > > > > >> > > From: [email protected] > > > >> > > To: [email protected] > > > >> > > Subject: RE: [AIR - loadForCompatibility] > > > >> > > Date: Tue, 23 Sep 2014 22:20:35 +0100 > > > >> > > > > > >> > > Alight, thank you Alex > > > >> > > > > > >> > > Frédéric THOMAS > > > >> > > > > > >> > > > From: [email protected] > > > >> > > > To: [email protected] > > > >> > > > Subject: Re: [AIR - loadForCompatibility] > > > >> > > > Date: Tue, 23 Sep 2014 21:03:39 +0000 > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > On 9/23/14 1:56 PM, "Frédéric THOMAS" <[email protected]> > > > >>wrote: > > > >> > > > > > > >> > > > >> Essentially, this trick makes remote content local. It can > > > >>make remote > > > >> > > > >> calls, but the headers will be the same as if you coded > > > >>URLLoader in the > > > >> > > > >> main AIR app not as if it was a web-app served by the domain's > > > >>server. > > > >> > > > > > > > >> > > > >If it means the loaded swf is perceived as or is in the local > > > >>application > > > >> > > > >sandbox / security context, I guess it can do the trick moving > > > >>the rest > > > >> > > > >of the code in a module downloaded by the loaded swf, thought ? > > > >> > > > AIUI, you can keep "importing" swfs into the application sandbox, > > > >>but the > > > >> > > > servers that they came from will not see the same headers as if > > > >>it was a > > > >> > > > web app from that server and will respond differently, often by > > > >>returning > > > >> > > > failure. > > > >> > > > > > > >> > > > If you download remote.swf and load bytes it, and it just uses > > > >>Loader to > > > >> > > > run anotherremote.swf, anotherremote.swf is loaded into a sandbox > > > >>and > > > >> > > > cannot access the remote.swf. Remote.swf would also have to use > > > >>the load > > > >> > > > bytes trick in order for anotherremote.swf to talk directly to > > > >>each other. > > > >> > > > > > > >> > > > -Alex > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > > > > > > > > >
