2012-03-29 9 views
3

Meine Flex-App verwendet lokale SharedObjects. Es gab Fälle, in denen der Flash-Cookie aufgrund eines Absturzes des Plugins beschädigt wurde. In diesem Fall löst SharedObjects.getLocal eine Ausnahme aus (# 2006).Flex: Wiederherstellung von einem beschädigten lokalen SharedObject

Mein Client möchte, dass die App ordnungsgemäß wiederhergestellt wird: Wenn das Cookie beschädigt ist, sollte ich es durch ein leeres ersetzen.

Das Problem ist, wenn SharedObject.getLocal keine Instanz von SharedObject zurückgibt, habe ich nichts, um clear() anzurufen.

Wie kann ich einen solchen Cookie löschen oder ersetzen?

Vielen Dank!

EDIT:

Es gibt nicht viel Code zu erhalten - ich das lokale Cookie zugreifen, und ich kann einfach die Ausnahme abfangen. Aber wie kann ich ein neues gemeinsames Objekt am gleichen Ort erstellen, nachdem ich die Ausnahme abgefangen habe?

Der Fehler wird leicht reproduziert, indem der binäre Inhalt eines Flash-Cookies mit einem Editor beschädigt wird.

+0

+1 für die Frage; aber ich habe keine Ahnung, was die Lösung ist. Was macht Ihre App, dass Plugin-Abstürze alltäglich sind? Kannst du Code teilen? Können Sie die vollständige Ausnahme teilen? Ich frage mich, ob Sie ein uncaughtException-Ereignis verwenden könnten, um ein brandneues SharedObject zu erstellen? – JeffryHouser

+0

Die App ist ein Frontend zur Überwachung und Analyse von Geschäftsdaten für die interne Nutzung eines Unternehmens. Abstürze sind nicht wirklich alltäglich, aber es gab einen Bericht über ein korruptes Cookie nach einem Windows - Absturz, und da die Benutzer nicht technisch genug sind, um ihre Flash - Cookies zu bereinigen, hat der Client eine Anfrage für ein Feature (dh ich bekomme mehr Geld, wenn ich es tue), dass die App es für sie tut, wenn sich der Vorfall wiederholt. Ich werde den Code in den ursprünglichen Kommentar einfügen. –

+0

@ThomasHeywood hast du dieses Problem irgendwie gelöst? Ich sehe hier keine gute Antwort:/ –

Antwort

0

Sie müssen für die Länge von SharedObject testen und neu erstellen, wenn es 0 ist. Verwenden Sie auch immer Flush, um auf das Objekt zu schreiben. Hier ist eine Funktion, die wir verwenden, um die Anzahl der Male zu zählen unsere Software gestartet wird:

private function usageNumber():void { 
    usage = SharedObject.getLocal("usage"); 

    if (usage.size > 0) { 
     var usageStr:String = usage.data.usage;  
     var usageNum:Number = parseInt(usageStr); 

     usageNum = usageNum + 1; 
     usageStr = usageNum.toString(); 

     usage.data.usage = usageStr; 
     usage.flush(); 

     countService.send(); 

    } else { 

     usage.data.usage = "1"; 
     usage.flush(); 

     countService.send(); 
    } 

} 

Es ist wichtig zu beachten, dass, wenn das Objekt nicht verfügbar ist, wird es automatisch neu erstellt werden. Das ist der verwirrende Teil von SharedObjects.

Alles, was wir tun, ist deklarieren die Variable global:

public var usage:SharedObject; 

Und dann ist es in der init() Funktion aufrufen:

usage = SharedObject.getLocal("usage"); 

Wenn es nicht vorhanden ist, dann wird es erstellt.

+0

Danke für das tolle Code-Snippet. Leider löst es mein Problem nicht. Ich bekomme nie eine Instanz von SharedObject (die Variable, die es darstellt, erhält null zugewiesen), also gibt es nichts, was man length() (oder flush(), usw.) aufrufen könnte. –

+0

okay, so erhalten Sie eine Ausnahme beim Zugriff auf das gemeinsame Objekt? – Triode

+0

Ja. Ich rufe SharedObject.getLocal ("myStorage") auf, was RangeError auslöst. Dies ist das erwartete Verhalten, wenn getLocal ein Flash-Cookie findet, es aber nicht abrufen kann. Daher erhalte ich keine Instanz von SharedObject, mit der ich arbeiten kann. –

0

Ich bin nicht wirklich sicher, warum Sie einen Bereichsfehler bekommen würden - vor allem wenn Sie berichten, dass er es finden kann. Meine einzige Vermutung für so etwas ist, dass es eine Möglichkeit gibt, Grenzen in Bezug auf die domänenübergreifende Richtlinie zu überschreiten. Unter der Annahme, dass die IT die Kontrolle darüber hat, wo der Server gehostet wird, ob sich die Subdomäne jemals geändert hat oder sogar vom Typ (von Standard zu https), kann dies zu Problemen führen, insbesondere wenn die Anwendung noch läuft. Ich würde es eher schwer finden zu glauben, dass Sie versuchen, eine benannte SO, die bereits von einer anderen Anwendung benannt wurde - im Wesentlichen eine Namenskollision. In dieser Hinsicht verwenden viele von uns immer noch die Reverse-DNS-Stil-Benennungskonvention selbst für diese Dinge.

Wenn Sie den Fehler abfangen können, sollte es relativ trivial sein, von wiederherzustellen: - Erklären Sie einfach die Variable außerhalb des Bereichs des Versuchs, so dass es zugänglich ist, um ebenso zu fangen. [edit]: Da es sich um eine statische Methode handelt, müssen Sie möglicherweise ein Postfix erstellen, um neu mit einem neuen Bezeichner zu beginnen.

var mySO:SharedObject; 
.... 
catch(e:Error) 
{ 
     mySO = SharedObject.getLocal('my.reversedns.so_name_temp_name'); 
     //might want to dispatch an error event or rethrow a specific exception 
     //to alert the user their "preferences" were reset. 
} 
Verwandte Themen