27. Gli SharedObject

In questa lezione vedremo cosa sono gli SharedObject e come utilizzarli in locale come dei tradizionali cookie.

Gli SharedObject possono essere usati anche in remoto con tecnologie come Flash Media Server (ex Flash Communication Server) o Red5, ma non sarà argomento di questa guida.

Per sfruttare questo utile strumento ci occorrono solamente due classi :

  • SharedObject - Classe di base per memorizzare dati negli SharedObject.
  • SharedObjectFlushStatus - Collezione di costanti per il valore restituito dal metodo flush della classe SharedObject.

Per rendere la nostra applicazione più robusta, effettueremo anche dei controlli per verificare che l'utente non abbia disabilitato la memorizzazione dei dati locali, e che ci sia inoltre lo spazio su disco sufficiente per scrivere i nostri dati.

L'utente può decidere quanto spazio può avere Flash Player per memorizzare questi dati, cliccando di destro su un filmato Flash e scegliendo poi la voce "Impostazioni..." come mostrato in questa schermata.

Prima di introdurre il codice vero e proprio, passiamo velocemente in rassegna i metodi e le proprietà che ci interessano :

  • getLocal() - E' un metodo statico che ci consente di inizializzare un'istanza di SharedObject da utilizzare per leggere i dati.
    Se non viene trovato lo SharedObject specificato allora prova a crearne uno.
  • data - E' la proprietà attraverso cui ci è possibile memorizzare dei valori nel nostro SharedObject. Non è possibile assegnare dei valori direttamente alla proprietà data, ma essendo un oggetto dinamico è possibile aggiungervi delle nuove proprietà a cui assegnare poi i nostri dati.
  • flush() - Scrive i dati su disco restituendo dei valori per verificare se la scrittura è avvenuta con successo.

Il sorgente che segue è un'applicazione che tenta di creare uno SharedObject di nome "lastclick", nel momento in cui l'utente clicca sul pulsante "Cookie", memorizzando la data e l'ora in cui è avvenuto il click.
Chiudendo e riaprendo il filmato si potrà notare che effettivamente il Flash Player ha memorizzato il dato per renderlo disponibile anche dopo la chiusura dell'applicazione.

package
{
	import fl.controls.Button;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;

	import flash.events.MouseEvent;
	import flash.display.MovieClip;

	import flash.net.SharedObject;
	import flash.net.SharedObjectFlushStatus;

	public class HelloWorld extends MovieClip
	{
		private var button:Button;
		private var info:TextField;
		private var format:TextFormat;
		private var cookie:SharedObject;

		public function HelloWorld():void
		{
			this.cookie = SharedObject.getLocal("lastclick");
			this.format = new TextFormat("Verdana", 10, 0x000000);
			this.format.align = TextFormatAlign.CENTER;

			this.info = new TextField();
			this.info.x = 10;
			this.info.y = 10;
			this.info.width = 230;
			this.info.height = 16;
			this.info.border = true;
			this.info.defaultTextFormat = this.format;
			this.info.text = (this.cookie.size > 0) ? this.cookie.data.click : "Mai cliccato";

			this.button = new Button();
			this.button.label = "Cookie";
			this.button.width = 70;
			this.button.height = 20;
			this.button.move(10, 35);

			this.button.addEventListener(MouseEvent.CLICK, this.setSO);

			this.addChild(this.info);
			this.addChild(this.button);
		}

		private function setSO(evt:MouseEvent):void
		{
			var adesso:Date = new Date();
			this.cookie.data.click = new String(adesso.getDate());
			this.cookie.data.click += "/" + (adesso.getMonth() + 1);
			this.cookie.data.click += "/" + adesso.getFullYear();
			this.cookie.data.click += " - " + adesso.getHours();
			this.cookie.data.click += ":" + adesso.getMinutes();
			this.cookie.data.click += ":" + adesso.getSeconds();

			try
			{
				var flushed:String = new String(this.cookie.flush());

				switch (flushed)
				{
					case SharedObjectFlushStatus.PENDING :
						this.info.text = "Spazio insufficiente";
						break;
					case SharedObjectFlushStatus.FLUSHED :
						this.info.text = this.cookie.data.click;
						break;
					default : this.info.text = "Errore imprevisto";
				}
			}
			catch (err:Error)
			{ this.info.text = "SharedObject disabilitati"; }
		}
	}
}

Come si può notare dal codice, se il metodo flush fallisce nella scrittura solleva un'eccezione di tipo Error, mentre se lo spazio è insufficiente ritorna semplicemente il valore che corrisponde alla costante SharedObjectFlushStatus.PENDING.

Nota : per compilare con successo il codice soprastante, è necessario aggiungere il componente Button alla libreria del filmato Flash.

Pannello Impostazioni

L'esempio precedente è stato creato a scopo didattico, non rappresenta effettivamente una situazione di applicazione reale.
Considerando che la maggior parte dell'utenza non ha mai aperto il pannello Impostazioni del Flash Player e non ha idea di cosa sia uno SharedObject, sarà senzaltro più utile aprire automaticamente il pannello piuttosto che riportare il freddo messaggio "Spazio insufficiente".

Per procedere ci serviranno due nuove classi :

  • Security - Collezione di costanti e metodi statici.
  • SecurityPanel - Collezione di costanti.

Ci basterà utilizzare il metodo statico showSettings, il quale ci consentirà di aprire il pannello impostazioni desiderato specificando la rispettiva costante della classe SecurityPanel.

// ...
Security.showSettings(SecurityPanel.LOCAL_STORAGE);