iOS, Android 플랫폼에서의 접근성 힌트 메시지 제공 방법 1부 - 플랫폼별 힌트 메시지 제공의 특징 알아보기
안녕하세요, 엔비전스입니다.
iOS, Android로 접근성 테스트를 하다 보면 ‘열려면 이중 탭 하십시오.’, ‘활성화하려면 두 번 탭 하세요.’ 등의 힌트 메시지를 종종 듣곤 합니다. 이러한 힌트 메시지는 각 접근성 API에서 컨트롤 유형에 따라 자동으로 생성하기도 하며 때에 따라서는 개발자가 추가하거나 수정하기도 합니다.
본 아티클은 2부로 구성됩니다. 1부에서는 접근성 구현 시 힌트 메시지의 목적과 iOS, Android 각 플랫폼별 힌트 메시지 처리 방식에 대해 살펴보고 2부에서는 iOS, Android 플랫폼별 힌트 메시지를 추가하거나 수정하는 방법에 대해 살펴보도록 하겠습니다.
모바일 스크린리더와 객체(view)
우리는 모바일 스크린리더로 화면을 탐색할 때 기본적으로 한 손가락 쓸기 제스처를 이용하며 이때마다 각 객체에 포커스 되면서 스크린리더가 객체의 내용을 음성 출력합니다. 각각의 객체는 view라고 하며 각 view의 컨트롤 유형 및 상태에 따라 VoiceOver, TalkBack에서는 레이블만 읽거나, 레이블과 요소 유형, 혹은 레이블과 상태 등을 음성 출력하게 됩니다. 물론 개발자는 상황에 따라 접근성을 향상시키기 위해 2개 이상의 view를 하나의 포커스로 합칠 수도 있고 view가 가진 컨트롤의 유형이나 상태 정보를 기획된 각 요소의 의미에 맞게 접근성 트리를 변경할 수도 있습니다.
그러나 원래의 view 객체이든 혹은 개발자가 객체의 속성 등을 접근성 트리에서 변경하였든 상관없이 스크린리더가 포커스 되는 각 view의 유형에 따라 레이블과 요소의 유형 및 상태 정보를 읽는 것 외에도 다음과 같은 특징을 가집니다.
- 앞으로 자세히 살펴보겠지만 힌트 메시지가 변경됩니다.
- 스크린리더가 제공하는 소리 피드백을 활성화 한 경우 사운드 피드백이 변경되기도 합니다. 예를 들어
- VoiceOver의 경우에는 한 화면에서 HTML에서의 <table>과 같은 의미를 가진 TableView, NavigationControl 영역과 같이 두 개 이상의 의미가 부여된 레이아웃 뷰가 존재하는 경우 의미를 가진 view 사이를 이동할 때 다른 영역이라는 것을 특유의 사운드 피드백을 통해 알려줍니다. 또한 아무런 의미를 갖지 않는 UIView라 하더라도(HTML의 div와 유사함) AccessibilityContainerType이 semantic group으로 지정된 view에 다른 의미를 가진 레이아웃 뷰에서 접근하거나 빠져나올 때는 역시 특유의 사운드를 출력하여 다른 영역임을 알려줍니다. 이것을 접근성에서 인식하는 컨테이너라 하며 자세한 것은 iOS 접근성 API 알아보기 아티클에서 자세히 다루도록 하겠습니다.
- 안드로이드 경우에도 클릭 속성이 아예 없는 TextView에 포커스 할 때 출력되는 소리 피드백과 클릭 속성을 가진 view에 포커스 했을 때의 소리 피드백이 다릅니다.
- View 유형에 따라 스크린리더로 사용할 수 있는 제스처가 변경되거나 제스처 옵션이 추가됩니다. 예를 들어
- iOS의 경우 UISlider view에 포커스 되면 힌트 메시지가 추가될 뿐 아니라 한 손가락 위 또는 아래로 쓸기를 통해 슬라이더를 조절할 수 있는 로터 또한 추가되며 자동으로 해당 로터에 맞춰집니다.
- 안드로이드의 경우에도 SeekBar 컨트롤 요소에 포커스 되면 볼륨 버튼으로 SeekBar 컨트롤을 조절할 수 있는 기능이 추가됩니다.
물론 이러한 슬라이더와 같은 컨트롤은 있으나 이에 맞는 동적 이벤트가 추가되지 않는 경우에는 실질적으로 슬라이더가 동작하지 않을 수 있습니다. 중요한 것은 스크린리더는 위에서 살펴본 몇 가지 예시와 같이 각 view의 유형에 따라 스크린리더 사용자에게 힌트 메시지를 포함하여 여러 정보를 달리 표시한다는 것입니다.
접근성 힌트 메시지의 특징과 제공 시 유의 사항
iOS, Android 플랫폼 힌트 메시지 제공에 대한 특징을 살펴보기 전에 보조기술에서 제공하는 힌트에 대한 개념 및 목적부터 함께 살펴보도록 하겠습니다.
- 힌트는 액션을 가진 레이블에 대한 추가 정보를 사용자에게 알려 주기 위한 것입니다. 예: 선택한 상품을 장바구니에서 삭제하려면 이중 탭 하세요, 추가 옵션 보기 작업을 하려면 이중 탭하고 길게 누르세요 등.
- 화면에 보이는 레이블 혹은 대체 텍스트만으로 정보를 충분히 주기 어려운 경우 힌트 메시지를 제공할 수 있습니다.
- 힌트는 사용자가 제스처를 했을 때 일어날 결과에 대해 미리 알려주는 목적으로 사용합니다.
- 힌트는 부가 정보에 해당하며 필요시 사용자가 오프 할 수도 있으므로 특별한 경우가 아니라면 화면에 보여지는 레이블 또는 대체 텍스트만으로도 기본적인 각 요소의 의미를 이해할 수 있어야 합니다.
- 힌트 메시지에는 요소 유형이나 상태 정보는 제공하지 않습니다.
- iOS, android 플랫폼별 힌트 처리 방식을 이해하고 힌트 문구를 플랫폼에 맞게 제공하도록 합니다.
- VoiceOver, TalkBack은 포커스 된 요소의 레이블, 요소 유형, 상태 정보 등을 음성 출력한 후 약 2초 정도의 간격을 두고나서 힌트 메시지를 출력합니다.
- 사용자가 힌트 출력 기능을 오프 하더라도 포커스 된 view에 custom action 메소드가 추가된 경우에는 이를 알려주게 됩니다. Custom action이란 이중 탭 하여 실행되는 view에 할당된 이벤트 외에 스크린리더 사용자가 수행하기 어려운 드래그 & 드롭 작업이 포함되어 있거나 각 view마다 해당 view와 연관된 삭제, 북마크와 같은 여러 기능이 반복적으로 제공되는 경우 대화상자 혹은 추가 옵션 선택 형태로 제공하는 기능을 말합니다. 각 플랫폼별 Custom action을 추가하는 방법에 대해서는 본 아티클 서론에서 언급한 바와 같이 3부 섹션에서 다루도록 하겠습니다.
플랫폼별 힌트 메시지 처리방식
Android
- 안드로이드는 각 view에 포커스 했을 때 click, long click 속성이 있으면 자동으로 힌트 메시지를 출력합니다.
click 속성이 있을 경우: doubletap to activate(활성화 하려면 두 번 탭 하세요).
Long click 속성이 있을 경우: doubletap and hold to long press(두 번 탭하고 길게 누르세요).
- 요소 유형 및 상태 정보 유형에 따라 힌트 메시지가 달라집니다. 예를 들어 체크박스, 라디오 버튼, 스위치 컨트롤의 힌트 메시지는 ‘전환하려면 이중 탭 하세요’ 이며 드롭 다운(Spinner class)의 힌트 메시지는 ‘변경하려면 이중탭하세요’입니다.
- 제스처 사용, 키보드 사용에 따라서도 힌트 메시지가 달라집니다. 사용자가 터치 제스처를 사용하는 경우에는 ‘활성화하려면 두 번 탭 하세요’이지만 하드웨어 키보드를 사용하는 경우에는 ‘활성화하려면 alt + enter 키를 누르세요’입니다.
- 이중 탭 하여 활성화할 수 있는 객체라 하더라도 클릭 속성이 아닌 onTouchEvent 메소드로 구현된 view에는 포커스 하더라도 힌트 메시지가 출력되지 않습니다. 반드시 onTouchEvent 메소드를 사용해야 하는 경우에는 performClick 속성 추가 등을 통해 접근성 노드에 클릭 이벤트가 있음을 알려 주어야 합니다. 해당 주제에 대해서는 2부에서 자세히 다룹니다.
- SeekBar나 ViewPager와 같이 이중 탭이 아닌 다른 제스처가 요구되는 경우 역시 힌트 메시지가 상황에 맞게 출력됩니다.
예: SeekBar의 경우 볼륨 키를 사용하여 조절하세요.
다음은 힌트 메시지 문구 변경에 대한 설명입니다.
- 안드로이드는 시스템에서 자체적으로 발화하는 힌트 메시지를 변경하는 형태로 힌트를 수정할 수 있습니다.
- 자체 발화하는 힌트 메시지 문구의 일부만 변경이 가능합니다. 2부 아티클에서 깊이 다루겠지만 특정 view의 클릭 이벤트에 대한 힌트 메시지(활성화하려면 이중 탭 하세요)를 변경한다면 영어권 기준으로 ‘doubletap to activate’에서 ‘doubletap to’ 부분은 변경이 불가능하고 activate 부분만 변경이 가능합니다. 한국어에서는 클릭 속성에 대한 힌트 문구 변경 시 ‘xx 작업을 하려면 두 번 탭 하세요’로 힌트 메시지를 출력합니다. 따라서 앞의 xx 부분만 변경이 가능합니다. 예: 재생, 정지, 닫기 등.
iOS
- iOS는 안드로이드와 달리 UITextfield, UISwitch, UISlider, ReorderControl과 같은 일부 컨트롤 적용 시에만 힌트 메시지가 자동으로 출력되며 이중 탭 하여 실행하거나 길게 이중탭하여 관련 기능을 실행하는 것에 대해서는 필요시 개발자가 힌트 메시지를 직접 추가해 주어야 합니다.
안드로이드와 달리 힌트 메시지 전체를 원하는 컨텍스트에 맞게 추가가 가능합니다.