допустим, у нас есть P2P-многопользовательская игра на основе Flash, размещенная на веб-сайте. Можно ли было бы создать расширение для браузера, которое бы слушало, что происходит в приложении Flash? Например, я хотел бы знать, когда игрок подключается к комнате, получает кик или бан, или просто уходит сам. Извините, это не совсем конкретный вопрос, но мне нужно направление, чтобы начать. Заранее спасибо!
API Flash Player для расширения браузера
Ответы (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).