追跡可能なタイル通知

追跡可能なタイル通知を使用すると、ユーザーがタイルをクリックしたときにアプリのライブ タイルにどのタイル通知が表示されていたかを特定することができます。
たとえば、ニュース アプリでは、この機能を使用して、ユーザーがライブ タイルを起動したときに表示されていたニュース ストーリーを特定できます。これにより、ユーザーが見つけられるようにストーリーが目立つように表示される可能性があります。

重要

Anniversary Update が必須: C#、C++、または VB ベースの UWP アプリで追跡可能なタイル通知を使用するには、SDK 14393 をターゲットとし、ビルド 14393 以降を実行している必要があります。 JavaScript ベースの UWP アプリの場合は、SDK 17134 をターゲットとし、ビルド 17134 以降を実行している必要があります。

重要な API: LaunchActivatedEventArgs.TileActivatedInfo プロパティTileActivatedInfo クラス

しくみ

追跡可能なタイル通知を有効にするには、トースト通知ペイロードの launch プロパティと同様に、タイル通知ペイロードの Arguments プロパティを使用して、タイル通知にコンテンツに関する情報を埋め込みます。

ライブ タイルを使用してアプリを起動すると、現在または最近表示されたタイル通知から引数の一覧が返されます。

追跡可能なタイル通知を使用する場合

追跡可能なタイル通知は、通常、ライブ タイルで通知キューを使用している場合に使用されます (つまり、最大 5 つの異なる通知を循環します)。 また、ライブ タイルのコンテンツがアプリの最新のコンテンツと同期していない可能性がある場合にも役立ちます。 たとえば、ニュース アプリはライブ タイルを 30 分ごとに更新しますが、アプリを起動すると、最新のニュースが読み込まれます (最後のポーリング間隔のタイルに含まれていない可能性があります)。 これが起こると、ユーザーはライブ タイルで見たストーリーが見つからないことにイライラする可能性があります。 ここでは、追跡可能なタイル通知を使用して、ユーザーがタイルで見たものを簡単に検出できるようにすることで役立ちます。

追跡可能なタイル通知の操作

注意すべき最も重要な点は、ほとんどのシナリオでは、ユーザーがタイルをクリックしたときにタイル上にあった特定の通知に直接移動しないでください。 ライブ タイルは、アプリケーションへのエントリ ポイントとして使用されます。 ユーザーがライブ タイルをクリックすると、(1) アプリを正常に起動するか、(2) ライブ タイル上の特定の通知に関する詳細情報を表示する必要がある、という 2 つのシナリオが考えられます。 ユーザーが望む動作を明示的に言う方法がないため、理想的なエクスペリエンスは、ユーザーが見た通知が簡単に見つかるようにしながら、アプリを正常に起動することです。

たとえば、MSN ニュース アプリのライブ タイルをクリックすると、通常どおりにアプリが起動します。ホーム ページや、ユーザーが以前に読んでいた記事が表示されます。 ただし、ホーム ページでは、アプリによってライブ タイルのストーリーが簡単に見つかりやすくなります。 そうすることで、両方のシナリオがサポートされます。単にアプリを起動または再開するシナリオと、特定のストーリーを表示するシナリオです。

タイル通知ペイロードに Arguments プロパティを含める方法

通知ペイロードでは、arguments プロパティを使用して、後で通知を識別するために使用できるデータをアプリで提供できます。 たとえば、引数にストーリーの ID が含まれている場合、起動するとストーリーを取得して表示できます。 このプロパティは文字列を受け入れます。これは好きなようにシリアル化できますが (クエリ文字列、JSON など)、通常はクエリ文字列形式をお勧めします。これは軽量で XML エンコードが適切であるためです。

このプロパティは TileVisual 要素と TileBinding 要素の両方で設定でき、カスケードダウンされます。 すべてのタイル サイズで同じ引数が必要な場合は、TileVisual に引数を設定するのみです。 特定のタイル サイズに対して特定の引数が必要な場合は、個々の TileBinding 要素に引数を設定できます。

この例では、後で通知を識別できるように、arguments プロパティを使用する通知ペイロードを作成します。

// Uses the following NuGet packages
// - Microsoft.Toolkit.Uwp.Notifications
// - QueryString.NET
 
TileContent content = new TileContent()
{
    Visual = new TileVisual()
    {
        // These arguments cascade down to Medium and Wide
        Arguments = new QueryString()
        {
            { "action", "storyClicked" },
            { "story", "201c9b1" }
        }.ToString(),
 
 
        // Medium tile
        TileMedium = new TileBinding()
        {
            Content = new TileBindingContentAdaptive()
            {
                // Omitted
            }
        },
 
 
        // Wide tile is same as Medium
        TileWide = new TileBinding() { /* Omitted */ },
 
 
        // Large tile is an aggregate of multiple stories
        // and therefore needs different arguments
        TileLarge = new TileBinding()
        {
            Arguments = new QueryString()
            {
                { "action", "storiesClicked" },
                { "story", "43f939ag" },
                { "story", "201c9b1" },
                { "story", "d9481ca" }
            }.ToString(),
 
            Content = new TileBindingContentAdaptive() { /* Omitted */ }
        }
    }
};

アプリの起動時に arguments プロパティをチェックする方法

ほとんどのアプリには、OnLaunched メソッドのオーバーライドを含む App.xaml.cs ファイルがあります。 その名前が示すように、アプリは起動時にこのメソッドを呼び出します。 単一の引数 LaunchActivatedEventArgs オブジェクトを受け取ります。

LaunchActivatedEventArgs オブジェクトには、追跡可能な通知を有効にするプロパティ (TileActivatedInfo オブジェクトへのアクセスを提供する TileActivatedInfo プロパティ) があります。 ユーザーが (アプリ一覧、検索、またはその他のエントリ ポイントではなく) タイルからアプリを起動すると、アプリはこのプロパティを初期化します。

TileActivatedInfo オブジェクトには、RecentlyShownNotifications というプロパティが含まれています。このプロパティには、過去 15 分以内にタイルに表示された通知の一覧が含まれています。 一覧の最初の項目は現在タイル上の通知を表し、後続の項目は、ユーザーが現在のアイテムの前に表示した通知を表します。 タイルがクリアされている場合、この一覧は空です。

各 ShownTileNotification には Arguments プロパティがあります。 Arguments プロパティは、タイル通知ペイロードの引数文字列で初期化されます。ペイロードに引数文字列が含まれていない場合は null になります。

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    // If the API is present (doesn't exist on 10240 and 10586)
    if (ApiInformation.IsPropertyPresent(typeof(LaunchActivatedEventArgs).FullName, nameof(LaunchActivatedEventArgs.TileActivatedInfo)))
    {
        // If clicked on from tile
        if (args.TileActivatedInfo != null)
        {
            // If tile notification(s) were present
            if (args.TileActivatedInfo.RecentlyShownNotifications.Count > 0)
            {
                // Get arguments from the notifications that were recently displayed
                string[] allArgs = args.TileActivatedInfo.RecentlyShownNotifications
                .Select(i => i.Arguments)
                .ToArray();
 
                // TODO: Highlight each story in the app
            }
        }
    }
 
    // TODO: Initialize app
}

デスクトップ アプリケーションからの OnLaunched へのアクセス

デスクトップ ブリッジを使用するデスクトップ アプリ (WPF など) でも追跡可能なタイルを使用できます。 唯一の違いは OnLaunched 引数へのアクセスです。 まず、デスクトップ ブリッジでアプリをパッケージ化する必要があることに注意してください。

重要

October 2018 Update が必要: AppInstance.GetActivatedEventArgs() API を使用するには、SDK 17763 をターゲットとし、ビルド 17763 以降を実行している必要があります。

デスクトップ アプリケーションの場合、起動引数にアクセスするには、次のようにします。


static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // API only available on build 17763 or later
    var args = AppInstance.GetActivatedEventArgs();
    switch (args.Kind)
    {
        case ActivationKind.Launch:

            var launchArgs = args as LaunchActivatedEventArgs;

            // If clicked on from tile
            if (launchArgs.TileActivatedInfo != null)
            {
                // If tile notification(s) were present
                if (launchArgs.TileActivatedInfo.RecentlyShownNotifications.Count > 0)
                {
                    // Get arguments from the notifications that were recently displayed
                    string[] allTileArgs = launchArgs.TileActivatedInfo.RecentlyShownNotifications
                    .Select(i => i.Arguments)
                    .ToArray();
     
                    // TODO: Highlight each story in the app
                }
            }
    
            break;

未加工 XML の例

Notifications ライブラリの代わりに生の XML を使用している場合は、XML を次に示します。

<tile>
  <visual arguments="action=storyClicked&amp;story=201c9b1">
 
    <binding template="TileMedium">
       
      <text>Kitten learns how to drive a car...</text>
      ... (omitted)
     
    </binding>
 
    <binding template="TileWide">
      ... (same as Medium)
    </binding>
     
    <!--Large tile is an aggregate of multiple stories-->
    <binding
      template="TileLarge"
      arguments="action=storiesClicked&amp;story=43f939ag&amp;story=201c9b1&amp;story=d9481ca">
   
      <text>Can your dog understand what you're saying?</text>
      ... (another story)
      ... (one more story)
   
    </binding>
 
  </visual>
</tile>