deguls 2008. 8. 22. 18:27
출처: http://blog.naver.com/zungm2?Redirect=Log&logNo=20045814168

ExternalInterface 클래스의 사용 Study...ing

2008/01/09 16:33

복사 http://blog.naver.com/zungm2/20045814168

  <<원문을 보시려면 클릭해 주세요. (http://flexdocs.kr/docs/flex2/docs/00001973.html)


ExternalInterface 클래스의 사용

ActionScript 와 컨테이너 어플리케이션과의 사이의 통신에는, 컨테이너로 정의된 코드 (JavaScript 함수등)를 ActionScript 로부터 호출하는 방법이라고 호출해 가능한 것 같게 설계된 ActionScript 함수를 컨테이너의 코드로부터 호출하는 방법의 2 종류의 형식이 있습니다. 어느 경우도, 불려 가는 측의 코드에 정보가 송신되어 그 결과가 호출해 옆코드에 돌려주어집니다.

이 통신을 용이하게 하기 위한(해), ExternalInterface 클래스에는 2 개의 정적 properties 와 2 개의 정적 메소드가 준비되어 있습니다. 이러한 properties 와 메소드는, 외부 인터페이스 접속에 관한 정보를 취득해, 컨테이너내의 코드를 ActionScript 로부터 실행해, 컨테이너로부터 ActionScript 함수를 호출할 수 있도록(듯이) 하기 위해서 사용됩니다.

부 주제

외부 컨테이너에 관한 정보의 취득
ActionScript 로부터의 외부 코드의 호출
컨테이너로부터의 ActionScript 코드의 호출

외부 컨테이너에 관한 정보의 취득

ExternalInterface.available properties 는, 현재의 Flash Player 를 포함하고 있는 컨테이너에 외부 인터페이스 기능이 있을지 어떨지를 나타냅니다. 외부 인터페이스가 제공되고 있는 경우, 이 properties 는 true 가 됩니다. 이용할 수 없는 경우에는 false 가 됩니다. ExternalInterface 클래스의 다른 기능을 사용하기 전에, 현재의 컨테이너에 대해 외부 인터페이스에 의한 통신이 지원(support)되고 있는지 어떤지를, 다음과 같이 해 반드시 확인해 주세요.

if (ExternalInterface.available) {
    // ExternalInterface 메소드를 여기서 실행한다
}

메모


ExternalInterface.available properties 로 확인할 수 있는 것은, 현재의 컨테이너가 ExternalInterface 접속을 지원(support)하는 타입인가 어떻게인가입니다. 현재 사용하고 있는 브라우저의 설정으로 JavaScript 가 유효화 되고 있을지 어떨지는 확인할 수 없습니다.

ExternalInterface.objectID properties 를 사용하면, Flash Player 인스턴스의 일의의 식별자 (특히, Internet Explorer 에 있어서의 <object> 태그의 id 속성이나, NPRuntime 인터페이스를 사용하는 브라우저에 있어서의 <embed> 태그의 name 속성)를 확인할 수 있습니다. 이 일의의 ID 는, 브라우저내의 현재의 SWF 문서를 나타내, SWF 문서를 참조하기 위해서 사용할 수 있습니다 (컨테이너 HTML 페이지내의 JavaScript 함수의 호출 등). Flash Player 컨테이너가 Web 브라우저가 아닌 경우, 이 properties 는 null 가 됩니다.

ActionScript 로부터의 외부 코드의 호출

ExternalInterface.call() 메소드에서는, 컨테이너 어플리케이션내의 코드가 실행됩니다. 파라미터는 최저 1 개 필요해, 컨테이너 어플리케이션내에서 불려 가는 함수의 이름을 포함한 string를 지정합니다. ExternalInterface.call() 메소드에게 건네진 추가 파라미터는, 함수 호출의 파라미터로서 컨테이너에게 건네집니다.

/* 외부 함수 "addNumbers" 를 호출해,
    2 개의 파라미터를 건네주어, 그 함수의 결과를
    변수 "result" 에 할당한다 */
var param1:uint = 3;
var param2:uint = 7;
var result:uint = ExternalInterface.call("addNumbers", param1, param2);

컨테이너가 HTML 페이지의 경우는, 지정된 이름의 JavaScript 함수가 이 메소드로 불려 가 그 이름은 그 포함된 HTML 페이지의 <script> 엘리먼트로 정의되고 있을 필요가 있습니다. JavaScript 함수의 반환값은 ActionScript 에 돌려주어집니다.

<script language="JavaScript">
    // 2 개의 수치를 가산해, 그 결과를 ActionScript 에 돌려준다
    function addNumbers(num1, num2) {
        return (num1 + num2);
    }
</script>

컨테이너가 그 이외의 ActiveX 컨테이너의 경우는, 이 메소드에 의해 Flash Player ActiveX 컨트롤로부터 그 FlashCall 이벤트가 송출(Dispatch)됩니다. 지정된 함수명과 파라미터는, Flash Player 에 의해 직렬화 되어 XML string가 됩니다. 컨테이너는, 이벤트 오브젝트의 request properties 로 그 정보에 액세스 해, 그것을 사용해 자신의 코드의 실행 방법을 판정할 수 있습니다. 값을 ActionScript 에 돌려주려면 , 컨테이너 코드로 ActiveX 오브젝트의 SetReturnValue() 메소드를 호출해, 그 결과 (시리얼화 된 XML string)를 메소드의 파라미터로서 건네줍니다. 이 통신으로 사용되는 XML 포맷의 상세한 것에 대하여는,External API 의 XML 포맷을 참조해 주세요.

컨테이너가 Web 브라우저에서도, 그 외의 ActiveX 컨테이너로도, 호출이 실패했을 경우나 컨테이너측의 메소드가 반환값을 돌려주지 않았던 경우는,null 가 돌려주어집니다. 호출측 코드에 의한 액세스가, 컨테이너 환경이 속하는 보안 Sandbox 에 의해 허가되어 있지 않은 경우,ExternalInterface.call() 메소드는 SecurityError 예외를 슬로우 합니다. 이 문제를 회피하려면 , 컨테이너 환경의 allowScriptAccess 에 적절한 값을 설정합니다. 예를 들어, HTML 페이지의 allowScriptAccess 의 값을 변경하려면 ,<object><embed> 태그의 해당하는 속성을 편집합니다.

컨테이너로부터의 ActionScript 코드의 호출

컨테이너가 호출할 수가 있는 것은 함수내의 ActionScript 코드만입니다. 그 이외의 ActionScript 코드는, 컨테이너로부터 호출할 수 없습니다. 컨테이너 어플리케이션으로부터 ActionScript 함수를 호출하려면 , 다음의 2 개를 실시할 필요가 있습니다. ExternalInterface 클래스에의 함수의 등록과 컨테이너의 코드로부터의 호출입니다.

최초로, ActionScript 함수를 등록해, 컨테이너로부터 사용 가능하게 하는 것을 나타낼 필요가 있습니다. ExternalInterface.addCallback() 메소드를 다음과 같이 사용합니다.

function callMe(name:String) :String {
    return "busy signal =) ";
}
ExternalInterface.addCallback("myFunction", callMe);

addCallback() 메소드에는 2 개의 파라미터가 있습니다. 1 개은 string의 함수명으로, 컨테이너는 그 이름으로 함수를 인식합니다. 이제(벌써) 1 개의 파라미터는 실제의 ActionScript 함수로, 정의된 함수명을 컨테이너가 호출하면 실행됩니다. 이러한 이름은 구별되기 (위해)때문에, 실제의 ActionScript 함수가 다른 이름이어도, 컨테이너로 사용되는 함수명을 지정할 수 있습니다. 이것은, 익명 함수가 지정되었을 경우나, 불려 가는 함수가 실행시로 결정되는 경우 등, 함수명이 불명한 경우에 매우 도움이 됩니다.

ActionScript 함수가 ExternalInterface 클래스에 등록되면, 컨테이너가 실제로 함수를 호출할 수 있게 됩니다. 그방법은, 컨테이너의 타입에 따라서 다릅니다. 예를 들어, Web 브라우저의 JavaScript 코드의 경우, ActionScript 함수는 Flash Player 브라우저 오브젝트의 메소드 (<object> 또는 <embed> 태그를 나타내는 JavaScript 오브젝트의 메소드)로부터, 등록된 함수명을 사용해 불려 갑니다. 즉, 파라미터가 건네받아 불려 간 로컬 함수로부터 결과가 돌려주어집니다.

<script language="JavaScript">
    // callResult gets the value "busy signal =) "
    var callResult = flashObject.myFunction("my name");
</script>
...
<object id="flashObject"...>
    ...
    <embed name="flashObject".../>
</object>

혹은, 포함하기 ActiveX 컨트롤을 실행하고 있는 SWF 파일의 함수를 호출할 때, 등록된 함수명 및 모든 파라미터가 직렬화 되어 XML 포맷 string가 될 필요가 있습니다. 그 후, ActiveX 컨트롤의 CallFunction() 메소드와 파라미터로서 XML string를 호출하는 것으로, 호출이 실제로 실행됩니다.

어느 경우도, ActionScript 함수의 반환값은 컨테이너 코드에 돌려주어집니다만, 호출측이 브라우저의 JavaScript 코드의 경우는 값으로 해서 직접 돌려주어져 호출측이 ActiveX 컨테이너의 경우는 XML 포맷 string로서 직렬화해 돌려주어집니다.