Xamarin での watchOS コンプリケーション

watchOS を使用すると、開発者はウォッチの文字盤用のカスタム コンプリケーションを記述できます

このページでは、使用できるさまざまな種類のコンプリケーションと、watchOS 3 アプリにコンプリケーションを追加する方法について説明します。

各 watchOS アプリケーションには、コンプリケーションが 1 つだけ含まれる可能性があることに注意してください。

まず、Apple のドキュメントを読んで、アプリがコンプリケーションに適しているかどうかを判断します。 5 種類の CLKComplicationFamily のディスプレイから選択できます。

The 5 CLKComplicationFamily types available: Circular Small, Modular Small, Modular Large, Utilitarian Small, Utilitarian Large

アプリは、表示されるデータに応じて、1 つのスタイルを実装することも、 5 つすべてを実装することもできます。 また、ユーザーが Digital Crown を回す際に過去や将来の時刻の値を提供する Time Travel をサポートすることもできます。

コンプリケーションの追加

構成

コンプリケーションは、作成時にウォッチ アプリに追加することも、既存のソリューションに手動で追加することもできます。

新しいプロジェクトを追加します...

[新しいプロジェクトの追加...] ウィザードには、コンプリケーション コントローラー クラスを自動的に作成し、Info.plist ファイルを構成するチェックボックスが含まれています。

The Include Complication checkbox

既存のプロジェクト

既存のプロジェクトにコンプリケーションを追加するには、次の操作を行います。

  1. 新しい ComplicationController.cs クラス ファイルを作成し、CLKComplicationDataSource を実装します。
  2. アプリの Info.plist を構成して、コンプリケーションと、コンプリケーション ファミリがサポートされている ID を公開します。

これらの手順については以下にさらに詳しく説明します。

CLKComplicationDataSource クラス

次の C# テンプレートには、CLKComplicationDataSource を実装するために最低限必要なメソッドが含まれています。

[Register ("ComplicationController")]
public class ComplicationController : CLKComplicationDataSource
{
  public ComplicationController ()
  {
  }
  public override void GetPlaceholderTemplate (CLKComplication complication, Action<CLKComplicationTemplate> handler)
  {
  }
  public override void GetCurrentTimelineEntry (CLKComplication complication, Action<CLKComplicationTimelineEntry> handler)
  {
  }
  public override void GetSupportedTimeTravelDirections (CLKComplication complication, Action<CLKComplicationTimeTravelDirections> handler)
  {
  }
}

コンプリケーションを書く手順に従って、このクラスにコードを追加します。

Info.plist

ウォッチ拡張機能の Info.plist ファイルでは、CLKComplicationDataSource の名前と、サポートするコンプリケーション ファミリを指定する必要があります。

The complication family types

[データ ソース クラス] エントリ一覧には、コンプリケーション ロジックを含む CLKComplicationDataSource サブクラスをサブクラス化するクラス名が表示されます。

CLKComplicationDataSource

すべてのコンプリケーション機能は単一クラスに実装され、CLKComplicationDataSource 抽象クラス (ICLKComplicationDataSource インターフェイスを実装します) からメソッドをオーバーライドします。

必須のメソッド

コンプリケーションを実行するには、次のメソッドを実装する必要があります。

  • GetPlaceholderTemplate - 構成中、またはアプリが値を指定できない場合に使用される静的表示を返します。
  • GetCurrentTimelineEntry - コンプリケーションが実行されているときに正しい表示を計算します。
  • GetSupportedTimeTravelDirections - CLKComplicationTimeTravelDirections (NoneForwardBackwardForward | Backward など) からオプションを返します。

プライバシー

個人データを表示するコンプリケーション

  • GetPrivacyBehavior - CLKComplicationPrivacyBehavior.ShowOnLockScreen または HideOnLockScreen

このメソッドが HideOnLockScreen を返す場合、ウォッチがロックされているとコンプリケーションにアイコンまたはアプリケーション名が表示されます (データは表示されません)。

更新プログラム

  • GetNextRequestedUpdateDate - オペレーティング システムが次にアプリにコンプリケーションのデータ表示の更新に関するクエリを実行する必要がある時刻を返します。

iOS アプリから強制的に更新することもできます。

Time Travel のサポート

Time Travel のサポートは省略可能で、GetSupportedTimeTravelDirections メソッドによって制御されます。 ForwardBackward、またはForward | Backward を返す場合、次のメソッドを実装する必要があります

  • GetTimelineStartDate
  • GetTimelineEndDate
  • GetTimelineEntriesBeforeDate
  • GetTimelineEntriesAfterDate

コンプリケーションの書き込み

コンプリケーションは、単純なデータ表示から、Time Travel でサポートされる複雑なイメージやデータのレンダリングまで多岐に及びます。 以下のコードは、シンプルな単一テンプレートのコンプリケーションを構築する方法を示しています。

サンプル コード

この例では、UtilitarianLarge テンプレートのみをサポートしているため、その種のコンプリケーションをサポートする特定のウォッチの文字盤でのみ選択できます。 ウォッチでコンプリケーションを選択すると、[マイ コンプリケーション] が表示され、実行中[分] [時間] (時刻の一部) が表示されます。

[Register ("ComplicationController")]
public class ComplicationController : CLKComplicationDataSource
{
    public ComplicationController ()
    {
    }
    public ComplicationController (IntPtr p) : base (p)
    {
    }
    public override void GetCurrentTimelineEntry (CLKComplication complication, Action<CLKComplicationTimelineEntry> handler)
    {
        CLKComplicationTimelineEntry entry = null;
    var complicationDisplay = "MINUTE " + DateTime.Now.Minute.ToString(); // text to display on watch face
        if (complication.Family == CLKComplicationFamily.UtilitarianLarge)
        {
            var textTemplate = new CLKComplicationTemplateUtilitarianLargeFlat();
            textTemplate.TextProvider = CLKSimpleTextProvider.FromText(complicationDisplay); // dynamic display
            entry = CLKComplicationTimelineEntry.Create(NSDate.Now, textTemplate);
        } else {
            Console.WriteLine("Complication family timeline not supported (" + complication.Family + ")");
        }
        handler (entry);
    }
    public override void GetPlaceholderTemplate (CLKComplication complication, Action<CLKComplicationTemplate> handler)
    {
        CLKComplicationTemplate template = null;
        if (complication.Family == CLKComplicationFamily.UtilitarianLarge) {
            var textTemplate = new CLKComplicationTemplateUtilitarianLargeFlat ();
            textTemplate.TextProvider = CLKSimpleTextProvider.FromText ("MY COMPLICATION"); // static display
            template = textTemplate;
        } else {
            Console.WriteLine ("Complication family placeholder not not supported (" + complication.Family + ")");
        }
        handler (template);
    }
    public override void GetSupportedTimeTravelDirections (CLKComplication complication, Action<CLKComplicationTimeTravelDirections> handler)
    {
        handler (CLKComplicationTimeTravelDirections.None);
    }
}

コンプリケーション テンプレート

コンプリケーション スタイルごとにさまざまなテンプレートを使用できます。 [リング] テンプレートを使用すると、コンプリケーションの周りに進行状況スタイルのリングを表示できます。これは、進行状況やその他の値をグラフィカルに表示するために使用できます。

Apple の CLKComplicationTemplate ドキュメント

円形 - 小

これらのテンプレート クラス名には、すべて CLKComplicationTemplateCircularSmall がプレフィックスとして付いています。

  • RingImage - その周りに進行状況リングが付いた単一イメージを表示します。
  • RingText - その周りに進行状況リングが付いた 1 行のテキストを表示します。
  • SimpleImage - 小さな単一イメージのみを表示します。
  • SimpleText - テキストの小さなスニペットのみを表示します。
  • StackImage - イメージと 1 行のテキストが上下に並んで表示されます
  • StackText - 2 行のテキストを表示します。

モジュラー - 小

これらのテンプレート クラス名には、すべて CLKComplicationTemplateModularSmall がプレフィックスとして付いています。

  • ColumnsText - テキスト値の小さなグリッド (2 行 2 列) を表示します。
  • RingImage - その周りに進行状況リングが付いた単一イメージを表示します。
  • RingText - その周りに進行状況リングが付いた 1 行のテキストを表示します。
  • SimpleImage - 小さな単一イメージのみを表示します。
  • SimpleText - テキストの小さなスニペットのみを表示します。
  • StackImage - イメージと 1 行のテキストが上下に並んで表示されます
  • StackText - 2 行のテキストを表示します。

モジュラー - 大

これらのテンプレート クラス名には、すべて CLKComplicationTemplateModularLarge がプレフィックスとして付いています。

  • Columns - 3 x 2 のグリッドを表示します。必要に応じて、各行の左側にイメージを含めます。
  • StandardBody - 2 行のプレーン テキストを含む太字のヘッダー文字列を表示します。 ヘッダーは、必要に応じて左側にイメージを表示できます。
  • Table - 太字のヘッダー文字列を表示し、その下に 2 x 2 のテキスト グリッドを表示します。 ヘッダーは、必要に応じて左側にイメージを表示できます。
  • TallBody - 太字のヘッダー文字列を表示し、その下に大きいフォントの 1 行のテキストを表示します。

Utilitarian - 小

これらのテンプレート クラス名には、すべて CLKComplicationTemplateUtilitarianSmall がプレフィックスとして付いています。

  • Flat - イメージとテキストを 1 行に表示します (テキストは短くする必要があります)。
  • RingImage - その周りに進行状況リングが付いた単一イメージを表示します。
  • RingText - その周りに進行状況リングが付いた 1 行のテキストを表示します。
  • Square - 正方形の画像 (38 mm または 42 mm Apple Watch の場合は 40 ピクセル四方または 44 ピクセル四方の正方形) を表示します。

Utilitarian - 大

このコンプリケーション スタイルのテンプレートは 1 つだけです: CLKComplicationTemplateUtilitarianLargeFlat。 単一イメージとテキストがすべて 1 行に表示されます。