My Flex应用程序使用本地SharedObjects。曾经发生过Flash cookie被破坏的事件,例如,由于插件崩溃。在这种情况下,SharedObjects.getLocal将引发异常(#2006)。
我的客户希望应用程序能够正常恢复:如果cookie已损坏,我应该用空的cookie替换它。
问题是,如果SharedObject.getLocal没有返回SharedObject的实例,那么我就没有什么可调用的了。
如何删除或替换这样的cookie?
非常感谢!
编辑:
没有太多代码可以显示——我访问本地cookie,可以很容易地捕捉到异常。但是,一旦发现异常,我如何在同一位置创建新的共享对象?
try {
localStorage = SharedObject.getLocal("heywoodsApp");
} catch (err:Error) {
// what do I do here?
}
使用编辑器破坏Flash cookie的二进制内容很容易重现错误。
我真的不知道为什么你会得到一个范围错误-特别是如果你报告可以找到它。我唯一的猜测是,对于这样的事情,跨域策略有可能跨越边界。假设IT可以控制服务器的托管位置,如果子域甚至访问类型(从标准到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.
}
您需要测试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");
如果它不存在,那么它就会被创建。