아티클

iOS 네이티브앱에서 업데이트 되는 콘텐츠 읽어주도록 구현하기 1부: AccessibilityAnnouncement 단독 활용

2020-06-17 13:15:26

안녕하세요, 엔비전스입니다.

스크린 리더로 웹이나 앱을 이용할 때 사용자의 액션이나 기타 이유로 인해 웹페이지 URL이 새로운 URL로 변경되어 새로운 웹 문서를 불러올 때, 혹은 iOS 에서의 Scene, 안드로이드의 Activity와 같은 윈도우가 변경되는 경우에는 특별한 접근성 대응을 해 주지 않더라도 각 플랫폼별 특성에 맞게 스크린 리더에서 효과음, 혹은 음성 피드백 등을 통해 화면이 변경되었음을 알려주게 됩니다.

그러나 사용자의 액션 또는 기타 이유로 인해 화면의 일부 내용이나 레이아웃이 바뀌었을 경우에는 변경된 내용 또는 관련 요약 정보를 스크린 리더가 읽어줄 수 있도록 하거나 변경된 레이아웃의 메인 영역으로 초점을 보내 주는 등의 접근성에 대한 고려가 필요합니다. 이러한 부분을 고려하지 않으면 사용자의 액션에 의해 중요한 팝업이 나타나거나, 레이아웃이 변경되었을 때, 특정 요소의 텍스트가 변경되었을 때 화면의 변화를 전혀 인지할 수 없거나, 일부 텍스트가 변경되었을 때, 텍스트를 확인하기 위해 키보드 혹은 제스처 조작을 해야 하는 등의 여러 문제점이 발생하게 됩니다.

웹, 모바일 네이티브에서는 화면 레이아웃이나 특정 요소의 텍스트가 변경되었을 때 접근성을 대응할 수 있는 여러 API를 제공하고 있습니다. 각 플랫폼별로 제공하는 API를 간략하게 언급해 보자면 다음과 같습니다.

  1. 웹: aria-live, role=”alert”, role=”alertdialog”
  2. iOS: screenChanged, layoutChanged, accessibilityAnnouncement, pageScrolled notification, freequentlyUpdated trait.
  3. 안드로이드: LiveRegion, announceForAccessibility, accessibilityPaneTitle, sendAccessibilityEvent.

각 플랫폼에서 제공하는 메소드들은 상황에 따라 적용 방법이 다르며 안드로이드 접근성에서의 AccessibilityPaneTitle 메소드에 대해서는 지난번에 안드로이드 접근성 관련 문서에서 다룬 적이 있습니다.

본 문서에서는 iOS 앱에서 accessibilityAnnouncement 메소드의 활용 범위, 구체적인 사용 방법 및 예시에 대해 살펴보도록 하겠습니다.

 

iOS에서 제공하는 접근성 알림 이벤트

iOS에서는             UIAccessibility.post(notification) API에서 제공하는 여러 알림 이벤트를 상황에 맞게 사용하여 여러 알림을 제공할 수 있습니다. 예를 들어 화면의 대부분의 콘텐츠가 변경되었을 때는 screenChanged notification, 화면의 일부 레이아웃이 변경되었을 때는 layoutChanged notification, 사용자가 스크롤 했을 때 알림을 주어야 할 때는 pageScroled notification을 사용합니다. 또한 특정 알림 메시지나 사용자의 동작에 의한 다른 요소의 텍스트를 변경하려면 본 문서에서 자세히 다룰 accessibilityAnnouncement notification을 사용합니다.

 

AccessibilityAnnouncement 메소드의 특징

  1. 웹이나 안드로이드와는 달리 iOS에서는 LiveRegion의 개념이 없습니다. 물론 freequentlyUpdated trait를 생각해볼 수 있지만 해당 메소드는 업데이트되고 있는 콘텐츠에 포커스 하고 있을 때만 해당됩니다. 따라서 포커스 하고 있지 않은 요소의 텍스트를 자동으로 읽도록 하려면 해당 시점마다 AccessibilityAnnouncement 이벤트를 실행해 주어야 합니다.
  2. LiveRegion에는 polite 및 assertive 속성이 있습니다. Polite 속성은 스크린 리더가 기존에 읽던 콘텐츠가 있을 경우 기존에 읽던 것을 모두 읽은 뒤 LiveRegion에 선언된 내용을 읽도록 하며, assertive는 기존에 읽던 것을 멈추고 새로운 것을 바로 읽게 합니다. polite와 비슷한 iOS의 접근성 메소드는 accessibilitySpeechQueueAnnouncement 입니다. 일반적으로 AccessibilityAnnouncement를 단독으로 실행하면 만약 기존에 읽고 있던 텍스트가 있다면 해당 텍스트는 무시하고 announcement로 발화된 텍스트를 말하게 됩니다(LiveRegion의 assertive와 유사). 그러나 기존에 읽던 텍스트를 다 읽고 지정한 텍스트를 자동으로 읽을 수 있도록 하기 위해서는 accessibilitySpeechQueueAnnouncement 즉 말할 내용을 대기열에 넣어 두었다가 차례가 되었을 때 읽게끔 할 수 있습니다. 해당 accessibilitySpeechQueueAnnouncement는 true 혹은 false 값을 사용하게 되는데 true 값을 사용하면 이전에 말한 것을 다 끝내고 지정한 내용을 읽습니다. accessibilitySpeechQueueAnnouncement 활용에 대해서는 2부에서 자세히 다룹니다.
  3. AccessibilityAnnouncement와 사용자의 특정 요소 이중 탭이 동시에 일어나는 경우에는 AccessibilityAnnouncement 값은 무시됩니다. 이는 사용자가 이중탭한 객체에 대한 텍스트를 변경과 상관없이 보이스오버에서 읽게 되는데, 이것이 더 우선되기 때문입니다. 따라서 아래에서 다시 언급하겠지만 이 문제를 해결하려면, 메소드를 실행 할 때 반드시 1초 정도의 지연이 필요합니다.

 

AccessibilityAnnouncement 메소드의 구체적인 사용방법

  1. 기본 문법: UIAccessibility.post(notification: .announcement, argument: 들어갈 문구)
    여기서 들어갈 문구는 따옴표로 묶어서 직접 문구를 작성하거나, 참조할 객체의 텍스트를 가지고 와야 할 때는 nameLabel.text 와 같이 참조할 객체를 삽입해 주면 됩니다. 참조할 객체의 화면에 보이는 텍스트를 가지고 와야 하는 경우에는 text를, accessibilityLabel을 가지고 와야 할 때는 accessibilityLabel 을 사용합니다.
  2. 사용자가 특정 요소를 이중 탭할 때 다른 요소의 텍스트가 변경되는 것을 읽어주게 하려면 위에서 언급한 것처럼 반드시 announcement의 실행을 1초 정도 늦춰야 합니다. 예: DispatchQueue.main.asyncAfter(deadline: .now() + 0.1)
    3. 사용자가 이중 탭했을 때 이중 탭한 요소의 텍스트도 변경되고 announcement 텍스트도 함께 읽도록 하려면 accessibilitySpeechQueueAnnouncement를 함께 사용해야 하며 이 부분에 대해서는 2부에서 다룹니다.

 

지금까지 AccessibilityAnnouncement의 기본적인 활용에 대해 살펴보았습니다. 본 문서의 이해를 돕기 위해 샘플 코드를 첨부하였습니다. iOS는 앱 다운로드 링크는 공유유가 어렵기 때문에 프로젝트 소스만 공유함을 양해해해 주시기 바랍니다.

소스코드 다운로드

댓글 0
댓글을 작성하려면 해주세요.