Uso della classe ExternalInterface

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

La comunicazione tra ActionScript e l'applicazione contenitore può avere uno dei due formati seguenti: ActionScript è in grado di chiamare il codice (ad esempio, una funzione JavaScript) definito nel contenitore, oppure il codice nel contenitore può chiamare una funzione ActionScript che è stata progettata per essere chiamabile. In entrambi i casi, le informazioni possono essere inviate al codice chiamato e i risultati possono essere restituiti al codice che ha effettuato la chiamata.

Per facilitare questa comunicazione, la classe ExternalInterface include due proprietà statiche e due metodi statici. Queste proprietà e questi metodi servono per ottenere informazioni sulla connessione all'interfaccia esterna, per eseguire il codice nel contenitore da ActionScript e per rendere le funzioni ActionScript disponibili alle chiamate effettuate dal contenitore.

Accesso alle informazioni sul contenitore esterno

La proprietà ExternalInterface.available indica se la versione corrente di Flash Player si trova in un contenitore dotato di interfaccia esterna. Se l'interfaccia esterna è disponibile, questa proprietà è true ; in caso contrario, è false . Prima di utilizzare qualunque altra funzionalità della classe ExternalInterface, verificate sempre che il contenitore corrente supporti la comunicazione con l'interfaccia esterna nel modo seguente:

if (ExternalInterface.available) 
{ 
    // Perform ExternalInterface method calls here. 
}
Nota: la proprietà ExternalInterface.available segnala se il contenitore corrente è di un tipo che supporta la connettività ExternalInterface. Non indica se JavaScript è abilitato nel browser corrente.

La proprietà ExternalInterface.objectID consente di determinare l'identificatore univoco per l'istanza di Flash Player (nello specifico, l'attributo id del tag object in Internet Explorer o l'attributo name del tag embed nei browser che utilizzano l'interfaccia NPRuntime). Questo identificatore univoco rappresenta il documento SWF corrente nel browser e può essere utilizzato per fare riferimento al documento SWF (ad esempio, quando si chiama una funzione JavaScript in una pagina HTML contenitore). Quando il contenitore di Flash Player non è un browser Web, questa proprietà è null .

Chiamate al codice esterno da ActionScript

Il metodo ExternalInterface.call() esegue il codice nell'applicazione contenitore. Richiede almeno un parametro, ovvero una stringa che contiene il nome della funzione da chiamare nell'applicazione contenitore. Tutti gli eventuali parametri aggiuntivi passati al metodo ExternalInterface.call() vengono passati al contenitore come parametri della chiamata alla funzione.

// calls the external function "addNumbers" 
// passing two parameters, and assigning that function's result 
// to the variable "result" 
var param1:uint = 3; 
var param2:uint = 7; 
var result:uint = ExternalInterface.call("addNumbers", param1, param2);

Se il contenitore è una pagina HTML, questo metodo chiama la funzione JavaScript con il nome specificato, che deve essere definita in un elemento script presente nella pagina HTML contenitore. Il valore restituito dalla funzione JavaScript viene ripassato ad ActionScript.

<script language="JavaScript"> 
    // adds two numbers, and sends the result back to ActionScript 
    function addNumbers(num1, num2) 
    { 
        return (num1 + num2); 
    } 
</script>

Se il contenitore è un altro contenitore ActiveX, questo metodo fa in modo che il controllo ActiveX di Flash Player invii il proprio evento FlashCall . Il nome di funzione specificato e tutti gli eventuali parametri vengono serializzati in una stringa XML da Flash Player. Il contenitore può accedere a queste informazioni nella proprietà request dell'oggetto evento e utilizzarle per determinare come eseguire il proprio codice. Per restituire un valore ad ActionScript, il codice del contenitore chiama il metodo SetReturnValue() dell'oggetto ActiveX, passando il risultato (serializzato in una stringa XML) come parametro di tale metodo. Per ulteriori informazioni sul formato XML utilizzato per questa comunicazione, vedete la sezione Il formato XML dell'API esterna .

Se il contenitore è un browser Web o un altro contenitore ActiveX, se la chiamata non riesce o se il metodo container non specifica un valore da restituire, viene restituito null . Il metodo ExternalInterface.call() genera un'eccezione SecurityError se l'ambiente contenitore appartiene a una funzione di sicurezza sandbox a cui il codice chiamante non ha accesso. Per ovviare a questo inconveniente, potete impostare un valore adeguato per allowScriptAccess nell'ambiente contenitore. Per modificare, ad esempio, il valore di allowScriptAccess in una pagina HTML, potete modificare l'attributo appropriato nei tag object ed embed .

Chiamate al codice ActionScript dal contenitore

Un contenitore può chiamare esclusivamente il codice ActionScript presente in una funzione. Per chiamare una funzione ActionScript dall'applicazione contenitore, è necessario eseguire due operazioni: registrare la funzione con la classe ExternalInterface, quindi chiamarla dal codice del contenitore.

Come prima cosa, è necessario registrare la funzione ActionScript per indicare che deve essere resa disponibile al contenitore. Utilizzate il metodo ExternalInterface.addCallback() nel modo indicato di seguito:

function callMe(name:String):String 
{ 
    return "busy signal"; 
} 
ExternalInterface.addCallback("myFunction", callMe);

Il metodo addCallback() accetta due parametri: il primo, un nome di funzione quale una stringa, è il nome con cui la funzione sarà conosciuta dal contenitore. Il secondo parametro è la funzione ActionScript vera e propria che verrà eseguita quando il contenitore chiama il nome di funzione definito. Dal momento che questi nomi sono distinti, potete specificare un nome di una funzione che verrà utilizzata dal contenitore, anche se l'effettiva funzione ActionScript ha un nome diverso. Si tratta di una possibilità particolarmente utile se non si conosce il nome della funzione (ad esempio, se viene specificata una funzione anonima o se la funzione da chiamare viene determinata in fase di runtime).

Una volta che una funzione ActionScript è stata registrata con la classe ExternalInterface, il contenitore può chiamarla. Ciò può avvenire in diversi modi, a seconda del tipo di contenitore. Nel codice JavaScript in un browser Web, ad esempio, la funzione ActionScript viene chiamata utilizzando il nome della funzione registrata come se si trattasse di un metodo dell'oggetto browser Flash Player (ovvero, un metodo dell'oggetto JavaScript che rappresenta il tag object o embed ). In altre parole, vengono passati i parametri e viene restituito un risultato come se venisse chiamata una funzione locale.

<script language="JavaScript"> 
    // callResult gets the value "busy signal" 
    var callResult = flashObject.myFunction("my name"); 
</script> 
... 
<object id="flashObject"...> 
    ... 
    <embed name="flashObject".../> 
</object>

In alternativa, quando chiamate una funzione ActionScript in un file SWF in esecuzione in un'applicazione desktop, il nome della funzione registrata e tutti gli eventuali parametri devono essere serializzati in una stringa in formato XML. Quindi, la chiamata viene eseguita realmente chiamando il metodo CallFunction() del controllo ActiveX con la stringa XML come parametro. Per ulteriori informazioni sul formato XML utilizzato per questa comunicazione, vedete la sezione Il formato XML dell'API esterna .

In entrambi i casi, il valore restituito dalla funzione ActionScript viene ripassato al codice del contenitore, sia direttamente sotto forma di valore quando il chiamante è il codice JavaScript in un browser sia serializzato come stringa in formato XML quando il chiamante è un contenitore ActiveX.

Il formato XML dell'API esterna

La comunicazione tra ActionScript e un'applicazione che contiene il controllo ActiveX di Shockwave Flash utilizza un formato XML specifico per codificare le chiamate alle funzioni e i valori. Il formato XML utilizzato dall'API esterna è suddiviso in due parti. Un formato viene utilizzato per rappresentare le chiamate alle funzioni. Un altro viene utilizzato per rappresentare i singoli valori; questo formato viene utilizzato per i parametri nelle funzioni, nonché per i valori restituiti da queste ultime. Il formato XML per le chiamate alle funzioni viene utilizzato per le chiamate verso e da ActionScript. Per una chiamata a una funzione proveniente da ActionScript, Flash Player passa l'XML al contenitore; per una chiamata proveniente dal contenitore, Flash Player prevede che l'applicazione contenitore passi una stringa XML in questo formato. Il frammento XML seguente mostra un esempio di chiamata a una funzione in formato XML:

<invoke name="functionName" returntype="xml"> 
    <arguments> 
        ... (individual argument values) 
    </arguments> 
</invoke>

Il nodo radice è il nodo invoke e ha due attributi: name indica il nome della funzione da chiamare, mentre returntype è sempre xml . Se la chiamata alla funzione comprende dei parametri, il nodo invoke ha un nodo arguments secondario, i cui nodi secondari sono costituiti dai valori di parametro formattati utilizzando il formato dei singoli valori illustrato di seguito.

I singoli valori, compresi i parametri della funzione e i valori da essa restituiti, utilizzano uno schema di formattazione che oltre ai valori effettivi include le informazioni sul tipo di dati. L'elenco seguente illustra le classi ActionScript e il formato XML utilizzato per codificare i valori per tale tipo di dati:

Classe/valore ActionScript

Classe/valore C#

Formato

Commenti

null

null

<null/>

Boolean true

bool true

<true/>

Boolean false

bool false

<false/>

String

string

<string>valore stringa</string>

Number, int, uint

single, double, int, uint

<number>27.5</number> 
<number>-12</number>

Array (gli elementi possono essere di tipi diversi)

Una raccolta che consente l'uso di elementi di tipi diversi, quale ArrayList oppure object[]

<array> 
    <property id="0"> 
        <number>27.5</number> 
    </property> 
    <property id="1"> 
        <string>Hello there!</string> 
    </property> 
    ... 
</array>

Il nodo property definisce i singoli elementi, mentre l'attributo id è l'indice numerico a base zero.

Object

Un dizionario con chiavi in formato stringa e valori oggetto, quale HashTable con chiavi in formato stringa

<object> 
    <property id="name"> 
        <string>John Doe</string> 
    </property> 
    <property id="age"> 
        <string>33</string> 
    </property> 
    ... 
</object>

Il nodo property definisce le singole proprietà, mentre l'attributo id è il nome della proprietà (una stringa).

Altre classi incorporate o personalizzate

<null/> or  
<object></object>

ActionScript codifica gli altri oggetti come null o come un oggetto vuoto. In entrambi i casi, qualunque valore di proprietà va perso.

Nota: a titolo di esempio, oltre alle classi ActionScript questa tabella mostra le classi C# equivalenti; tuttavia, l'API esterna può essere utilizzata per comunicare con qualunque linguaggio di programmazione o ambiente di runtime che supporti i controlli ActiveX e non si limita alle applicazioni C#.

Quando si creano applicazioni che utilizzano l'API esterna con un'applicazione contenitore ActiveX, probabilmente è più comodo scrivere un proxy che esegua l'operazione di conversione delle chiamate alle funzioni native nel formato XML serializzato. Per un esempio di una classe proxy scritta in C#, vedete Funzionamento della classe ExternalInterfaceProxy.