2011-01-15 15 views
7

Flex uygulamasında, Actionscript yöntemlerimden birini çağırmak için bir Javascript denetimine ihtiyacım var. Basit yeterli, Flex/ActionScript belgelerine göre, benim ActionScript kodunda bu yazmış:Actionscript'in ExternalInterface.addCallback yalnızca yerel olarak çalışıyor, üretimde değil

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

yazdım JavaScript kontrolde:

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

oldukça uygundur. Tam olarak beklendiği gibi, ben de üretime gittim. Ama bu üretimde çalışmaz :(Aynı tam kod ... Bunu anlayamıyorum Yukarıdaki Javascript kodu çalıştırılıyor, ancak geri arama işlemi ActionScript kodunda çalıştırılmıyor

Bu var mı etki alanı güvenliği ile ilgili bir şey var mı? Yerel olarak, local.mydomain.com:8080 kullanıyorum local.mydomain.com 127.0.0.1 (bu yüzden bazı widget'lar düzgün bir şekilde çalışması için bunu yapmalıyım) çözer. Ve Flex uygulaması Aynı yerel web sunucusu.Yalnızca üretimde, sadece www.mydomain.com (mydomain.com gerçek alan adı değil) ve Flex uygulaması flash.mydomain.com'dan geliyor (CDN)

www.mydomain.com adresindeki bir crossdomain.xml dosyası:

<?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: Flex uygulamasının üretimde olduğu gibi flash.mydomain.com adresinden başvurulması için yerel ortamı değiştirmeyi denedim. Aynı sorunu yerel olarak da aldığım ortaya çıkıyor ... bu yüzden yukarıda gördüğüm crossdomain.xml dosyasına rağmen bir tür alan adı güvenlik sorunu var gibi görünüyor. Crossdomain.xml adresimde bir şeyi değiştirmem gerekiyor mu? Çalışmak için ExternalInterface.addCallback almam gereken ek bir şey var mı?

UPDATE 2: Çalıştırdım! Hem Security.allowDomain("*") hem de Security.allowInsecureDomain("*") yapmak zorunda kaldım. Flash.mydomain.com adresine ayarlanması sorunu çözmedi, bir joker koymam gerekiyordu. allowNetworking hiçbir etkisi olmamıştır. allowScriptAccess="always"'a ihtiyacım var, ama bunu daha önce aldım. Javascript'i ExternalInterface.call ile aramak sadece bu parametre ile kolayca çalışır. Ancak, ExternalInterface.addCallback numaralı telefondan bir geri arama eklemek, yukarıdaki joker karakterli Güvenlik yöntemlerini gerektirir.

+0

Crossdomain.xml önemli olmamalı:

fazla bilgi için, bakınız. html sunucunuzda mı yoksa html yerel mi ve swf uzaktan mı yükleniyor?Yerel olarak – greggreg

+0

, html ve flash, her ikisi de local.mydomain.com:8080 adresinden gelir. Uzaktan, html www.mydomain.com adresinden gelir ve flash.mydomain.com adresinden flaş gelir. Flaş konumunu lokal olarak flash.mydomain.com olarak değiştirdiğimde, aynı sorunu alıyorum, geri aramalar artık çalışmıyor. –

+0

Flex uygulamanızı gömerek, gelen HTML'deki allowScriptAccess parametresinin değeri nedir? –

cevap

2

SWF ve DOM arasındaki iletişim, çapraz etki alanı dosyası tarafından ele alınmaz. Flash içeriği ve gezgin arasında bu tür bir etkileşim, SWF'nizi sarmalayan html'ye allowScriptAccess ve allowNetworking etiketlerinin değerleriyle işlenir. SWF ve HTML aynı nitelikli etki alanından olmadığından

, sen hep için allowScriptAccess değerini belirlemek zorunda. Ancak dikkat edin, çünkü bu SWF'nize güvenilmeyen bir içerik yüklerseniz, DOM sayfasına da erişebilir ve muhtemelen kötü amaçlı şeyler yapar.

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

allowcriptaccess değerinim her zaman "her zaman" olarak ayarlandı. Ayrıca, ExternalInterface.call ("javascriptMethod", argüman); Flex uygulamasının javascript kodunu çağırmasına izin verir. ExternalInterface.callback yapmaz. –

+0

Tamam, Ardından addCallback kodunuzu deneyin/yakalayın ve atılan SecurotyError olup olmadığını öğrenin. –

+0

Şu an bütün bu linkleri okudum ve herşeyi denedim; allowScriptAccess = "her zaman" (daha önce vardı), allowNetworking = "all", Security.allowDomain ("*"), Security.allowInsecureDomain ("*") (iyi önlem için). Hiçbir şey işe yaramaz :( –

İlgili konular