この記事は Windows Store App Advent Calendar 2013 の記事になります。

Windows8.1でライブタイルの大きさが4種類に増えるなど、変更があったライブタイルですが、このライブタイル、活用されている開発者の方はどれぐらいいるのでしょうか?

タイルとバッジのガイドライン (Windows ストア アプリ)

http://msdn.microsoft.com/ja-jp/library/windows/apps/hh465403.aspx

ガイドラインには、デザインや表示内容について細かく指定されていますが、タイルの効果的な更新などについては急にトーンダウンして具体例が減っています。具体的にライブタイルを使ってユーザーへのレコメンドを行いたい時はどうするのか?といった方法については、特に具体例がなく、MSDNのこのメソッドを使え、というリンクがあるぐらいです。

さて、まずライブタイルを使ったことが無い人向けに、簡単にライブタイルでできることをまとめます。

  • 登録できるライブタイルは5つまで
  • デザインはテンプレートの中から選択する
  • 指定したタイミングでライブタイルを更新できる
  • 古くなったライブタイルは自動的に削除される

こんなことができます。メールの未読数などについては、ライブタイルではなくバッジを使って表示するべき、とガイドラインに書かれていますので、ライブタイルは「画像+テキスト」を使ってユーザーに何かを伝達するのが基本の設計となっています。

ライブタイルは5つまでのキューを登録することができます。この情報は【通知キューを使う方法 (JavaScript と HTML を使った Windows ストア アプリ)】の最初に記載されています。

さて、ライブタイルにはいくつかの方法で更新する方法があります。【タイルとバッジのガイドライン (Windows ストア アプリ)】に記載されている方法では以下の4種類です。

  • ローカル API 呼び出し
  • ローカル コンテンツを使った、1 回限りのスケジュールされた通知
  • クラウド サーバーから送信されるプッシュ通知
  • 一定の間隔でクラウド サーバーから情報を取得する定期的な通知

さらに、これを詳しく紹介したページが【通知配信方法の選択 (Windows ストア アプリ)】になります。今後はこのページの情報を元に説明していきます。

■ローカルAPI呼び出し

【クイック スタート: タイルの更新の送信 (C#/VB/C++ と XAML を使った Windows ストア アプリ)】を参照しながら、動的にタイルのXMLを生成していきます。詳しくは説明しませんので、前述のページを参考にしてください。

XMLの構築が完了したら、次のメソッドでタイルを更新します。

TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification);

この場合、Manifestで指定したタイルを破棄して、上記で生成したタイルを表示します。Expire期間が過ぎると自動的にManifestで指定したタイルに戻ります。これが一番簡単なライブタイルになります。

■ローカル コンテンツを使った、1 回限りのスケジュールされた通知

タイル通知をスケジュールする方法 (C#/VB/C++ と XAML を使った Windows ストア アプリ)】を参照して、表示タイミングを設定してライブタイルを登録する方法です。これも1回限りですので、Expireが来ると削除されます。

ザックリ飛ばして、XMLにタイル情報を設定したら次のメソッドでマネージャーに登録しましょう。

TileUpdateManager.createTileUpdaterForApplication().AddToSchedule(scheduledTile);

■クラウド サーバーから送信されるプッシュ通知

プッシュ通知の送信 (C#/VB/C++ と XAML を使った Windows ストア アプリ)】を参照してください。WNSを使うので説明が非常に長くなります。今回発生する怪は、このWNSを使うと発生しないので、この方法が一番確実な気がします。Azureとの組み合わせてください。

■一定の間隔でクラウド サーバーから情報を取得する定期的な通知

タイルの定期的な通知を設定する方法 (C#/VB/C++ と XAML を使った Windows ストア アプリ)】を参照します。この定期的な通知が、今回の『ライブタイルの怪 その1』になります。

これもザックリ飛ばして、URI先からXMLを取得する部分を説明します。

using Windows.UI.Notifications;

PeriodicUpdateRecurrence recurrence = PeriodicUpdateRecurrence.Hour;
System.Uri url = new System.Uri(polledUrl);

TileUpdateManager.CreateTileUpdaterForApplication().StartPeriodicUpdate(url, recurrence);

StartPeriodicUpdate(url, recurrence); で実際にライブタイルを取得するキューを追加しています。この場合はrecurrenceの繰り返しタイミングのキューを即時追加になります。

TileUpdater.StartPeriodicUpdate | startPeriodicUpdate Methods】を見ると、

StartPeriodicUpdate(Uri, DateTime, PeriodicUpdateRecurrence) Begins a series of timed updates for the tile that the updater is bound to. Update content is retrieved from a specified Uniform Resource Identifier (URI). Updates begin at a specified time.

というメソッドがあるので、DateTimeを設定してやれば、ディレイしてライブタイルを更新出来るはずです。『指定した時刻に更新は開始します。』って書いてあります。

DateTimeで指定された時刻にポーリングするが、その前にStartPeriodicUpdateを呼んだ時点ですでにポーリングを行っているので、都合2回アクセスしに来る。

という謎の挙動をします。アプリが終了してから30分後に通知しよう…あれ?もうポーリング来ちゃってる。みたいなことになりました。

ここまで、ライブタイルの登録方法について解説しました。次は、『ライブタイルでやってはいけない&意味不明な挙動』を紹介します。

■ライブタイルのTileデーターは、対応するタイルのXMLが無いと現在のタイル情報をそのまま表示するので、いつまで経っても更新されていないように見えることがある

これについては、【タイルとバッジのガイドライン】でちょっとだけ触れているのですが、アプリケーションがManifest中にSmall/Square/Widde/Largeを登録した分だけ、ライブタイルとして表示されるようになります。Wideを指定しないのにライブタイルでWideを出そうとしても、そもそもWideのタイルに設定できないので表示することが出来ません。

では、『4種類のタイルサイズ全部入れるけど、Wideはデフォルトだけでいいやー』という場合に『ライブタイルの怪 その2』が発生します。

ライブタイルでデータが不足している場合の動作

ライブタイルでデータが不足している場合の動作

上記の図のように、SquareとLargeは細かい更新をするが、Wideには表示するものが無いのでデフォルトの物を使いたい、という場合上記のような動作をします。

ところが、(2)や(3)から(1)のTileデータに戻るときには、W1→W1にページめくりの動作をするという変な挙動をします。同じタイルなのですから、通常のライブタイルのようにアニメーションしなくていいのですが、OS側はそもそもそういう動作を想定してないのか、同じタイルであろうがアニメーションさせます。

次に、S1とS2の更新タイミングにも、「いつまでも更新されない…と思ったら自分自身がまた表示された!」という『ライブタイルの怪 その3』が発生します。これは【タイルとタイル通知の概要 (Windows ストア アプリ)】に書いてある、『タイル通知の循環ー通知はランダムに表示されますが、新しいコンテンツが多めに表示されます。表示順序は Windows によって決定されます。特定の表示順序には依存しません。』が原因です。

(3)にはSquareの定義が無いため、直前のデータが引き続き表示されます。そのため、内部のキューが次のように(1)→(2)→[3]→[3]→[3]→(2)→(1)といった感じで並んだ場合、ライブタイル上は(1)→(2)→→→(2)→(1)となり、→→→の間ひたすら待たされた挙句、(2)が表示されてズッコける、ということが発生します。

これを回避するためには、全部のライブタイルの定義はサボらずに全部のサイズを定義する。その際に同じタイルデザインが被らないようにする、ということで回避できます。

以上、Windows8ストアアプリを作成した際に、ライブタイルでハマった怪についての説明と対策でした。文章でライブタイルの動作を説明するのは非常に大変です…

細かい制御を行いたい場合は、WNSを使いましょう!こっちならOSのNotificationQueueに対して、外部から任意のタイミングで通知を送れます。アプリ内からやりくりしようとしても、バックグラウンドに回ってるうちにプロセスが死んでいたりして、思ったように実装できない(できなかった)という結末になります。

明日 12/7 の担当は CH3COOH@github さんです。