2012-03-29 10 views
3

私のFlexアプリケーションはローカルSharedObjectを使用します。たとえば、プラグインのクラッシュのために、Flash Cookieの破損が発生しています。この場合、SharedObjects.getLocalは例外をスローします(#2006)。フレックス:破損したローカルSharedObjectからの復旧

私のクライアントは、アプリが正常に回復することを望んでいます。クッキーが破損している場合は、空のものに置き換える必要があります。

SharedObject.getLocalがSharedObjectのインスタンスを返さない場合、私はclear()を呼び出すことが何もありません。

このようなCookieを削除または置き換えるにはどうすればよいですか?

多くの感謝!

EDIT:

表示する多くのコードがありません - 私は地元のクッキーにアクセスし、私は簡単に例外をキャッチすることができます。しかし、私は例外をキャッチした後、どのように同じ場所に新しい共有オブジェクトを作成できますか?

try { 
    localStorage = SharedObject.getLocal("heywoodsApp"); 
} catch (err:Error) { 
     // what do I do here? 
} 

エラーは、Flash Cookieのバイナリコンテンツをエディタで損傷することで簡単に再現されます。

+0

+1については、私は解決策が何であるかを知っているわけではありません。プラグインのクラッシュを実行しているアプリは何ですか?コードを共有できますか?あなたは完全な例外を共有できますか? uncaughtExceptionイベントを使って新しいSharedObjectを作成できるのだろうか? – JeffryHouser

+0

このアプリは、企業の社内向けのビジネスデータを監視および分析するフロントエンドです。クラッシュはあまり一般的ではありませんが、Windowsのクラッシュに続いて破損したCookieが報告されています。ユーザーが技術的に熟練していないため、Flash Cookieをクリーンアップすることはできません。私がそれをすればもっと多くのお金を稼ぐ)、事件が繰り返されるならば、アプリがそれを行うということです。元のコメントにコードを入れます。 –

+0

@ThomasHeywoodあなたは何とかこの問題を解決しましたか?私はここで良い答えが表示されません:/ –

答えて

0

SharedObjectの長さをテストし、0の場合は再作成する必要があります。また、常にflushを使用してオブジェクトに書き込む必要があります。ここでは、我々のソフトウェアが起動された回数をカウントするために使用する機能です。

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(); 
    } 

} 

それは、オブジェクトが使用できない場合、それは自動的に再作成されることに注意することが重要です。それはSharedObjectsについての混乱する部分です。

私たちがやっているすべては、グローバル変数の宣言です:

public var usage:SharedObject; 

そしてINIT()関数でそれを呼び出す:それは存在しないなら

usage = SharedObject.getLocal("usage"); 

、それが作成されます。

+0

偉大なコードスニペットありがとう。残念ながら、それは私の問題を解決しません。 SharedObjectのインスタンスを取得することはありません(nullを代入する変数を表す)ので、length()(またはflush()など)を呼び出すことはありません。 –

+0

これで共有オブジェクトにアクセスしているときに例外が発生していますか? – Triode

+0

はい。私はSharedObject.getLocal( "myStorage")を呼び出します。これはRangeErrorをスローします。これは、getLocalがFlash Cookieを検出してもそれを取得できない場合の動作です。ですから、私はSharedObjectのインスタンスを使用することはできません。 –

0

私は本当にあなたが範囲エラーを取得しているとは思っていません。このようなことに対する私の唯一の推測は、クロスドメインポリシーに関して境界を越える可能性があることです。 IT部門がサーバーのホストを制御していると仮定すると、サブドメインが変更された場合やアクセスタイプ(標準からhttps)の場合でも、特にアプリケーションが進行中(複数のリリースを経ている場合)に問題が発生する可能性があります。私は、別のアプリケーション(本質的に名前の衝突)によって既に名前が付けられた名前付きのSOを取得しようとしていると信じるのはむしろ難しいでしょう。これに関して、私たちの多くは、これらのことについても、依然として逆DNSスタイルの命名規則を使用しています。

エラーをキャッチすることができる場合は、比較的簡単に回復する必要があります。 - 変数をtryの範囲外に宣言するだけで、キャッチすることも可能です。静的メソッドなので、新しい識別子で本質的にやり直すために、後置式を作成する必要があります。

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. 
} 
関連する問題