2

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

我该怎么做呢?

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

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

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

4

3 回答 3

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');
        }
    }
}
于 2010-08-29T12:55:00.983 回答
1

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

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

于 2009-06-04T06:16:06.727 回答
0

注意,LocalConnection 有一个错误 http://k2xl.com/wordpress/2011/04/30/localconnection-bug-in-flash-player/

于 2011-04-30T16:55:47.377 回答