Windows 8 では、ユーザーは常につながった状態でいられます。つながる対象は、インターネット、クラウド サービス、その他の Windows 8 PC などですが、皆さんのアプリも、ローミング アプリ データを活用することで、この常につながり合うエコシステムに参加することができます。この記事では、ローミング アプリ データについて詳しくお伝えします。概要やその重要性はもちろん、何よりも伝えたいことは、いかに簡単にローミングをアプリに実装できるかということです。

データをローミングする理由

Windows 8 では、Windows とのつながりを感じられるために欠かすことができない個人設定のローミングを、デスクトップ テーマ、背景、ブラウザーのお気に入りなどのさまざまな設定で実行します。しかし Windows 自体は、ユーザーの個人設定のそれほど大きな部分を占めているわけではありません。常に接続された Windows 8 のエクスペリエンスを形成する基盤となるのはアプリです。Windows ユーザーが楽しいと感じ、彼らがそのほとんどの時間を使うのは、皆さんのアプリに他なりません。Bing 天気や Bing スポーツのようなマイクロソフトのアプリもローミング エクスペリエンスを提供しますが、皆さんの協力なしでは、常につながる Windows 8 という私たちのビジョンを完成させることはできません。

クラウドへのローミングも、ユーザーの利便性を高め、皆さんのアプリをライバルと差別化できる、時代の流れに乗った魅力的な対応です。ローミング対応の優れた Metro スタイル アプリでは、ユーザーが一度構成した内容がどこにいても再現され、別の PC で同じアプリにアクセスしたときに改めて構成し直す必要がありません。ユーザーが PC を乗り換えた場合にもエクスペリエンスが継続されるため、場所にかかわらず常につながっていることができます。

ローミングを簡素化する取り組み

私たちがローミング アプリ データを実現するにあたっては、こうしたローミング エクスペリエンスをいかに簡単に実現するかが目標となりました。面倒で複雑な同期部分のしくみを、開発者の皆さんからいかに遠ざけるかということです。私たちは、ユーザーが構成可能な全項目を皆さんが簡単にローミングできるようにすることを目指しました。

Windows 8 では、あらゆる Metro スタイル アプリのアプリケーション データ (英語) のローミング同期を統合することで、この目標を実現しています。ここで活用されているのが、ユーザーが所有する Microsoft アカウントの連携性です。ApplicationData は、ローカリティと呼ばれる、ローカル、ローミング、一時の 3 種類のデータに分割されます。ここでは、皆さんのアプリのデータをローミング ローカリティに書き込むだけで、連携された Microsoft アカウントと同期されるデータに、アプリを参加させることができます。つまりこれだけで、同期関係の管理、ID とログインの設定、何らかのサービスの購入や管理、その他多くの面倒な処理が必要なくなり、すべての処理を Windows に任せることができます。皆さんに求められることは、どのデータをローミングするか、これらのメリットをいかにアプリの設計に反映するかということだけです。Windows に接続したユーザーは、同時に皆さんのアプリにも接続することになります。

コンピューター、ローカル ストレージ、クラウド ストレージ間のデータのやり取りを示すフロー チャート

ユーザー データ vs. アプリ データ

実際の説明の前に、ローミング エクスペリエンスを開発する場合に理解する必要がある、ユーザー データとアプリ データの違いについて説明しましょう。ユーザー データは、ユーザーがアプリを使う中で作成し管理するデータです。代表的なものはドキュメント、音楽、映像、画像などがありますが、ユーザーが自分にとって価値があると考えるデータや、複数のアプリ間で共有されるデータはすべてユーザー データです。この種類のデータは、いずれかの KnownFolder (英語) ライブラリに保存し、SkyDrive API を使ってローミングする必要があります。パスワードは常に PasswordVault (英語) を使って保存、ローミングします。一方このブログ記事で取り扱うのは、たとえばアプリの設定、個人設定、状態など、アプリが作成し管理するデータです。ユーザー データとアプリ データの違いと、それぞれのローミング方法について以下の表をご覧ください。

ユーザー データ

アプリ データ

複数のアプリが使用できる

データを作成したアプリだけに有効

ドキュメント、音楽、画像、エクスポート データ

設定、個人設定、コンテキスト、アプリの状態

SkyDrive を使ってクラウドに保存

ApplicationData を使ってローミング

「一度構成するだけで、どこででも使える」ようにするには

では、「一度構成するだけで、どこででも使える」ようなエクスペリエンスについて、簡単な例から説明していきます。ここでは、一連のフィード項目を読むためのシンプルな RSS リーダー アプリを想定します。特定のフィードを表示すると、アプリはページごとに一定数の項目を表示します。ここでは、ユーザーが構成可能な設定として、1 ページに表示するフィード項目の数を制御する ItemsPerPage があります。ここで実現したいことは、ユーザーが PC 上でこの設定を変更したら、このアプリがインストールされている別の PC に設定がローミングされるようにすることです。設定のローミングを有効にするには、ApplicationData クラスにある RoamingSettings (英語) プロパティの値として ItemsPerPage を記述するだけです。

JS:

Windows.Storage.ApplicationData.current.roamingSettings.values[“ItemsPerPage”] = 10

C#:

Windows.Storage.ApplicationData.Current.RoamingSettings.Values[“ItemsPerPage”] = 10;

これだけです。同期のしくみの部分はすべて Windows が処理することによって、このユーザーが所有する、このアプリがインストールされているすべての PC で設定が同期されるようになります。開発者はこれ以上処理を付け加える必要はありません。通常この設定は、アプリの設定チャームからユーザーに表示します。既定では、すべてのアプリの設定をローミングすることを強くお勧めします。設定によってはコンピューターに固有のものがありますが、これらの設定はローミング用の場所に保存しないでください。

設定ではなくファイルに書き込む場合は、Application Data (英語) が提供する RoamingFolder (英語) を使います。動作は RoamingSettings と同じです。データのローミングにファイルを使う場合は、ファイルへの書き込みが完了した時点で、そのファイルに対して開かれたハンドルをすべて閉じる必要があります。開いているハンドルがあるファイルはローミングされません。

ローミングのクォータを計画する

皆さん全員がシンプルな設定をアプリで使うのであれば、今まで説明した内容が必要な情報のすべてです。しかしたとえば、お気に入りの一覧、コレクション、より量の多いデータをローミングする場合もこれで問題ないのか、データ量はどのくらいまで許容されるのかという疑問はないでしょうか。ローミング アプリ データは設定と個人設定のローミングに最適化されていて、こうした種類のデータにとって十分なストレージ上限がアプリごとに適用されます。このクォータによって、システム リソースへの負担が回避されます。バッテリ寿命の確保とシステム パフォーマンスは Windows 8 の重要な特性ですが、私たちが適用する上限によって、ローミング エクスペリエンスがこれらの特性を損なってしまうことがなくなります。このクォータは、ApplicationData の RoamingStorageQuota (英語) プロパティを使って取得でき、この記事の執筆時点のクォータは 100 KB です。クォータの制限内で動作させる最適な方法は、設計時にアプリのデータ使用量を計画して、使用量がクォータを超過しないようにすることです。

では、RoamingStorageQuota を超過した場合に何が起こるかといえば、何も起こりません。正確に言うと、ローミングは行われません。アプリが中断することはなく、ローミング用の場所でのデータの読み書きも続行されますが、ローミング用の場所にあるローミング データの合計量が RoamingStorageQuota を下回るまで、データはクラウドに同期されません。

私たちが見てきた中で、ローミング データの使用量が適切に計画されていないアプリに共通する失敗は、コンテンツへの参照ではなくコンテンツそのものをローミングしているケースです。たとえば、お気に入りのニュース記事のセットをローミングする場合、記事の識別子または URL をローミングするべきで、記事そのものをローミングするべきではありません。クォータの浪費、領域の無駄使いに最も近道なのが、利用可能なコンテンツへの参照ではなく生データをローミングすることです。実際のコンテンツそのものではなくコンテンツへの識別子をローミングすることで、ローミングのしくみを最大限に活用できます。

アプリを計画する場合は、使用するデータ セットをあまりに広く規定しないことが重要です。アプリのローミングを常にクォータ以下に抑えるには、お気に入り一覧のような際限のないデータ セットを制限することが必要です。RSS フィード リーダーの例で話を続けましょう。RSS フィードの一覧を保存したいわけですが、この一覧はユーザーが管理しています。この保存を行うには、何もしない状態だと際限がなくなるものを、上限を適用できる何らかのものに変換することが必要です。頭の中で計算してみましょう。RSS フィードの一覧に 20 KB を割り当てたいとします。単純化するため、大きめに見積もって 1 件の URL あたり 80 バイトを割り当てるとしましょう。このサイズだと、20 KB に 250 件の URL を入れることができます。短縮 URL を使えばさらに小さくできますが、250 件でも、アプリで必要になるであろう数は優に超えているはずです。後は、この値に制限を設定し、フィード一覧をファイルに書き込み、RoamingFolder に保存すれば、後は処理を任せることができます。

PC を変えてもエクスペリエンスが中断されないようにする

アプリに追加できるもう 1 つのすばらしいローミング エクスペリエンスが、複数の PC にわたってユーザー エクスペリエンスが維持されることです。自宅のデスクトップで、前述のリーダー アプリを使ってフィードを追っているユーザーが、バスで移動するとします。移動中そのユーザーが Windows 8 タブレットを取り出して同じアプリを開いたとしましょう。ここで実現したいことは、ユーザーがデスクトップ PC で中断したところからフィードの確認を再開できることです。この中断のないエクスペリエンスを実現するには、ユーザーの実行内容のコンテキストを保持してローミングする必要があります。

これは、処理的にはその他のあらゆる設定のローミングと同じですが、このシナリオが他の大部分の設定と少し異なる点があります。それはユーザーがフィードを非常に高速に閲覧することで設定が頻繁に変わるという点です。その他の設定では通常こうしたことは起きません。さらにユーザーが喜ぶエクスペリエンスを実現するためには、ユーザーが最後に行っていた内容がデータに正確に反映されている必要があります。こうしたユーザー ニーズに対応するため、私たちはこのエクスペリエンスの処理専用に設計された独自の設定名を作成しました。それが HighPriority です。この使用方法は、RoamingSettings のルート コンテナーで設定に HighPriority という名前を付けるだけです。HighPriority はその他すべての設定と同様に使うことができます。ローミング エンジンによってこの設定がその他のローミング データよりも高速にローミングされることで、ここで求められるエクスペリエンスが実現されます。

前述のフィード リーダーでこれを有効にするために必要なのは、フィードの識別子をローミングすることだけです。アプリの起動または中断からの再開の際に、識別子を確認して適切なフィードに移動します。設定名が HighPriority である以外は、前述の設定とほぼ同じです。

JS:

Windows.Storage.ApplicationData.current.roamingSettings.values[“HighPriority”] = currentFeedId;

C#:

Windows.Storage.ApplicationData.Current.RoamingSettings.Values[“HighPriority”] = currentFeedId;

その他のローミング エクスペリエンスと同様、面倒な部分はすべて Windows が処理するため、その点は皆さんが心配する必要はありません。HighPriority を使う場合に重要なのは、設定を読み取るタイミングと書き込むタイミングです。通常は、アプリの起動時と中断からの再開時に HighPriority をチェックすることで、同じ PC でも別の PC でも、ユーザーが最後にアプリを使ったときの内容に常にアクセスすることができます。HighPriority は、新しいページの閲覧やリンクのクリックなど、ユーザーによる動作に記述します。

HighPriority 設定は通常瞬時に処理されますが、書き込みが高速になると速度が制限される場合があります。このため不要な書き込みはアプリのパフォーマンスを低下させる原因でしかなく、ローミング エクスペリエンスが向上することはありません。原則的に HighPriority は、アプリ内でのページの移動やコンテンツの閲覧など、ユーザー操作の場所と内容に対して使用します。アプリによってはデータが頻繁に変更されるものがあります。代表的なものに再生中のビデオのカウンターを記録し続けるビデオ プレーヤーがあります。このとき、ビデオのカウンターが増えるたびに HighPriority に書き込むのは行き過ぎで、再生/一時停止などビデオの状態が変化したとき、ユーザーがチェックポイントに達したとき、アプリが中断されたときに更新するようにしてください。

データの一貫性を維持する

データによっては、密接に結合されていて同時にローミングしなければならないものがあります。代表的な例として、あるポイントの座標が挙げられます。x 座標と y 座標が変更された場合にそれらを個別にローミングするべきではありません。実行した場合、データが破損したりポイントの位置がずれる可能性があります。ApplicationData のローミングの単位は設定とファイルです。ここで、ファイル内のすべての項目は 1 つの単位として同時にローミングされ、設定の場合はそれ自体が 1 つの単位です。この座標のような複数の設定を同時にローミングするには CompositeSettingValue (英語) を使います。この設定によって、複数の設定を 1 つの値にグループ化し、常に 1 つの単位でローミングすることができます。

HighPriority 設定は複合値にすることもできます。これによってアプリの最新状態を構成する複数のデータを安全にローミングできます。たとえば、前述のフィード リーダーではフィード項目をページごとにグループ化して読みやすくしています。このとき、フィードに含まれるページ数はフィードごとに常に同じではないため、このフィード ID とページを個別にローミングしたくありません。ここで実現したいことは、現在のフィード ID とそのフィード内の現在のページを一緒にして CompositeSettingValue としてローミングすることです。これで ID とページの一貫性が常に維持されます。

JS:

var currentFeed = new Windows.Storage.ApplicationDataCompositeValue();
currentFeed.insert(“CurrentFeedId”, currentFeedId);
currentFeed.insert(“CurrentFeedPage”, currentFeedPage);
Windows.Storage.ApplicationData.current.roamingSettings.values[“HighPriority”] = currentFeed;

C#:

Windows.Storage.ApplicationDataCompositeValue currentFeed = 
new Windows.Storage.ApplicationDataCompositeValue();
currentFeed.Insert(“CurrentFeedId”, currentFeedId);
currentFeed.Insert(“CurrentFeedPage”, currentFeedPage);
Windows.Storage.ApplicationData.Current.RoamingSettings.Values[“HighPriority”] = currentFeed;

複合値を HighPriority 設定として使う場合、HighPriority のメリットを維持するという理由から、複合値を 8 KB 以下にする必要があります。8 KB を超えた場合はエラーは発生しませんが、通常の設定と同じ扱いでローミングされます。

ローミングによる変更の着信に対処する

ローミング エクスペリエンスについて説明する最後の重要な項目は、ApplicationData の DataChanged (英語) イベントです。DataChanged イベントとは、単にアプリ データの変更のたびにそれを通知できるイベントです。たとえば、ユーザーによる設定変更をバックグラウンド タスクに通知できます。クラウド上のデータのローミングによってアプリにローカルな変更が発生した場合、Windows はこのイベントをユーザーに自動で通知します。これによって、別の PC からのデータの到着が遅れていて、ユーザーがアプリを使い始めた後にデータが到着するような状況に対処できます。このイベントを使えば、そのデータを使って表示を更新する、または設定の変更に対応することができるようになります。このエクスペリエンスは、一般ユーザーが PC を 1 台ずつ使いながら複数の PC を切り替えるような場合に最適化されたものであり、DataChanged イベントを PC 間のリアルタイム コミュニケーションに使用するものではないという点に注意してください。

常につながるエクスペリエンスに参加してください

ローミングを活用するアプリが揃うことは、常に接続された Windows 8 環境を構築するにあたって欠かせない要素であり、私たちは、この最新かつ最先端のエクスペリエンスを簡単に実現するためのプラットフォームを用意しています。クラウドへのローミングは、アプリの強力な差別化要因であり、利便性と PC 間のスムーズな移行をとおしてユーザーを喜ばせる手段でもあります。ローミングの使用に関するさらなるガイダンスについては、アプリケーション データのローミングのガイドラインを参照してください。また、このブログ記事で説明したすべてのエクスペリエンスの例を入手できる ApplicationData のサンプル (英語) も併せてチェックしてください。ありがとうございました。

-- Windows プログラム マネージャー、Dave Bennett