Flex: восстановление из поврежденного локального SharedObject - PullRequest
3 голосов
/ 29 марта 2012

В приложении My Flex используются локальные объекты SharedObject.Были случаи, когда Flash-файл испортился, например, из-за сбоя плагина.В этом случае SharedObjects.getLocal сгенерирует исключение (# 2006).

Мой клиент хочет, чтобы приложение корректно восстановилось: если файл cookie поврежден, я должен заменить его на пустой.

Проблема в том, что если SharedObject.getLocal не возвращает экземпляр SharedObject, мне нечего вызывать clear ().

Как я могу удалить или заменить такой файл cookie?

Большое спасибо!

РЕДАКТИРОВАТЬ:

Не так много кода, чтобы показать - я получаю доступ к локальному куки, и я могу легко поймать исключение.Но как я могу создать свежий общий объект в том же месте, как только я поймал исключение?

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

Ошибка легко воспроизводится повреждением двоичного содержимого файла cookie Flash с помощью редактора.

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Я не совсем уверен, почему вы получите ошибку диапазона - особенно если вы сообщите, что можете ее найти.Мое единственное предположение для чего-то подобного - возможность пересечения границ в отношении междоменной политики.Предполагая, что ИТ-отдел контролирует место размещения сервера, если субдомен когда-либо менялся или даже тип доступа (со стандартного на https), это может вызвать проблемы, особенно если приложение работает (прошло несколько выпусков).Мне было бы довольно трудно поверить, что вы пытаетесь получить именованный SO, который уже был назван другим приложением - по сути, конфликт имен.В связи с этим многие из нас до сих пор используют соглашение об именах в стиле обратного DNS даже в этих случаях.

Если вы можете обнаружить ошибку, ее восстановление будет относительно тривиально: - просто объявите переменную вне области действияпопытаться, так что это также можно поймать.[править]: Так как это статический метод, вам может понадобиться создать постфикс, чтобы начать все сначала с новым идентификатором.

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.
}
0 голосов
/ 29 марта 2012

Вам необходимо проверить длину 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");

Если ее неттогда это будет создано.

...