Обеспечение открытия только одного экземпляра SWF?

Мне нужно убедиться, что на компьютере одновременно открыт только один экземпляр SWF, будь то в двух окнах браузера или в двух разных браузерах.

Как я могу это сделать?

До сих пор я думал о двух возможных решениях:

1) Использование общего объекта Flash - но, поскольку срок их действия не истекает, если пользователь закроет окно браузера, не вызвав мою функцию выхода для его удаления, оставшийся объект будет мешать другим новым сеансам. (Возможно, случайное число и отметка времени для идентификации экземпляра?)

2) Использование локального соединения - немного хакерское, это зависит от того, что swf определяет, используется ли объект Localconnection, и не загружает, если это так. Но localconnections, кажется, падает при малейшей провокации, поэтому я немного опасаюсь его использовать.


person futureelite7    schedule 04.06.2009    source источник
comment
Просто интересно, зачем вам это нужно?   -  person user1686    schedule 04.06.2009
comment
на какую версию плеера ориентируетесь?   -  person back2dos    schedule 05.06.2009


Ответы (3)


Я считаю, что у 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');
        }
    }
}
person Hrundik    schedule 29.08.2010

Если SWF доступен только из одного места, я думаю, что общие объекты — это беспроигрышный вариант. Я не думаю, что нужно беспокоиться о сложных сеансах, должно быть событие выключения, которое вы можете поймать, даже когда браузер закрыт вручную. (Даже если это не так, я на 99% уверен, что SO сбрасываются при завершении работы, несмотря ни на что, поэтому должен быть возможен какой-то обходной путь.)

Однако общие объекты неразрывно связаны с расположением SWF-файла, поэтому пользователь может обойти описанный выше метод, просмотрев вторую копию SWF-файла, сохраненную локально, загруженную на другой веб-сервер или что-то еще. Если вас это беспокоит, и если SWF все еще будет работать в такой ситуации, то я думаю, что LocalConnection — ваш единственный выбор. Но я никогда не считал LC очень надежным. Я не знаю, можно ли сделать его пуленепробиваемым, но я думаю, что это единственный другой вариант.

person fenomas    schedule 04.06.2009
comment
Я не уверен, что флешки для разных браузеров вообще имеют свои SO в одном и том же месте. Так что это может не сработать. - person grapefrukt; 04.06.2009
comment
Все флеш-плееры хранят свои SO в одном и том же месте. - person fenomas; 04.06.2009
comment
Отличный ответ. Мой друг в настоящее время пытается реализовать это в своей Flash-игре. Если вы не возражаете, не могли бы вы опубликовать более подробную информацию о методе SO? Некоторые указания, образцы рабочего кода или ссылки были бы кстати. - person andyk; 24.08.2010

Обратите внимание, что существует ошибка с LocalConnection http://k2xl.com/wordpress/2011/04/30/localconnection-bug-in-flash-player/

person K2xL    schedule 30.04.2011
comment
Пожалуйста, не могли бы вы подвести итог своей записи в блоге, а также вы сказали, что Adobe ответила и сказала, что это сделано по замыслу, так что это не ошибка, не так ли? - person Kev; 15.06.2011