Xamarin의 tvOS용 Siri 원격 및 Bluetooth 컨트롤러

Xamarin.tvOS 앱의 사용자는 장치의 화면에서 이미지를 탭하는 iOS와 마찬가지로 인터페이스와 직접 상호 작용하지 않고 Siri 원격을 사용하여 방 전체에서 간접적으로 상호 작용합니다.

앱이 게임인 경우 앱에서 타사, Made For iOS(MFI) Bluetooth 게임 컨트롤러에 대한 지원을 필요에 따라 빌드할 수 있습니다.

The Bluetooth Remote and Game Controller

이 문서에서는 Siri 원격, 터치 표면 제스처Siri 원격 단추를 설명하고 제스처 및 스토리보드, 제스처 및 코드 및 하위 수준 이벤트 처리를 통해 작업하는 방법을 보여 줍니다. 마지막으로 Xamarin.tvOS 앱에서 게임 컨트롤러로 작업하는 것을 설명 합니다 .

시리 리모컨

사용자가 Apple TV 및 Xamarin.tvOS 앱과 상호 작용하는 기본 방법은 포함된 Siri Remote을 통해서입니다. 애플은 소파에 앉아있는 사용자와 TV 화면의 방을 가로 질러 표시된 Apple TV의 사용자 인터페이스 사이의 거리를 연결하기 위해 리모컨을 설계했습니다.

tvOS 앱 개발자로서의 과제는 Siri Remote의 터치 표면, 가속도계, 자이로스코프 및 단추를 활용하는 빠르고 사용하기 쉽고 시각적으로 매력적인 사용자 인터페이스를 만드는 것입니다.

The Siri Remote

Siri Remote에는 tvOS 앱 내에서 다음과 같은 기능과 예상 사용량이 있습니다.

기능 일반 앱 사용 게임 앱 사용량
터치 표면
살짝 밀어 탐색하고, 길게 눌러 상황에 맞는 메뉴를 선택합니다.
탭/살짝 밀기
포커스가 있는 항목 간 UI 탐색

클릭
선택한 항목(포커스 내) 항목을 활성화합니다.
탭/살짝 밀기
게임 디자인에 따라 달라 지고 가장자리를 탭 하 여 D-패드로 사용할 수 있습니다.

클릭
기본 단추 함수를 수행합니다.
메뉴
이전 화면 또는 메뉴로 돌아가려면 누릅니다.
이전 화면으로 돌아가서 기본 앱 화면에서 Apple TV 홈 화면으로 종료합니다. 게임 플레이를 일시 중지하고 다시 시작하고, 이전 화면으로 돌아가서 기본 앱 화면에서 Apple TV 홈 화면으로 종료합니다.
Siri/검색
Siri가 있는 국가에서는 음성 제어를 길게 누르고 다른 모든 국가에서 검색 화면을 표시합니다.
해당 없음 해당 없음
재생/일시 중지
미디어를 재생 및 일시 중지하거나 앱에서 보조 함수를 제공합니다.
미디어 재생을 시작하고 재생을 일시 중지/다시 시작합니다. 보조 단추 함수를 수행하거나 소개 비디오를 건너뜁니다(있는 경우).

홈 화면으로 돌아가려면 길게 누른 상태로 실행 중인 앱을 표시하려면 두 번 클릭합니다.
해당 없음 해당 없음
부피
연결된 오디오/비디오 장비 볼륨을 제어합니다.
해당 없음 해당 없음

터치 표면 제스처

Siri Remote의 Touch Surface는 Xamarin.tvOS 앱에서 응답할 수 있는 다양한 단일 손가락 제스처를 감지할 수 있습니다.

살짝 밀기 클릭 누르기
Moves selection Actives the selected item Directional buttons
화면의 UI 요소 간에 선택 영역(포커스)을 이동합니다(위, 왼쪽, 오른쪽). 스 와이프를 사용하여 관성으로 큰 콘텐츠 목록을 빠르게 스크롤할 수 있습니다. 선택한(포커스 내) 항목을 활성화하거나 게임의 기본 단추처럼 작동합니다. 클릭하고 누르면 상황에 맞는 메뉴 또는 보조 함수를 활성화할 수 있습니다. 가장자리에서 터치 표면을 가볍게 탭하면 D-Pad의 방향 단추처럼 작동하며 탭된 영역에 따라 포커스를 위쪽, 아래쪽, 왼쪽 또는 오른쪽으로 이동합니다. 앱에 따라 숨겨진 컨트롤을 공개하는 데 사용할 수 있습니다.

Apple은 터치 표면 제스처를 사용하기 위해 다음과 같은 제안을 제공합니다.

  • 클릭과 탭 구분 - 클릭은 사용자의 의도적인 작업이며 게임의 선택, 활성화 및 기본 단추에 적합합니다. 탭은 더 미묘하며 사용자가 Siri 원격을 손에 들고 실수로 탭 이벤트를 쉽게 활성화할 수 있기 때문에 아쉽게 사용해야 합니다.
  • 표준 제스처 재정의 안 함 - 사용자는 특정 제스처가 특정 작업을 수행할 것이라는 기대를 가지고 있으며, 앱에서 이러한 제스처의 의미나 기능을 다시 정의해서는 안 됩니다. 한 가지 예외는 활성 게임 플레이 중에 게임 앱입니다.
  • 새 제스처를 아끼지 않고 정의 - 다시 말하지만, 사용자는 특정 제스처가 특정 작업을 수행할 것이라는 기대를 가지고 있습니다. 표준 작업을 수행하려면 사용자 지정 제스처를 정의하지 않아야 합니다. 그리고 다시 말하지만, 게임은 사용자 지정 제스처가 게임에 재미 있고 몰입형 플레이를 추가 할 수있는 가장 일반적인 예외입니다.
  • 적절한 경우 D 패드 탭 에 응답 - 터치 표면의 모서리 가장자리를 가볍게 탭하면 포커스 또는 방향을 위로, 아래로, 왼쪽 또는 오른쪽으로 이동하는 게임 컨트롤러의 D-Pad처럼 반응합니다. 적절한 경우 앱 또는 게임에서 이러한 제스처에 응답해야 합니다.

Siri 원격 단추

터치 표면의 제스처 외에도 앱은 터치 표면을 클릭하거나 재생/일시 중지 단추를 누르는 사용자에게 응답할 수 있습니다. 게임 컨트롤러 프레임워크를 사용하여 Siri 원격에 액세스하는 경우 누를 메뉴 단추를 감지할 수도 있습니다.

또한 표준 UIKit 요소와 함께 Gesture Recognizer를 사용하여 메뉴 단추 누름을 검색할 수 있습니다. 누를 메뉴 단추를 가로채면 현재 보기 및 보기 컨트롤러를 닫고 이전 보기로 돌아갑니다.

Important

항상 원격의 재생/일시 중지 단추에 함수를 할당해야 합니다. 작동하지 않는 단추를 사용하면 앱이 최종 사용자에게 끊어진 것처럼 보일 수 있습니다. 이 단추에 유효한 함수가 없는 경우 기본 단추와 동일한 함수를 할당합니다(터치 표면 클릭).

제스처 및 스토리보드

Xamarin.tvOS 앱에서 Siri 원격으로 작업하는 가장 쉬운 방법은 인터페이스 디자이너의 보기에 제스처 인식기를 추가하는 것입니다.

제스처 인식기를 추가하려면 다음을 수행합니다.

  1. 솔루션 탐색기 파일을 두 번 클릭하고 Main.storyboard 인터페이스 디자이너를 편집하기 위해 엽니다.

  2. 라이브러리에서 탭 제스처 인식기를끌어서 보기에 놓습니다.

    A Tap Gesture Recognizer

  3. 특성 검사기의 단추 섹션에서 선택을 선택합니다.

    Check Select

  4. 선택 시리 원격에서 터치 표면을 클릭 하는 사용자에 응답 하는 제스처를 의미 합니다. 메뉴, 재생/일시 중지, 위쪽, 아래쪽, 왼쪽오른쪽 단추에 응답하는 옵션도 있습니다.

  5. 다음으로, 탭 제스처 인식기에서 작업을 연결하고 다음을 호출합니다TouchSurfaceClicked.

    An Action from the Tap Gesture Recognizer

  6. 변경 내용을 저장하고 Mac용 Visual Studio 돌아갑니다.

뷰 컨트롤러(예 FirstViewController.cs) 파일을 편집하고 다음 코드를 추가하여 트리거되는 제스처를 처리합니다.

using System;
using UIKit;

namespace tvRemote
{
    public partial class FirstViewController : UIViewController
    {
        ...

        #region Custom Actions
        partial void TouchSurfaceClicked (Foundation.NSObject sender) {
            // Handle click here
            ...
        }
        #endregion
    }
}

스토리보드 작업에 대한 자세한 내용은 Hello, tvOS 빠른 시작 가이드를 참조하세요. 특히 사용자 인터페이스 만들기 및 콘센트 및 작업 섹션을 사용하여 코드 작성

제스처 및 코드

필요에 따라 C# 코드에서 직접 제스처를 만들고 사용자 인터페이스의 보기에 추가할 수 있습니다. 예를 들어 일련의 살짝 밀기 제스처 인식기를 추가하려면 뷰 컨트롤러를 편집하고 다음 코드를 추가합니다.

using System;
using UIKit;

namespace tvRemote
{
    public partial class SecondViewController : UIViewController
    {
        #region Constructors
        public SecondViewController (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Wire-up gestures
            var upGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Up";
                ButtonLabel.Text = "Swiped Up";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Up
            };
            this.View.AddGestureRecognizer (upGesture);

            var downGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Down";
                ButtonLabel.Text = "Swiped Down";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Down
            };
            this.View.AddGestureRecognizer (downGesture);

            var leftGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Left";
                ButtonLabel.Text = "Swiped Left";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Left
            };
            this.View.AddGestureRecognizer (leftGesture);

            var rightGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Right";
                ButtonLabel.Text = "Swiped Right";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Right
            };
            this.View.AddGestureRecognizer (rightGesture);
        }
        #endregion
    }
}

하위 수준 이벤트 처리

Xamarin.tvOS 앱(예UIView: )을 기반으로 UIKit 사용자 지정 형식을 만드는 경우 이벤트를 통해 UIPress 단추 누름에 대한 하위 수준 처리를 제공할 수도 있습니다.

UIPress 이벤트는 Siri 원격 또는 기타 연결된 Bluetooth 장치(예: 게임 컨트롤러)의 단추 누름에 대한 정보를 반환하는 것을 제외하고 UIPress iOS에 대한 이벤트가 무엇인지 UITouch tvOS에 적용하는 것입니다. UIPress 이벤트는 누르고 있는 단추와 해당 상태(시작, 취소됨, 변경됨 또는 종료됨)를 설명합니다.

Bluetooth 게임 컨트롤러와 같은 디바이스의 아날로그 단추의 경우 단추에 적용되는 힘의 양도 반환합니다 UIPress . 이벤트의 속성 UIPressType 상태를 변경한 실제 단추를 정의하고 나머지 속성은 발생한 변경 사항을 설명합니다.

다음 코드는 다음의 하위 수준 UIPress 이벤트를 처리하는 예제를 보여 줍니다.UIView

using System;
using Foundation;
using UIKit;

namespace tvRemote
{
    public partial class EventView : UIView
    {
        #region Computed Properties
        public override bool CanBecomeFocused {
            get {
                return true;
            }
        }
        #endregion

        #region
        public EventView (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void PressesBegan (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesBegan (presses, evt);

            foreach (UIPress press in presses) {
                // Was the Touch Surface clicked?
                if (press.Type == UIPressType.Select) {
                    BackgroundColor = UIColor.Red;
                }
            }
        }

        public override void PressesCancelled (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesCancelled (presses, evt);

            foreach (UIPress press in presses) {
                // Was the Touch Surface clicked?
                if (press.Type == UIPressType.Select) {
                    BackgroundColor = UIColor.Clear;
                }
            }
        }

        public override void PressesChanged (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesChanged (presses, evt);
        }

        public override void PressesEnded (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesEnded (presses, evt);

            foreach (UIPress press in presses) {
                // Was the Touch Surface clicked?
                if (press.Type == UIPressType.Select) {
                    BackgroundColor = UIColor.Clear;
                }
            }
        }
        #endregion
    }
}

이벤트와 UITouch 마찬가지로 이벤트 재정의를 UIPress 구현해야 하는 경우 네 가지 모두를 구현해야 합니다.

Bluetooth 게임 컨트롤러

애플 TV와 함께 제공 하는 표준 Siri 원격 외에도, 타사, iOS에 대 한 만든 (MFI) 블루투스 게임 컨트롤러 애플 TV와 페어링 하 고 Xamarin.tvOS 애플 리 케이 션을 제어 하는 데 사용할 수 있습니다.

Bluetooth Game Controllers

게임 컨트롤러를 사용하여 게임 플레이를 향상시키고 게임에 몰입감을 제공할 수 있습니다. 또한 표준 Apple TV 인터페이스를 제어하는 데 사용할 수 있으므로 원격과 컨트롤러 간에 전환할 필요가 없습니다.

Important

Bluetooth 게임 컨트롤러는 최종 사용자가 만들 수 있는 선택적 구매이며, 앱은 사용자가 강제로 구매할 수 없습니다. 앱이 게임 컨트롤러를 지원하는 경우 모든 Apple TV 사용자가 게임을 사용할 수 있도록 Siri 원격도 지원해야 합니다.

게임 컨트롤러에는 tvOS 앱 내에서 다음과 같은 기능과 예상 사용량이 있습니다.

기능 일반 앱 사용 게임 앱 사용량
D 패드 UI 요소를 탐색합니다(포커스 변경). 게임에 따라 다릅니다.
A 선택한(포커스 내) 항목을 활성화합니다. 기본 단추 함수를 수행하고 대화 상자 동작을 확인합니다.
B 앱의 기본 화면에서 이전 화면으로 돌아가거나 홈 화면으로 종료됩니다. 보조 단추 함수를 수행하거나 이전 화면으로 돌아갑니다.
X 미디어 재생을 시작하거나 재생을 일시 중지/다시 시작합니다. 게임에 따라 다릅니다.
Y 해당 없음 게임에 따라 다릅니다.
메뉴 앱의 기본 화면에서 이전 화면으로 돌아가거나 홈 화면으로 종료됩니다. 앱의 기본 화면에서 게임 플레이를 일시 중지/다시 시작하거나, 이전 화면으로 돌아가거나, 홈 화면으로 종료합니다.
왼쪽 어깨 단추 왼쪽으로 이동합니다. 게임에 따라 다릅니다.
왼쪽 트리거 왼쪽으로 이동합니다. 게임에 따라 다릅니다.
오른쪽 어깨 단추 오른쪽으로 이동합니다. 게임에 따라 다릅니다.
오른쪽 트리거 오른쪽으로 이동 게임에 따라 다릅니다.
왼쪽 엄지스틱 UI 요소를 탐색합니다(포커스 변경). 게임에 따라 다릅니다.
오른쪽 엄지스틱 해당 없음 게임에 따라 다릅니다.

Apple은 게임 컨트롤러 작업에 대해 다음과 같은 제안을 제공합니다.

  • 게임 컨트롤러 커넥트 확인 - 최종 사용자가 언제든지 tvOS 앱을 시작하고 중지할 수 있습니다. 앱 시작 또는 절전 모드에서 게임 컨트롤러가 있는지 항상 검사 필요에 따라 조치를 취해야 합니다.
  • Siri 원격 및 게임 컨트롤러 모두에서 앱이 작동하는지 확인합니다. 사용자가 앱을 사용하기 위해 Siri 원격과 게임 컨트롤러 간에 전환할 필요가 없습니다. 두 가지 유형의 컨트롤러로 앱을 테스트하여 모든 항목을 쉽게 탐색하고 예상대로 작동하는지 확인합니다.
  • 뒤로 이동 제공 - 메뉴 단추를 누르면 항상 이전 화면으로 돌아가야 합니다. 사용자가 기본 앱 화면에 있는 경우 메뉴 단추는 Apple TV 홈 화면으로 반환해야 합니다. 게임 플레이 중에 메뉴 단추는 사용자에게 게임 플레이를 일시 중지/다시 시작하거나 기본 메뉴로 돌아갈 수 있는 기능을 제공하는 경고를 표시해야 합니다.

게임 컨트롤러 작업

위에서 설명한 대로, 애플 TV와 함께 제공되는 표준 Siri 원격 외에도, 사용자는 선택적으로 타사, 메이드 포 iOS (MFI) Bluetooth 게임 컨트롤러를 연결하고 Xamarin.tvOS 응용 프로그램을 제어하는 데 사용할 수 있습니다.

앱에 하위 수준 컨트롤러 입력이 필요한 경우 tvOS에 대해 다음과 같은 수정 사항이 있는 Apple의 게임 컨트롤러 프레임워크 를 사용할 수 있습니다.

  • 마이크로 게임 컨트롤러 프로필 (GCMicroGamepad) Siri 원격을 대상으로 추가 되었습니다.
  • GCEventViewController 클래스를 사용하여 앱을 통해 게임 컨트롤러 이벤트를 라우팅할 수 있습니다. 자세한 내용은 아래 게임 컨트롤러 입력 확인 섹션을 참조하세요.

게임 컨트롤러 지원 요구 사항

Apple에는 Xamarin.tvOS 앱이 게임 컨트롤러를 지원하는 경우 충족해야 하는 몇 가지 특정 요구 사항이 있습니다.

  • Siri 원격 을 지원해야 합니다. 항상 Siri 원격을 지원해야 합니다. 게임에서 타사 게임 컨트롤러를 플레이하도록 요구할 수 없습니다.
  • 확장 컨트롤 레이아웃 을 지원해야 합니다. 모든 tvOS 게임 컨트롤러는 비형형 맞춤 확장 컨트롤러입니다.
  • 독립 실행형 컨트롤러로 게임을 플레이할 수 있어야 합니다. 앱에서 확장 게임 컨트롤러를 지원하는 경우 해당 게임 컨트롤러로만 재생할 수 있어야 합니다.
  • 재생/일시 중지 단추를 지원해야 합니다. 게임 플레이 중에 사용자가 재생/일시 중지 단추를 누르면 사용자에게 게임 플레이를 일시 중지/다시 시작하거나 기본 메뉴로 돌아갈 수 있는 경고를 표시해야 합니다.

게임 컨트롤러 지원 사용

Xamarin.tvOS 앱에서 게임 컨트롤러 지원을 사용하도록 설정하려면 솔루션 탐색기 파일을 두 번 클릭하여 Info.plist 편집용으로 엽니다.

The Info.plist editor

게임 컨트롤러 섹션에서 게임 컨트롤러를 사용하도록 설정하여 검사 배치한 다음 앱에서 지원되는 모든 게임 컨트롤러 유형을 검사.

Siri 원격을 게임 컨트롤러로 사용

애플 TV와 함께 제공되는 Siri 리모컨은 제한된 게임 컨트롤러로 사용할 수 있습니다. 다른 게임 컨트롤러와 마찬가지로 게임 컨트롤러 프레임워크에 개체로 GCController 표시되고 프로필과 GCMicroGamepad 프로필을 모두 GCMotion 지원합니다.

Siri 원격 게임 컨트롤러로 사용 되는 경우 다음과 같은 특성이 있습니다.

  • 터치 표면은 아날로그 입력 데이터를 제공하는 D 패드로 사용할 수 있습니다.
  • 원격은 세로 또는 가로 방향으로 사용할 수 있으며 앱은 프로필 개체가 입력 데이터를 자동으로 대칭 이동해야 하는지 여부를 결정합니다.
  • 터치 표면을 클릭하면 게임 컨트롤러에서 단추 A 를 누르는 것과 같은 역할을 합니다.
  • 재생/일시 중지 단추는 게임 컨트롤러의 단추 X 처럼 작동합니다.
  • 메뉴 단추는 사용자에게 게임 플레이를 일시 중지/다시 시작하거나 기본 메뉴로 돌아갈 수 있는 기능을 제공하는 경고를 표시해야 합니다.

게임 컨트롤러 입력 확인

게임 컨트롤러 이벤트를 터치 이벤트와 병렬로 수신할 수 있는 iOS와 달리 tvOS는 모든 하위 수준 이벤트를 처리하여 높은 수준의 UIKit 이벤트를 제공합니다. 따라서 하위 수준 게임 컨트롤러 이벤트에 액세스해야 하는 경우 '의 기본 동작을 해제 UIKit해야 합니다.

tvOS에서 게임 컨트롤러 입력을 직접 처리하려는 경우(또는 서브클래스)를 사용하여 GCEventViewController 게임의 사용자 인터페이스를 표시해야 합니다. 첫 번째 GCEventViewController응답자가 될 때마다 게임 컨트롤러 입력이 캡처되어 게임 컨트롤러 프레임워크를 통해 앱에 전달됩니다.

클래스의 UserInteractionEnabledGCEventViewController 속성을 사용하여 이벤트가 처리되고 처리되는 방식을 토글할 수 있습니다.

게임 컨트롤러 지원 구현에 대한 자세한 내용은 tvOS게임 컨트롤러 프로그래밍 가이드의 앱 프로그래밍 가이드에서 Apple의 게임 컨트롤러 작업 섹션을 참조하세요.

요약

이 문서는 애플 TV와 함께 제공되는 새로운 Siri 원격을 다루었다, 터치 표면 제스처와 시리 원격 버튼. 다음으로, 제스처 및 스토리보드, 제스처 및 코드 및 하위 수준 이벤트 작업을 다루었습니다. 마지막으로, 게임 컨트롤러와 함께 작업하는 것을 논의하는 경우