共用方式為


Xamarin 中 tvOS 的 Siri 遠端和 藍牙 控制器

Xamarin.tvOS 應用程式的使用者不會直接與其介面互動,就像在裝置螢幕上點選影像的 iOS 一樣,而是間接地從會議室使用 Siri 遠端

如果您的應用程式是遊戲,您可以選擇性地建置支援第三方、針對iOS製作 (MFI) 藍牙 應用程式中的遊戲控制器

藍牙 遠端和遊戲控制器

本文說明 Siri 遠端觸控表面手勢Siri 遠端按鈕 ,並示範如何透過 手勢和分鏡腳本手勢和程式代碼低階事件處理來處理它們。 最後,它會討論 在 Xamarin.tvOS 應用程式中使用遊戲控制器

Siri 遠端

使用者與 Apple TV 互動的主要方式,以及您的 Xamarin.tvOS 應用程式,是透過隨附的 Siri Remote。 蘋果設計了遠端,以橋接坐在沙發上的使用者與蘋果電視的使用者介面之間的距離,並顯示在電視螢幕上的房間。

身為tvOS應用程式開發人員的挑戰是,建立快速、易於使用且視覺上吸引人的使用者介面,利用Siri遠端的觸控表面、加速計、陀螺儀和按鈕。

Siri 遠端

Siri 遠端在您的 tvOS 應用程式中具有下列功能和預期的使用方式:

功能 一般應用程式使用方式 遊戲應用程式使用方式
Touch Surface
撥動以流覽,按以選取並按住內容功能表。
點選/撥動
可設定焦點專案之間的UI流覽。

按一下
啟動選取的專案(焦點中) 專案。
點選/撥動
取決於遊戲設計,並可藉由點選邊緣作為 D-Pad。

按一下
執行主要按鈕函式。
功能表
按 以返回上一個畫面或功能表。
返回上一個畫面,然後從主要應用程式畫面結束至 Apple TV 主畫面。 暫停和繼續遊戲、返回上一個畫面,然後從主要應用程式畫面結束 Apple TV 主畫面。
Siri/搜尋
在 Siri 的國家/地區,按下並按住語音控制,在所有其他國家/地區顯示 [搜尋畫面]。
n/a n/a
播放/暫停
播放和暫停媒體,或在應用程式中提供次要功能。
啟動媒體播放並暫停/繼續播放。 執行次要按鈕函式或略過簡介影片(如果有的話)。
首頁
按 返回首頁畫面,按兩下以顯示執行中的應用程式,按住睡眠裝置。
n/a n/a
體積
控制連接的音訊/視訊設備音量。
n/a n/a

觸控表面手勢

Siri 遠端的 Touch Surface 能夠偵測您可以在 Xamarin.tvOS 應用程式中回應的各種單指手勢:

Swipe 按一下 點選
移動選取範圍 作用中選取的專案 方向按鈕
在畫面上的UI元素之間移動選取範圍(焦點)(向上、左下、右)。 撥動可用來使用慣性快速捲動大型內容清單。 啟動選取的 (焦點中) 專案,或像遊戲中的主要按鈕一樣。 按兩下並按住可啟用關係型功能表或次要功能。 輕觸邊緣上的觸控表面,就像 D-Pad 上的方向按鈕一樣,根據點選的區域,向上、向下、向左或向右移動焦點。 視應用程式而定,可用來顯示隱藏的控件。

Apple 提供下列使用 Touch Surface 手勢的建議:

  • 區分點選和點選 - 按兩下是使用者的刻意動作,非常適合選擇、啟用和遊戲的主要按鈕。 點選比較微妙,應該謹慎使用,因為使用者通常會將 Siri 遠端放在手上,而且可能會輕易地啟動 Tap 事件。
  • 不要重新定義標準手勢 - 用戶預期特定手勢會執行特定動作,您不應該在應用程式中重新定義這些手勢的意義或功能。 其中一個例外是使用中遊戲期間的遊戲應用程式。
  • 不小心 定義新的手勢 - 同樣地,用戶預期特定手勢會執行特定動作。 您應該避免定義自定義手勢來執行標準動作。 同樣地,遊戲是最常見的例外,其中自定義手勢可以增加遊戲的樂趣、沉浸式遊戲。
  • 如果適用,請回應 D-Pad 點選 - 輕觸觸控表面的角落邊緣會像遊戲控制器上的 D-Pad 一樣,將焦點或方向向上、向下、向左或向右移動。 如果適用,您應該在應用程式或遊戲中回應這些手勢。

Siri 遠端按鈕

除了觸控 Surface 上的手勢之外,您的應用程式還可以回應使用者按兩下 Touch Surface 或按 [播放/暫停] 按鈕。 如果您使用遊戲控制器架構存取 Siri 遠端,您也可以偵測按下功能表按鈕。

此外,可以使用具有標準 UIKit 元素的手勢辨識器來偵測功能表按鈕按下。 如果您攔截按下的 [功能表] 按鈕,您將負責關閉目前的 [檢視] 和 [檢視控制器],並返回上一個按鈕。

重要

您應該一律將函式指派給遠端的 [播放/暫停] 按鈕。 擁有非功能性按鈕可以讓您的應用程式看起來與終端用戶中斷。 如果您沒有此按鈕的有效函式,請指派與主要按鈕相同的函式(Touch Surface Click)。

手勢和分鏡腳本

在 Xamarin.tvOS 應用程式中使用 Siri 遠端的最簡單方式是將手勢辨識器新增至介面設計工具中的檢視。

若要新增手勢辨識器,請執行下列動作:

  1. 方案總管 中,按兩下Main.storyboard檔案,然後開啟檔案以編輯介面設計工具。

  2. 文檔庫拖曳點選手勢辨識器,並將它放在 [檢視] 上:

    點選手勢辨識器

  3. 勾選 [屬性偵測器] 的 [按鈕] 區段中的 [選取]:

    檢查選取

  4. 選取 表示手勢會回應用戶按兩下 Siri 遠端上的 Touch Surface 。 您也可以選擇回應選單播放/暫停、向上向下向左向右按鈕。

  5. 接下來,從點選手勢辨識器連接動作,並呼叫它TouchSurfaceClicked

    點選手勢辨識器的動作

  6. 儲存變更並返回Visual Studio for Mac。

編輯您的檢視控制器 (範例 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
    }
}

低階事件處理

如果您要在 UIKit Xamarin.tvOS 應用程式中建立自定義類型(例如 UIView),您也可以透過事件提供低階按鈕按下 UIPress

UIPress事件是tvOS對iOS的事件,UITouch但會UIPress傳回Siri遠端或其他附加 藍牙裝置上按鈕按下的相關信息(例如遊戲控制器)。 UIPress 事件描述按下的按鈕及其狀態(開始、已取消、已變更或已結束)。

對於 藍牙 遊戲控制器等裝置上的類比按鈕,UIPress也會傳回套用至按鈕的強制量。 事件的 Type 屬性 UIPress 會定義哪些實體按鈕已變更狀態,而其餘的屬性則描述發生的變更。

下列程式代碼示範處理的低階 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事件覆寫,您應該實作這四個。

藍牙 遊戲控制器

除了隨附於 Apple TV 的標準 Siri 遠端之外,第三方、Made For iOS (MFI) 藍牙 Game Controllers 可與 Apple TV 配對,並用來控制您的 Xamarin.tvOS 應用程式。

藍牙 遊戲控制器

遊戲控制器可用來增強遊戲功能,並提供遊戲的沉浸感。 它們也可以用來控制標準 Apple TV 介面,因此使用不需要在遠端和控制器之間切換。

重要

藍牙 遊戲控制器是使用者可能購買的選擇性購買,您的應用程式無法強制用戶購買。 如果您的 app 支援遊戲控制器,它也必須支援 Siri 遠端,讓所有 Apple TV 使用者都能使用遊戲。

遊戲控制器在您的 tvOS 應用程式中具有下列功能和預期的使用方式:

功能 一般應用程式使用方式 遊戲應用程式使用方式
D-Pad 流覽 UI 元素(變更焦點)。 取決於遊戲。
A 啟動選取的 (焦點中) 專案。 執行主要按鈕函式,並確認對話框動作。
B 如果應用程式的主畫面上,會返回上一個畫面或結束至主畫面。 執行次要按鈕函式或返回上一個畫面。
X 啟動媒體播放或暫停/繼續播放。 取決於遊戲。
Y n/a 取決於遊戲。
功能表 如果應用程式的主畫面上,會返回上一個畫面或結束至主畫面。 暫停/繼續遊戲,如果應用程式的主畫面上,會返回上一個畫面或離開主畫面。
左肩按鈕 向左巡覽。 取決於遊戲。
左觸發程式 向左巡覽。 取決於遊戲。
右肩按鈕 向右流覽。 取決於遊戲。
右觸發程式 向右巡覽 取決於遊戲。
左遊戲桿 流覽 UI 元素(變更焦點)。 取決於遊戲。
右遊戲桿 n/a 取決於遊戲。

Apple 提供下列使用遊戲控制器的建議:

  • 確認遊戲控制器 連線 - 用戶可以隨時啟動和停止您的tvOS應用程式。 您應該一律檢查遊戲控制器在應用程式啟動時或喚醒時間是否存在,並視需要採取動作。
  • 請確定您的應用程式可在 Siri 遠端和遊戲控制器 上運作 - 不需要使用者在 Siri 遠端和遊戲控制器之間切換,才能使用您的應用程式。 使用這兩種類型的控制器來測試您的應用程式,以確保一切都很容易流覽,並如預期般運作。
  • 提供 [返回 ] - 按 [功能表] 按鈕一律會返回上一個畫面。 如果用戶位於主應用程式畫面,[功能表] 按鈕應該會返回AppleTV主畫面。 在遊戲期間,功能表按鈕應該會顯示警示,讓用戶能夠暫停/繼續遊戲或返回主功能表。

使用遊戲控制器

如上所述,除了隨附於Apple TV的標準 Siri 遠端之外,使用者可以選擇性地附加第三方「針對 iOS 製造」(MFI)藍牙 遊戲控制器,並用它來控制您的 Xamarin.tvOS 應用程式。

如果您的應用程式需要低階控制器輸入,您可以使用 Apple 的遊戲 控制器架構 來修改 tvOS:

遊戲控制器支援需求

如果您的 Xamarin.tvOS 應用程式支援遊戲控制器,Apple 有數個必須符合的特定需求:

  • 您必須支援 Siri 遠端 - 您必須支援 Siri 遠端。 您的遊戲無法要求第三方遊戲控制器可玩。
  • 您必須支援延伸控制器設定 - 所有 tvOS 遊戲控制器都是非表單型、擴充控制器。
  • 遊戲必須使用獨立控制器 進行遊戲 - 如果您的 app 支援擴充遊戲控制器,它必須只能與該遊戲控制器搭配使用。
  • 您必須支援 [播放/暫停] 按鈕 - 在遊戲期間,如果使用者按下 [播放/暫停] 按鈕,您應該顯示警示,讓使用者能夠暫停/繼續遊戲或返回主功能表。

啟用遊戲控制器支援

若要在 Xamarin.tvOS 應用程式中啟用遊戲控制器支援,請按兩下 Info.plist 方案總管 中的檔案以開啟它以進行編輯:

Info.plist 編輯器

在 [遊戲控制器] 區段底下,依 [啟用遊戲控制器] 進行檢查,然後檢查應用程式將支援的所有遊戲控制器類型。

使用 Siri 遠端作為遊戲控制器

Apple TV 隨附的 Siri 遠端可作為有限的遊戲控制器。 與其他遊戲控制器一樣,它會顯示在 Game Controller Framework 中做為 GCController 對象,並且同時支援 GCMotionGCMicroGamepad 設定檔。

Siri 遠端作為遊戲控制器使用時具有下列特性:

  • Touch Surface 可作為提供模擬輸入數據的 D 鍵板。
  • 遠端可用於直向或橫向,而您的應用程式會決定配置檔物件是否應該自動翻轉輸入數據。
  • 按兩下 Touch Surface 就像按下遊戲控制器上的按鈕 A 一樣。
  • [播放/暫停] 按鈕的作用就像遊戲控制器上的按鈕 X
  • [功能表] 按鈕應該會顯示警示,讓用戶能夠暫停/繼續遊戲或返回主功能表。

判斷遊戲控制器輸入

不同於 iOS,遊戲控制器事件可以與 Touch 事件平行接收,tvOS 會處理所有低階事件以提供高階 UIKit 事件。 因此,如果您需要存取低階遊戲控制器事件,則必須關閉 UIKit的默認行為。

在tvOS上,當您想要直接處理遊戲控制器輸入時,您需要使用 GCEventViewController (或子類別) 來顯示遊戲的使用者介面。 每當 GCEventViewController第一回應程式時,遊戲控制器輸入都會透過遊戲控制器架構擷取並傳遞至您的應用程式。

您可以使用 UserInteractionEnabled 類別的 GCEventViewController 屬性來切換事件處理和處理方式。

如需實作遊戲控制器支援的詳細資訊,請參閱Apple使用tvOS的應用程式程序設計指南和遊戲控制器程序設計指南中的<使用遊戲控制器>一節。

摘要

本文涵蓋隨附於 Apple TV、Touch Surface 手勢和 Siri 遠端按鈕的新 Siri 遠端。 接下來,它涵蓋使用手勢和分鏡腳本、手勢和程序代碼和低階事件。 最後,如果討論使用遊戲控制器。