2011-01-15 10 views
7

En mi aplicación Flex, necesito un control de Javascript para llamar a uno de mis métodos ActionScript. Bastante simple, de acuerdo con la documentación de Flex/ActionScript, escribí esto en mi código ActionScript:ExternalInterface.addCallback Actionscript solo funciona localmente, no en producción

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

En el control Javascript escribí:

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

funciona muy bien. Exactamente como se esperaba, así que fui a la producción. Pero no funciona en producción :(. Mismo código exacto ... No puedo resolverlo. Se ejecuta el código JavaScript anterior, pero la devolución de llamada no se ejecuta en el código de Actionscript.

Tiene esto ¿Tiene algo que ver con la seguridad del dominio? Localmente, estoy usando local.mydomain.com:8080 donde local.midominio.com resuelve a 127.0.0.1 (tengo que hacer esto para que algunos widgets funcionen correctamente). Y la aplicación Flex viene de el mismo servidor web local. En producción, sin embargo, solo es www.midominio.com (mydomain.com no es el nombre de dominio real) y la aplicación Flex proviene de flash.midominio.com (un CDN).

Tengo un archivo crossdomain.xml en www.midominio.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> 

ACTUALIZACIÓN: Intenté cambiar el entorno local para que la aplicación Flex esté referenciada desde flash.mydomain.com, al igual que en la producción. Resulta que también tengo el mismo problema localmente ... así que parece que este es un tipo de problema de seguridad del dominio a pesar del archivo crossdomain.xml que tengo arriba. ¿Debo cambiar algo en mi crossdomain.xml? ¿Hay algo adicional que necesito para que ExternalInterface.addCallback funcione?

ACTUALIZACIÓN 2: ¡Lo tengo que hacer! Tenía que hacer tanto Security.allowDomain("*") como Security.allowInsecureDomain("*"). Al configurarlo en flash.mydomain.com NO solucionó el problema, tuve que poner un comodín. allowNetworking no tuvo ningún efecto. Necesito allowScriptAccess="always", pero tuve eso de antes. Llamar a Javascript con ExternalInterface.call funciona fácilmente con solo ese parámetro. Pero agregar una devolución de llamada con ExternalInterface.addCallback requiere los métodos de seguridad anteriores con un comodín.

+0

/crossdomain.xml no debería importar. ¿Su html también está en el servidor o es el html local y está cargando un swf de forma remota? – greggreg

+0

localmente, el html y el flash vienen de local.midominio.com:8080. De forma remota, el html proviene de www.midominio.com y el flash proviene de flash.midominio.com. Cuando cambio la ubicación del flash localmente a flash.mydomain.com, aparece el mismo problema, las devoluciones de llamadas ya no funcionan. –

+0

¿Cuál es el valor del parametro allowScriptAccess en el HTML de al lado que incorpora su aplicación Flex? –

Respuesta

2

La comunicación entre su SWF y el DOM no es manejada por el archivo de dominio cruzado. Este tipo de interacción entre el contenido Flash y el navegador se maneja con los valores de allowScriptAccess y allowNetworking etiquetas en el html que envuelve su SWF.

Debido a que su SWF y el HTML no son del mismo dominio cualificado, usted tiene que fijar el valorallowScriptAccess siempre. Pero tenga cuidado, porque eso significa que si carga un contenido no confiable en su SWF, también tendrá acceso a la página DOM y posiblemente haga cosas maliciosas.

Para obtener más información, busque en:

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

mi valor de allowcriptaccess siempre se ha establecido en "siempre". Además, ExternalInterface.call ("javascriptMethod", argumento); funciona bien permitiendo que la aplicación Flex llame al código javascript. ExternalInterface.callback no. –

+0

Ok, luego, aparece el código de tu addCallback con un try/catch y mira si hay algún SecurotyError lanzado. –

+0

He leído todos los enlaces recientemente y he intentado todo; allowScriptAccess = "always" (lo tenía antes), allowNetworking = "all", Security.allowDomain ("*"), Security.allowInsecureDomain ("*") (por si acaso). Nada funciona :(. –

Cuestiones relacionadas