본문 바로가기

Flex

ExternalInterface 기본기


ExternalInterface는 swf 파일을 싸고 있는 컨테이너 html 의 자바스크립트와 통신하기 위한 인터페이스 입니다.

ExternalInterface.call을 사용해서 html에 있는 자바스크립트 함수를 실행 시킬수 있고
ExternalInterface.callback을 사용해서 자바스크립트에서 SWF의 함수를 실행시킬수 있습니다.

이전 AS 2.0 에서는 fscommand()가 자바스크립트와의 통신에 사용되었는데 Player 9 버전 이후에는 Externalinterface를 사용하도록 권장하고 있습니다.

html과 함께 사용되는 것이기 때문에 swf만 실행시키거나 stand alone player에서 실행시키면 디버그 창을 만날수있습니다.

ExternalInterface가 중요한 이유가 C# 등 윈도우프로그램을 사용할경우 C#이 플레이어 api를 가지고 ExternalInterface를 구현해 놓으면 SWF와 윈도우 프로그램간의 통신 프로토콜로도 사용할수 있습니다.

addCallback(functionName:String, closure:Function):void
[정적] 컨테이너로부터 호출 가능하도록 ActionScript 메서드를 등록합니다.

functionName은 자바스크립트에서 플레시로 호출할때의 이름입니다. closure는 해당 이름을 플레시플레이어가 받았을때 호출할 함수 입니다.

addCallback 에서 String으로 키워드를 받고 그것에 closure에서 정의된 함수를 호출하는 구조이기 때문에 callback 에서 자바스크립트가 부르는 함수는 실제로 swf의 함수 이름이 아닐수도 있습니다.

콜백을 등록하기 전에 ExternalInterface.available을 사용해서 swf를 싸고 있는 컨테이너가 ExternalInterface를 지원 하는지 확인 후에 등록하는 것이 좋습니다.

call(functionName:String, ... arguments):*
[정적] 0개 이상의 인수를 전달하는 Flash Player 컨테이너에 의해 노출된 함수를 호출합니다.

call 함수는 자바스크립트의 함수 이름을 직접 지정하게 됩니다.
call 에서 부르는 함수는 실제 자바스크립트 함수의 이름이어야 합니다.

ExternalInterface.call 함수가 유용한 이유는 자바스크립트 함수를 단지 호출하는게 문제가 아니라 함수 실행 위치가 컨테이너로 옮겨간다는데 있습니다.

무슨소리냐 하면. functionName이 꼭 이름만 호출해야 할 필요가 없다는거죠. 저기에 html상에서 실행될수 있는 자바스크립트 함수가 직접 들어갈수 있습니다.

ExternalInterface.call("window.alert('아싸~')");
이렇게 하게 되면 Flex의 Alert 함수가 아닌 윈도우얼럿이 뜨게 됩니다.

Flex에서 IFrame 컴포넌트를 사용한다거나 하게 되면. 레이어가 플렉스보다 위쪽에 생기게 되어서 Flex Alert을 사용하게 되면 알람메시지가 IFrame컴포넌트보다 하위에 나와서 보이지 않게 되는데 이럴때 유용하게 사용할 수 있습니다.

자바스크립트 정리된 사이트가 갑자기 필요하게 되는 순간입니다.. -ㅅ-;;;

기본적인 내용은 여기서 마치고 다음 글에서 실제 이걸로 활용할수 있는 것들에 대해서 써보겠습니다.
ExternalInterface의 예제 들은 검색에 쳐보면 많이 나오기 때문에 패스 하도록 하겠습니다.

더큰 이유는 제가 이글을 쓰고있는곳이 파일첨부가 안됩니다..
보안프로그램과 방화벽때문에.. ㅠㅠ
부득이하게 이번 글은 예제 파일은 없이 갑니다 -ㅅ-~

Tip.

ExternalInterface는 동기로 동작하게 됩니다. 일반적인 플렉스 처럼 비동기가 아니고 콜백을 받거나 call을 하게 되면 플렉스함수가 실행되지 않고 멈추게 됩니다.
위에서 나온 alert을 띄우는것을 가지고 테스트 해보시면 됩니다.
Alert이 뜨는 순간 그 다음에 있는 플렉스 함수들은 실행되지 않습니다.

call을 호출하고 그 결과를 받을때에도 이벤트방식으로 동작하지 않기 때문에 결과가 올때까지 swf는 멈춰있게 됩니다. 테스트 해보시고 적용하실때 고민해서 적용하시는것이 자잘한 버그를 생산하지 않는 원동력이 됩니다..

다음 포스트에서는 응용편을 써볼까 합니다. 그럼..~