2012-03-29 3 views
3

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

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

Проблема заключается в том, что если 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, и поскольку пользователи не обладают техническими знаниями, достаточными для очистки своих файлов cookie Flash, клиент сделал запрос на функцию (т.е. я получите больше денег, если я это сделаю), что приложение делает это для них, если инцидент повторяется. Я поставлю код в исходный комментарий. –

+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; 

И затем вызвать его в функции инициализации():

usage = SharedObject.getLocal("usage"); 

Если ее нет, то он будет создаваться.

+0

Спасибо за отличный фрагмент кода. К сожалению, это не решает мою проблему. Я никогда не получаю экземпляр SharedObject (переменная, представляющая его, получает значение null), поэтому не нужно вызывать length() (или flush() и т. Д.). –

+0

хорошо, так что вы получаете исключение при доступе к общему объекту? – Triode

+0

Да. Я вызываю SharedObject.getLocal («myStorage»), который выдает RangeError, ожидаемое поведение, когда getLocal находит Flash-файл cookie, но не может его получить. Поэтому я не получаю экземпляр SharedObject для работы. –

0

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

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

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. 
} 
Смежные вопросы