애플 이벤트

Apple event

Apple 이벤트는 Mac OS의 메시지 기반 프로세스 간 통신 메커니즘으로, 시스템 7에 처음 등장하며 그 이후 모든 버전의 Mac OS와 MacOS에서 지원됩니다.Apple 이벤트는 "문서 열기" 또는 "파일 인쇄"와 같은 "고급" 이벤트를 설명하지만, 이전 OS는 "클릭"과 "키 누르기"와 같은 훨씬 더 많은 기본 이벤트를 지원했습니다.Apple 이벤트는 Mac OS 스크립팅 시스템인 Open Script Architecture(AppleScript와 같은 주요 언어)의 기초를 형성합니다.

시작점은 AEDesc라고 하는 동적 유형의 확장 가능한 디스크립터 형식입니다. AEDesc는 데이터 유형을 지정하는 OSType 코드일 뿐이며 유형 의존형 데이터 블록입니다.예를 들어 OSType 코드inte는 데이터가 빅엔디안 형식의 4바이트 부호 있는 정수임을 나타냅니다.

다양한 일반적인 단순 유형에 대한 사전 정의된 유형 코드 외에, 두 가지 사전 정의된 구조화된 기술자 유형이 있다: 데이터 유형을 가진 AERecordreco(레코드) 및 타입이 있는 AEListlist(목록 또는 배열).AERecord는 또한 각 요소를 OSType인 고유한 레코드 필드 ID와 관련짓는다.Apple Event Manager는 이러한 구조를 구축하기 위한 API 호출을 제공하며 이러한 구조체의 콘텐츠를 추출하고 보유하고 있는 콘텐츠 유형을 쿼리합니다.

Apple Event Manager는 AEDesc를 데이터 유형 간에 변환하는 강제도 지원합니다.예를 들어 정수형과 실수형 사이에 표준 강제 외에 응용 프로그램은 사용자 지정 데이터 유형 간의 변환을 처리하는 자체 강제 핸들러 콜백을 설치할 수 있습니다.

Apple 이벤트는 이벤트 목적에 따라 필드가 있는 AERecord입니다.또한 Apple Event Manager에 의해 사전 정의된 세트와는 다른 속성(이벤트 파라미터로 불리고 있는 레코드 필드와는 다릅니다)이 있습니다.이벤트 클래스이벤트 ID를 통해 이벤트가 수행할 작업, 이벤트의 송신지 주소(로컬 또는 리모트머신상의 프로세스일 수 있음) 및 이벤트를 처리하기 위한 기타 다양한 옵션을 지정합니다.처음에 원격 머신은 AppleTalk를 통해 연결해야 했지만 Mac OS 9에서는 TCP/IP를 통한 연결 옵션이 추가되었습니다.

Apple 이벤트를 타겟프로세스에 송신하면, 송신 프로세스는 Apple 이벤트에 대한 응답을 수신하도록 선택할 수 있습니다.여기에는 성공/실패를 나타내는 오류 코드, 원래 이벤트에 의해 요청된 정보 및/또는 기타 적절한 정보를 포함하여 원래 이벤트의 처리에 대해 타깃에서 반환되는 다양한 비트의 정보가 포함될 수 있습니다.

Apple 이벤트는 AppleEvent Object Model의 기반이며, AppleEvent Object Model은 OSA와 AppleScript의 기반이 됩니다.2016년 현재, Apple Event Manager API의 공식 구현은 C++포함한 C와 그 후속 제품에서 가능합니다.Objective-C 및 Swift에 대한 공식 바인딩도 코코아 API를 통해 제공됩니다.비공식 바인딩은 Perl, UserTalk, Ruby, Python 등 다른 언어에도 존재합니다.

오브젝트 모델

AppleEvent Object Model(AEOM)은 AppleEvents 위에 구축된 프로토콜 집합으로, 이를 통해 기존 Mac OS와 MacOS에서 실행되는 애플리케이션이 서로의 기능을 제어할 수 있습니다.AEOM의 일부를 구현한 애플리케이션은 AppleScript를 통해 제어할 수 있기 때문에 스크립트 가능이라고 불렸습니다.안타깝게도 스크립터빌리티 지원은 기존 Mac OS의 역사를 통해 일관성이 없고 패치적인 상태로 남아 있었습니다.

AEOM은 응용 프로그램이 내부 객체를 게시할 수 있는 구문 계층을 제공하여 이러한 객체를 표준화된 방식으로 조작할 수 있도록 했습니다.ToolTalk와 같은 다른 비슷한 발음의 개념과는 달리, 명사와 동사 사이에는 분명한 직교적인 구분이 있었다. 따라서 "닫기 문서"와 "닫기 창"에 별도의 명령을 제공하는 대신, "문서" 또는 "창" 객체 또는 응용 프로그램이 게시하는 다른 객체를 참조할 수 있는 단일 "닫기" 동사가 있었다.광택이 났다.

응용 프로그램이 AEOM 지원을 통해 사용할 수 있도록 만든 개체는 계층 구조로 배열되었습니다.맨 위에는 Null 객체 기술자를 통해 참조되는 애플리케이션 자체가 있습니다.다른 개체는 부모 개체를 명시함으로써(반복적으로) 참조되었으며, AERecord에 수집된 부모 개체의 자식임을 식별하는 다른 정보와 함께 참조되었다.부모가 자신의 자녀 또는 특정 클래스의 자녀를 열거하는 반복기를 제공하여 응용 프로그램이 일련의 요소를 처리할 수 있도록 했습니다.시스템은 일반적으로 XML에서 사용되는 Document Object Model과 비슷하지만 액세스 패턴은 다소 다릅니다.

각 개체에는 요소속성이 있을 수 있습니다. 요소는 생성 또는 삭제될 수 있는 다른 개체입니다. 반면 속성은 생성 또는 삭제할 수 없지만 조회 또는 변경될 수 있는 값이 있습니다.예를 들어, 응용프로그램에는 현재 열려 있는 문서의 내용을 보여주는 창을 나타내는 하나 이상의 창 요소가 있을 수 있습니다.이러한 창에는 제목, 위치 및 크기와 같은 속성이 있을 수 있습니다.

응용 프로그램은 개체에서 작업하기 위한 사용자 지정 동사를 정의할 수 있습니다.또한 AEOM은 오픈, 클로즈, 요소 생성, 삭제, 데이터 설정, 데이터 가져오기 등 애플리케이션이 일관된 방식으로 구현할 수 있는 다양한 표준 동사를 지정했습니다.각 동사는 존재할 것으로 예상되는 특정 유형의 특정 파라미터와 함께 특정 유형 및 클래스의 AppleEvent로 정의되었습니다.예를 들어, "get data" 이벤트는 속성 값을 얻기 위한 표준 수단이었습니다. 기본적으로 하나의 매개 변수, 즉 쿼리할 속성을 식별하는 개체 설명자를 사용했습니다.해당 속성 값은 회신 이벤트에서 반환됩니다."set data" 이벤트는 설정할 속성의 객체 기술자와 속성의 새 값이라는 두 가지 매개 변수를 사용했습니다. 응답 이벤트는 성공 상태 또는 실패 오류 코드만 반환할 것으로 예상되었습니다.

전체 AppleEvent 아키텍처는 4바이트의 OSType 코드를 사용하여 사물을 식별하며 영어(또는 다른 언어)의 실제 단어 또는 구문을 신중하게 피합니다.대신 내부 AppleEvent 코드와 외부 자연어 설명 간의 대응은 aete(AppleEvent Termology Extension) 리소스를 통해 지정됩니다. 즉, AppleScript 자체에 내장된 표준 용어에 대한 "확장"입니다.어플리케이션은 AppleScript 자체의 원래 다국어 설계에 따라 여러 언어에 대해 여러 개의 'aete' 리소스를 제공할 수 있습니다.

예를 들어 가상 도면 응용 프로그램을 제어하는 다음 AppleScript 시퀀스를 생각해 보겠습니다.

 말하다 어플 "ScriptableDraw"    세트 배경색  윈도 "새 도면" 로. 배경색  윈도 "오래된 도면"  끝. 말하다 

여기에는 실제로 2개의 AppleEvents를 타깃 어플리케이션으로 송신(및 대응하는 응답 수신)하는 작업이 포함됩니다.먼저 get-data 이벤트가 전송되어 "Old Drawing"이라는 이름으로 식별된 창의 배경색 속성을 취득합니다.그 다음 set-data 이벤트가 전송되어 반환된 값이 배경색 속성으로 적용됩니다.'New Drawing'이라는 이름의 창.

이러한 종류의 액세스 패턴이 일반적이기 때문에, AppleScript는 널리 사용되었습니다.tell스테이트먼트: 콘텍스트를 이름 있는 오브젝트로 전환합니다.withVisual Basic 또는 Pascal에 있는 문입니다.이후의 모든 명령어tell통신사에end tell에 기재되어 있는 오브젝트로 송신됩니다.tell디폴트 오브젝트(현재 어플리케이션)가 아닌.

오브젝트 기술자는 다양한 방법으로 오브젝트를 식별할 수 있도록 했습니다.가장 흥미로운 것은 where-clause(필터 표현으로서 AppleScript 용어로 번역)를 사용한 것입니다.예를 들어 AppleScript 1.0 SDK는 Scriptable Text Editor라고 하는 응용 프로그램의 소스 코드를 동봉하여 다음과 같은 스크립트에 응답합니다.

 말하다 어플 "스크립트 가능한 텍스트 편집기"    말하다 윈도 "문서 예시"      세트 본문 스타일.  모든 단어 누구의. 길이 > 7 로. 대담한    끝. 말하다  끝. 말하다 

오늘날에도 SQL 이외의 범용 스크립트 언어에서는 이러한 기능을 거의 찾아볼 수 없습니다.

기존의 Mac OS에서 AEOM을 지원하는 것은 어려운 과정이었습니다.애플리케이션 개발자는 객체 및 손으로 쓴 코드를 식별하여 주소 지정을 허용해야 했습니다.이는 일반적으로 특정 유형의 "다음" 개체를 반환하는 코드 형식을 취하여 AppleScript가 해당 개체 위에 반복할 수 있도록 합니다.그러나 OS에는 객체 모델이 포함되어 있지 않았기 때문에, 이 작업은 개발자들에게 전적으로 맡겨졌고, 그들 중 대부분은 이를 구현하지 않았습니다.이상하게도, Apple의 애플리케이션 프레임워크인 MacApp조차 알고 있는 GUI 오브젝트를 제외하고는 이러한 모델을 제공하지 않았고, 다시 한번 개발자가 데이터 자체를 나타내는 오브젝트를 스크립팅하는 작업의 대부분을 수행하게 했다.이러한 이유로 애플스크립트 지원은 널리 보급되어 있지 않았다.

애플은 다양한 유형의 응용 프로그램에서 지원할 것으로 예상되는 표준 개체와 동사를 나타내는 다양한 개체 "suites"를 도입함으로써 이 문제를 해결하려고 시도했습니다.예를 들어, 모든 애플리케이션은 "코어 스위트"를 지원해야 하며, 애플리케이션 편집 텍스트는 "텍스트 스위트"를 지원해야 합니다.적절한 스위트 세트를 선택함으로써 개발자는 오브젝트를 표시하는 방법을 계획하는 워크로드를 최소한 줄일 수 있었습니다.그러나 이러한 오브젝트는 일반적으로 시스템 자체의 일부가 아니었기 때문에(TextEdit 에디터의 극히 제한 제외), 실제 실장은 개발자에게 맡겨졌습니다.

이전에 OpenStep으로 알려졌던 시스템인 Cocoa에서 개발된 애플리케이션은 다른 모든 애플리케이션에서 쿼리할 수 있는 풍부한 객체 런타임 기능을 제공합니다.이것에 의해, AEOM 의 실장이 큰폭으로 용이하게 되어, 평균적인 애플리케이션에 필요한 코드의 양이 큰폭으로 삭감됩니다.또한 대부분의 코코아 어플리케이션은 주로 코코아 표준 오브젝트로 구성되어 있으며, 이 오브젝트들은 모두 상당히 광범위한 스크립트 기능을 제공하도록 업그레이드되었습니다.이는 MacApp에서와 같이 GUI 개체뿐만 아니라 텍스트, 표 및 다양한 목록 개체를 포함한 GUI 개체 내부의 데이터 개체로도 확장됩니다.텍스트 파일은 내부 "객체와 같은" 이름을 사람이 읽을 수 있는 버전에 매핑하기 위해 사용되며, 대부분의 경우 이 파일만 작성하면 대부분의 프로그램에 상당한 스크립트 작성 가능성을 추가할 수 있습니다.

코코아 어플리케이션은 AEOM을 기반으로 하지 않고 Apple이 원래 정의한 표준 오브젝트와는 미묘하게 다른 오브젝트를 사용하는 경우가 많지만, 코코아 어플리케이션은 일반적으로 "클래식" 어플리케이션보다 훨씬 스크립트가 가능합니다.실제로 어느 정도 스크립트가 불가능한 코코아 어플리케이션을 찾는 것은 드문 일입니다.

읽고 추가

  • 특히 섹션 2.3 "Apple Events"(페이지 9~13)를 참조해 주십시오Cook, William R. (September 29, 2006), AppleScript (PDF), University of Texas at Austin, pp. 1–1–1–21, CiteSeerX 10.1.1.76.6993, doi:10.1145/1238844.1238845, retrieved May 9, 2009.단, Apple Events의 역사와 중요성에 대해서는 다른 문서에서도 설명하고 있습니다.

외부 링크