API Flash Player для расширения браузера

допустим, у нас есть P2P-многопользовательская игра на основе Flash, размещенная на веб-сайте. Можно ли было бы создать расширение для браузера, которое бы слушало, что происходит в приложении Flash? Например, я хотел бы знать, когда игрок подключается к комнате, получает кик или бан, или просто уходит сам. Извините, это не совсем конкретный вопрос, но мне нужно направление, чтобы начать. Заранее спасибо!


person user3233914    schedule 23.08.2014    source источник


Ответы (1)


Я вижу несколько способов связи между Flash и плагином браузера.

Один из них - открыть сокет для сервера, работающего на локальном компьютере. Из-за изолированной программной среды безопасности это может быть не самый простой подход, но, если возможно, это, конечно, тот, на который стоит пойти, потому что у вас уже есть код обработки сокета, и прослушивание / запись в дополнительный сокет не это ужасно сложно. Для этого подхода вам просто нужно, чтобы ваш плагин начал прослушивать сокет и заставить флеш-апплет подключиться к нему.

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

Другой способ, и я подозреваю, что это может оказаться более простым путем, - это обмен данными между Flash и JavaScript с помощью класса ExternalInterface, а затем от JavaScript к плагину. Пример Adobe IntrovertIM должен помочь вам начать работу, если вы можете найти копию в Интернете.

Во Flash создайте две функции: функцию jsToSwf(command:String, args:Array<String>):Dynamic для обработки входящих сообщений от JS, отправляемых этому обратному вызову, и функцию swfToJs(command:String, args:Array<String> = null):Dynamic, которая вызывает flash.external.ExternalInterface.call("swfToJs", command, args);.

Чтобы настроить его, вам нужно сделать что-то вроде:

if (flash.external.ExternalInterface.available) {
  flash.external.ExternalInterface.addCallback("jsToSwf", jsToSwf);
  swfToJs("IS JS READY?");
}

(Два параметра addCallback - это то, что функция вызывается в JS, и то, что она вызывается во Flash. Они не обязательно должны быть одним и тем же, но в некотором смысле имеет смысл, что они делают)

В JS вам понадобятся те же функции: function swfToJs(command, params) принимает команды и списки параметров из Flash; и jsToSwf(command, params) вызывает getSwf("Furcadia").jsToSwf(command, params);.

getSwf("name"), вероятно, должно быть примерно так:

/** Get ref to specified SWF file.
// Unfortunately, document.getElementById() doesn't
// work well with Flash Player/ExternalInterface. */
function getSwf(movieName) {
    result = '';
    if (navigator.appName.indexOf("Microsoft") != -1) {
        result = window[movieName];
    } else {
        result = document[movieName];
    }
    return result;
}

Единственная неприятная вещь - это то, что вам нужно немного пожать руку, чтобы убедиться, что все слушают. Итак, когда у вас есть готовый Flash, он вызывает swfToJs("IS JS READY?");, затем JS-сторону, получив эту команду, отвечает jsToSwf("JS IS READY!");, затем, получив ее, Flash подтверждает получение swfToJs("FLASH IS READY!");, и обе стороны устанавливают флаг, говорящий, что теперь они могут отправлять любые команды, которые они нравиться.

Итак, теперь у вас есть Flash, говорящий с JS. Но как JS взаимодействует с расширением браузера? И вы имеете в виду расширение или надстройку, раз уж есть разница! Что ж, это становится целой банкой червей, поскольку вы не указали, какой браузер.

Каждый браузер обрабатывает вещи по-разному. Например, в Mozilla есть _15 _ / _ 16_ и более старый postMessage() в качестве API для JS для взаимодействия с надстройками.

Тем не менее, я думаю, что ExternalInterface позволяет нам свести трудный вопрос (обмен сообщениями Flash-to-external-code) к гораздо более простому вопросу (сообщения Js-to-external-code).

person Dewi Morgan    schedule 24.08.2014