Dwukierunkowa komunikacja FLASH i przeglądarka

Kiedy w artykule pisałem o tym, że do osadzonego klipa Flash’a (SWF) można przekazywać ID-sesji w dwojaki sposób: poprzez FlashVars lub ExternalInterface nie wspomniałem o tym, że komunikacja tą drugą metodą jest troszkę trudniejsza. Nie chcąc zaciemniać artykułu, nie dopowiedziałem o pewnych warunkach jakie trzeba spełnić, aby ten mechanizm zadziałał dobrze. Bardziej ambitnym może przyjdzie ochota na w pełni dwukierunkową komunikację.

Gdzie i jakie pojawiają się problemy przy użyciu ExternalInterface w AS3 (po stronie Flasha) ?

Otóż uruchomienie się SWF’a, a nawet przejście do dalszej niż 1-wsza klatka klipu, nie gwarantuje, że zawsze da się wywołać funkcje JavaScriptu, nawet jeśli z punktu widzenia osi czasu, została ona już zadeklarowana w bloku <script>.

Dokładnie analogiczny problem jest przy wywołaniu z poziomu JavaScript’u funkcji AS3 (udostępnionych na zewnątrz poprzez ExternalInterface.addCallback).

Aby komunikacja była możliwa obie strony muszą być gotowe.

Co to znaczy „obie strony muszą być gotowe” ?

1. Nie ma sensu próbować wywoływać czegokolwiek we Flashu z poziomu JavaScript’u przed zdarzeniem DomReady. Jest to zatem pierwszy warunek gotowości.

2. Żadne z wywołań funkcji JavaScrip’tu z poziomu Flash’a nie będzie poprawnie wykonane w 1-wszej klatce klipu (nigdy mi się to nie przytrafiło – z różnych przyczyn klatka 1’wsza klipu ma specjalne znaczenie – nie będę się tu rozpisywał na ten temat).

Jak poznać, że druga strona jest gotowa do komunikacji ?

Najlepiej niech sama nam to zakomunikuje, a my tylko odnotujemy ten fakt.

Skąd jednak dowiedzieć się, że wywołanie metody zdalnej powiodło się ?

Nie liczmy na wyjątki. Jeśli wywołanie metody zdalnej nie powiedzie się, to dostajemy wartość 0. Musimy tak zaprojektować nasz system wymiany informacji, aby móc rozróżniać stany poprawne od błędnych. Jednym z prostszych rozwiązań będzie przyjęcie, że wartości 0 nie mogą być zwracane przy normalnej pracy i każda funkcja zwraca wartość 1, gdy ok, a -1 gdy błąd.

Innym rozwiązaniem może być wprowadzenie sekwencyjnego tokena zaczynającego się od 1 i zwiększanego o 1 przy każdym wywołaniu metody zdalnej, a następnie odpytanie się strony zdalnej o ostatnio użyty token.

Wnioski

Dobrze wykonana komunikacja (w szczególności 2-kierunkowa) – nie jest zadaniem trywialnym. Zapewnienie jej stabilności wymaga pewnego nakładu pracy zarówno w JavaScript’cie jak i we Flashu.

Na szczęście mamy we Flash’u do dyspozycji przydatną klasę externalInterface, która w dość przyjemny i kulturalny sposób udostępni nasze funkcje na zewnątrz Flash’a.

Po stronie JavaScript w tym procesie na pewno wesprze nas np.: SwfObject, umożliwiając dynamiczne osadzenie klipu SWF w naszym HTML’u. Dzięki niemu otrzymamy możliwość asynchronicznego (dopiero po poprawnym wczytaniu obiektu SWF) wykonania inicjalizacji komunikacji do Flasha. Zapewne przyda się coś do periodycznego wywoływania metody/funkcji.

Ze względu na problem detekcji poprawności połączenia komunikacyjnego. obie strony muszą  prowadzić polling (odpytywać, przez próbę wywołania jakiejś zdalnej funkcji notyfikującą po drugiej stronie, aż do pierwszego sukcesu). Flash w tym czasie może wyświetlać komunikat o inicjalizacji i poruszać się w kółko przez kilka klatek. A JavaScript kiedy już będzie miał spełnione 3 warunki (DOMReady && SWF notified && SWF ready) może wywołać kolejną zdalną metodę np.: „run” która to dopiero uruchomi właściwą część aplikacji flashowej.

Przykład powyższy napisałem bazując na tym co z dumą przyznaję, że całkiem dobrze działa w serwisie „zyczeniadlaciebie.pl

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *