2011-01-15 5 views
7

In meiner Flex-App brauche ich ein Javascript-Steuerelement, um eine meiner Actionscript-Methoden aufzurufen. Einfach genug, nach dem Flex/Actionscript-Dokumentation, schrieb ich in meinem Actionscript-Code:Actionscript's ExternalInterface.addCallback funktioniert nur lokal, nicht in Produktion

if (ExternalInterface.available) 
    ExternalInterface.addCallback("setName", setNameInActiveWindow); 

In der Javascript Kontrolle Ich schrieb:

document.getElementById('FlexAppId').setName(name); 

Arbeiten groß. Genau wie erwartet, ging ich in die Produktion. Aber es funktioniert nicht in der Produktion :(. Genaue Code ... Ich kann es nicht herausfinden. Der obige Javascript-Code wird ausgeführt, aber der Rückruf wird nicht im Actionscript-Code ausgeführt.

Hat dies Ich benutze local.mydomain.com:8080, wo local.mydomain.com zu 127.0.0.1 aufgelöst wird (ich muss dies tun, damit einige Widgets ordnungsgemäß funktionieren.) Und die Flex-App kommt von der gleiche lokale Webserver.In der Produktion jedoch ist es nur www.mydomain.com (mydomain.com ist nicht der echte Domain-Name) und die Flex-App kommt von flash.mydomain.com (ein CDN).

Ich habe eine crossdomain.xml-Datei unter www.mydomain.com:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
     <site-control permitted-cross-domain-policies="master-only"/> 
     <allow-access-from domain="*.mydomain.com"/> 
</cross-domain-policy> 

UPDATE: Ich habe versucht, die lokale Umgebung zu ändern, so dass der Flex-App von flash.mydomain.com Bezug genommen wird, ebenso wie in der Produktion. Es stellt sich heraus, dass ich das gleiche Problem auch lokal bekomme ... also scheint es sich um eine Art Domain-Sicherheitsproblem zu handeln, trotz der crossdomain.xml-Datei, die ich oben habe. Muss ich etwas in meiner crossdomain.xml ändern? Gibt es etwas Zusätzliches, das ich brauche, um ExternalInterface.addCallback zu arbeiten?

UPDATE 2: Verstanden zu arbeiten! Ich musste sowohl Security.allowDomain("*") als auch tun. Bei der Einstellung flash.mydomain.com wurde das Problem NICHT behoben, ich musste einen Platzhalter setzen. allowNetworking hatte keine Wirkung. Ich brauche allowScriptAccess="always", aber ich hatte das von vorher. Das Aufrufen von Javascript mit ExternalInterface.call funktioniert einfach mit diesem Parameter. Aber das Hinzufügen eines Rückrufs mit ExternalInterface.addCallback erfordert die obigen Sicherheitsmethoden mit einem Platzhalter.

+0

crossdomain.xml sollte keine Rolle spielen. ist dein html auch auf dem Server oder ist das html lokal und ein swf remote laden? – greggreg

+0

lokal, die HTML und Flash beide kommen aus local.mydomain.com:8080. Remote kommt das HTML von www.mydomain.com und Flash kommt von flash.mydomain.com. Wenn ich den Flash-Speicherort lokal auf flash.mydomain.com ändere, bekomme ich das gleiche Problem, Callbacks funktionieren nicht mehr. –

+0

Welchen Wert hat der allowScriptAccess-Parameter in der umgebenden HTML, die Ihre Flex-App einbettet? –

Antwort

2

Die Kommunikation zwischen Ihrer SWF und dem DOM wird nicht von der crossdomain-Datei verarbeitet. Diese Art der Interaktion zwischen Flash-Inhalten und dem Navigator wird durch die Werte allowScriptAccess und allowNetworking Tags im HTML-Wrapping Ihrer SWF behandelt.

Da SWF und die HTML sind nicht von der gleichen qualifizierten Domäne, müssen Sie den allowScriptAccess Wert immer gesetzt. Aber Vorsicht, denn das bedeutet, wenn Sie einen nicht vertrauenswürdigen Inhalt in Ihre SWF-Datei laden, hat er auch Zugriff auf die DOM-Seite und kann möglicherweise bösartige Dinge tun.

Für weitere Informationen konsultieren Sie bitte:

http://tv.adobe.com/watch/how-to-develop-secure-flash-platform-apps/scripting-and-allowscriptaccess/ http://kb2.adobe.com/cps/407/kb407748.html http://blogs.adobe.com/stateofsecurity/2007/07/how_to_restrict_swf_content_fr_1.html

+0

Mein Wert für allowscriptaccess wurde immer auf "immer" gesetzt. Auch die ExternalInterface.call ("javascriptMethod", Argument); funktioniert einwandfrei, sodass die Flex-App JavaScript-Code aufrufen kann. ExternalInterface.callback nicht. –

+0

Ok, dann überrunden Sie Ihren addCallback-Code mit einem try/catch und prüfen Sie, ob SecurotyError ausgelöst wird. –

+0

Ich habe gerade alle diese Links gelesen und alles versucht; allowScriptAccess = "always" (hatte es vorher), allowNetworking = "all", Security.allowDomain ("*"), Security.allowInsecureDomain ("*") (für ein gutes Maß). Nichts funktioniert :(. –

Verwandte Themen