确保只有一个SWF实例打开?

时间:2009-06-04 02:58:45

标签: flash instance multiple-instances

我需要确保计算机上一次只打开一个SWF实例,无论是在2个浏览器窗口还是两个不同的浏览器中。

我该怎么做呢?

到目前为止,我已经想到了两个可能的解决方案:

1)使用Flash共享对象 - 但由于它们永不过期,如果用户关闭浏览器窗口而不调用我的退出函数将其删除,则剩余对象将干扰其他新会话。 (也许是一个随机数字和时间戳来标识实例?)

2)使用localconnection - 有点hackish,这依赖于swf检测是否正在使用Localconnection对象,如果是这种情况则不加载。但局部连接似乎在最轻微的挑衅下崩溃,所以我对使用它有点警惕。

3 个答案:

答案 0 :(得分:2)

我相信LocalConnection对SharedObject解决方案有一个优势 - 它允许全局范围的LocalConnection名称,但据我所知,本地SharedObjects总是按域存储。

对于SharedObject,唯一的选择是在其中定期更新时间戳,并在每次运行.swf时进行检查。

所以我选择了一个简单的基于LocalConnection的解决方案,因为它非常简单,我从未遇到任何LocalConnection问题。

public class LCTest extends Sprite
{
    public function LCTest()
    {
        var lc:LocalConnection = new LocalConnection();
        lc.allowDomain("*");
        try
        {
            lc.connect("_myLCLock"); // underscore for global scope
            trace('not running, can init');
        }
        catch (e:ArgumentError)
        {
            trace('already running');
        }
    }
}

答案 1 :(得分:1)

如果只能从一个位置获得SWF,我认为共享对象是一个安全的选择。我认为没有必要担心复杂的会话,即使手动关闭浏览器,也应该有一个关闭事件。 (即使没有,我99%肯定在关机时刷新SO,无论如何,所以应该可以采取一些解决方法。)

但是,共享对象本质上与SWF的位置相关联,因此用户可以通过查看他们已在本地保存的SWF的第二个副本,或上传到其他Web服务器等,来回避上述方法。如果这是一个担心,如果SWF仍然可以在这种情况下工作,那么我认为LocalConnection是你唯一的选择。但我从未发现LC也非常可靠。我不知道它是否可以防弹,但我认为这是唯一的其他选择。

答案 2 :(得分:0)