位置認識アプリのガイドライン

このトピックでは、ユーザーの位置にアクセスする必要があるアプリを構築する際のパフォーマンス ガイドラインを説明します。

重要な API

推奨事項

  • location オブジェクトは、アプリで位置データが必要になった場合にのみ使用を開始します。

    ユーザーの位置情報にアクセスする前に、RequestAccessAsync を呼び出します。 このときに、アプリをフォアグラウンドで実行し、RequestAccessAsync を UI スレッドから呼び出す必要があります。 位置情報に対するアクセス許可をユーザーがアプリに与えるまで、アプリは位置情報にアクセスできません。

  • アプリで位置情報が必須でない場合は、位置情報を必要とするタスクをユーザーが完了することを試みるまではその情報にアクセスしないでください。 たとえば、ソーシャル ネットワーキング アプリに、[位置情報を使ってチェックイン] というボタンがある場合、アプリは、ユーザーがそのボタンをクリックするまでは位置情報にアクセスしないようにします。 アプリのメイン機能で位置情報が必要な場合は、すぐにアクセスしても問題ありません。

  • Geolocator オブジェクトの初めての使用はフォアグラウンド アプリのメイン UI スレッドで行い、ユーザーから同意を得るためのプロンプトをトリガーする必要があります。 Geolocator の初めての使用とは、getGeopositionAsync を初めて呼び出すとき、または positionChanged イベントのハンドラーを初めて登録するときです。

  • 位置データがどのように使われるかをユーザーに知らせてください。

  • ユーザーが現在の位置を手動で更新できる UI を用意します。

  • 位置データの取得中は、進行状況バーまたは進行状況リングを表示します。

  • 位置情報サービスが無効または利用不可になっている場合は、適切なエラー メッセージまたはダイアログを表示します。

    位置情報の設定でアプリからユーザーの位置情報へのアクセスを許可していない場合は、設定アプリ内にある位置情報に関するプライバシー設定への使いやすいリンクを示すことをお勧めします。 たとえば、ハイパーリンク コントロールを使うか、ms-settings:privacy-location URI を使用して LaunchUriAsync メソッドを呼び出すことでコードから設定アプリを起動します。 詳しくは、「Windows 設定アプリの起動」をご覧ください。

  • 位置情報へのアクセスをユーザーが無効にしたときに、キャッシュされた位置データをクリアし、Geolocator を解放します。

    ユーザーが設定を使って位置情報へのアクセスをオフにした場合に、Geolocator オブジェクトを解放します。 すると、アプリは、あらゆる位置情報 API 呼び出しの結果として ACCESS_DENIED を受け取ります。 アプリで位置データを保存またはキャッシュしている場合は、ユーザーが位置情報へのアクセスを無効にするときにすべてのキャッシュ データをクリアします。 位置情報サービス経由で位置データを利用できないときに位置情報を手動で入力するための代替手段を用意してください。

  • 位置情報サービスを再び有効にするための UI を用意します。 たとえば、Geolocator オブジェクトを再インスタンス化して位置情報を取得し直す更新ボタンを用意します。

    位置情報サービスを再び有効にするための UI を提供する—

    • ユーザーが位置情報を無効にした後に再び有効にした場合、アプリには通知されません。 status プロパティは変更されず、statusChanged イベントも発生しません。 アプリで、新しい Geolocator オブジェクトを作成し、getGeopositionAsync を呼び出して更新された位置情報データを取得するか、positionChanged イベントの受信登録をもう一度行います。 位置情報が再び有効になったことを確認できたら、位置情報サービスが無効であることをユーザーに通知するために表示していた UI をクリアし、新しい状態に対して適切に対応します。
    • アプリをアクティブ化するとき、位置情報が必要な機能をユーザーが明示的に使おうとしたときなど、状況に応じて必要と思われる任意の時点で、位置情報データを取得し直すことをお勧めします。

パフォーマンス

  • アプリで位置情報の更新を受け取る必要がない場合は、位置情報の要求を 1 回だけ使います。 たとえば、写真に位置情報タグを追加するアプリでは、位置情報更新イベントを受け取る必要はありません。 このようなアプリでは、getGeopositionAsync を使って位置情報を要求します。詳しくは、「現在の位置情報の取得」をご覧ください。

    1 回限りの位置情報の要求を行う場合は、次の値を設定する必要があります。

    • DesiredAccuracy または DesiredAccuracyInMeters を設定して、アプリから要求される精度を指定します。 これらのパラメーターを使用する場合の推奨事項については、以下をご覧ください
    • GetGeopositionAsync の最大保存期間のパラメーターを設定して、アプリで有用な位置情報を取得できる期間を指定します。 アプリで数秒または数分前の位置を使用できる場合は、ほとんどすぐに位置を受け取って、デバイスの電力を節約することができます。
    • GetGeopositionAsync のタイムアウト パラメーターを設定します。 これが、アプリが返される位置またはエラーを待機することができる長さです。 ユーザーへの応答性とアプリが必要とする精度のバランスを理解する必要があります。
  • 頻繁に位置を更新する必要がある場合は、連続的な位置情報のセッションを使います。 特定のしきい値を超えた移動を検出する場合、または発生時に絶えず位置情報の更新を取得する場合は、positionChanged イベントと statusChanged イベントを使います。

    位置情報の更新を要求すると、DesiredAccuracy または DesiredAccuracyInMeters を設定して、アプリから要求される精度を指定できます。 また、MovementThreshold または ReportInterval を使って、位置情報の更新が必要な頻度を設定する必要があります。

    • 移動しきい値を指定します。 アプリによっては、ユーザーの移動距離が大きいときにだけ位置情報を更新すれば済むものがあります。 たとえば、地域のニュースや天気予報の更新情報を提供するアプリでは、ユーザーの位置が別の都市に変わらない限り位置情報を更新する必要はありません。 このような場合は、MovementThreshold プロパティを設定して、位置情報更新イベントの発生条件となる最小の移動距離を調整します。 このプロパティには PositionChanged イベントをフィルター処理する効果があります。 これらのイベントは、位置の変化が移動しきい値を超えたときにのみ発生します。

    • アプリのエクスペリエンスと整合し、システム リソースの使用が最小限に抑えられる reportInterval を使います。 たとえば、天気予報アプリでは、15 分ごとにデータを更新するだけでよいと思われます。 リアルタイムのナビゲーション アプリを除くほとんどのアプリでは、位置情報の更新について、高い精度のストリームを常に必要とするわけではありません。 最大限の精度のデータ ストリームを必要としない場合や、頻繁に更新する必要がない場合は、ReportInterval プロパティを設定して、アプリで位置情報を更新する必要がある最小の頻度を指定します。 これにより、必要なときにだけ位置情報を計算することで、位置情報の提供元の電力を節約できます。

      リアルタイムのデータを必要とするアプリでは、最短の間隔を指定せずに、ReportInterval を 0 に設定する必要があります。 既定のレポート間隔は、1 秒またはハードウェアでサポートされる最短間隔 (短い方) です。

      位置データを提供するデバイスでは、さまざまなアプリから要求されるレポート間隔を追跡し、要求された最短の間隔でデータをレポートする場合があります。 これにより、精度の要件が最も高いアプリに必要なデータを提供できます。 そのため、別のアプリで要求された更新頻度の方が高い場合は、要求した頻度よりも頻繁に更新が生成されることがあります。

      注: 位置情報の提供元からのレポート間隔は、必ずしも要求どおりになるとは限りません。 位置情報取得機能デバイスによってはレポート間隔を追跡しないものもありますが、追跡されるものとして指定しておくことをお勧めします。

    • 電力を節約するには、desiredAccuracy プロパティを設定して、アプリで高い精度のデータが必要かどうかを位置情報プラットフォームに示します。 高い精度のデータを必要とするアプリがなければ、GPS 位置情報取得機能を無効にして電力を節約できます。

      • GPS でデータを取得するには、desiredAccuracyHIGH に設定します。
      • ターゲティング広告のためにのみ位置情報を使うアプリは、消費電力を最小限に抑えるため、desiredAccuracyDefault に設定します。

      精度についてアプリに特定のニーズがある場合は、DesiredAccuracy を使う代わりに DesiredAccuracyInMeters プロパティを使うこともあります。 これは、通常、位置情報を移動体通信ビーコン、Wi-Fi ビーコンや衛星に基づいて取得できる Windows Phone に特に役立ちます。 より具体的な精度値を選ぶと、システムが位置情報を提供する際に最も低い消費電力で適切なテクノロジを識別するために役立ちます。

      次に例を示します。

      • アプリが広告の調整、天気、ニュースなどのための位置情報を取得している場合は、一般に 5000 m の精度で十分です。
      • アプリが地域内のごく近隣を表示する場合は、結果の表示には一般に 300 m の精度が適しています。
      • ユーザーがお勧めの近くのレストランを探している場合は、ブロック内の位置を取得する必要がありますので、100 m の精度で十分です。
      • ユーザーが自身の位置を共有しようとしている場合は、アプリには約 10 m の精度が必要です。
    • アプリに特定の精度の要件がある場合は Geocoordinate.accuracy プロパティを使います。 たとえば、ナビゲーション アプリでは、Geocoordinate.accuracy プロパティを使って、利用可能な位置情報データがアプリの要件を満たしているかどうかを調べます。

  • 起動時の待ち時間を考慮します。 アプリで初めて位置データを要求したとき、位置情報取得機能が起動するまでに 1 ~ 2 秒の待ち時間が発生することがあります。 アプリの UI を設計するときは、この点に注意してください。 たとえば、GetGeopositionAsync の呼び出しを保留している他のタスクがブロックされないようにしてください。

  • バックグラウンドの動作を考慮します。 アプリにフォーカスがない場合、バックグラウンドで中断されている間は位置情報更新イベントを受け取りません。 位置情報の更新をログに記録して追跡する場合は、この点に注意してください。 アプリにフォーカスが戻った後は、新しいイベントだけを受け取ります。 アプリが非アクティブだったときに発生した更新は取得されません。

  • ロー センサーとフュージョン センサーを効率的に使います。 センサーには、ロー センサーフュージョン センサーの 2 種類があります。

    • ロー センサーには、加速度計、ジャイロメーター、磁力計が含まれます。
    • フュージョン センサーには、向き、傾斜計、コンパスが含まれます。 フュージョン センサーは、ロー センサーの組み合わせからデータを取得します。

    Windows ランタイム API は磁力計以外のすべてのセンサーにアクセスできます。 フュージョン センサーの方がロー センサーよりも正確で安定していますが、より多くの電力を使います。 用途に適したセンサーを使う必要があります。 詳しくは、「センサー」をご覧ください。

コネクト スタンバイ

  • PC がコネクト スタンバイ状態にある場合、Geolocator オブジェクトはいつでもインスタンス化できます。 しかし、Geolocator オブジェクトは集約する対象のセンサーを見つけることができず、GetGeopositionAsync の呼び出しは 7 秒後にタイムアウトします。PositionChanged イベント リスナーの呼び出しは行われず、StatusChanged イベント リスナーは 1 回呼び出され、そのステータスは NoData となります。

その他の使い方のガイダンス

位置情報設定の変更を検出する

ユーザーは、設定アプリの位置情報に関するプライバシー設定を使って、位置情報機能を無効にすることができます。

  • ユーザーが位置情報サービスを無効にしたこと、または再び有効にしたことを検出するには、次の操作を行います。
    • StatusChanged イベントを処理します。 StatusChanged イベントの引数である Status プロパティの値は、ユーザーが位置情報サービスを無効にすると Disabled になります。
    • GetGeopositionAsync から返るエラー コードをチェックします。 ユーザーによって位置情報サービスが無効にされている場合、GetGeopositionAsync の呼び出しは ACCESS_DENIED エラーで失敗し、LocationStatus プロパティの値は Disabled になっています。
  • 位置情報データが不可欠なアプリ (地図アプリなど) では、次の操作を行う必要があります。
    • ユーザーの位置情報が変わったときに更新情報を取得できるように、PositionChanged イベントを処理します。
    • 前の説明に従って StatusChanged イベントを処理し、位置設定の変化を検出します。

位置情報サービスからは、データが利用可能になったときにデータが返されます。 最初に誤差の範囲が大きい位置情報を返し、より正確な情報が利用可能になったときに位置情報を更新する場合があります。 ユーザーの位置情報を表示するアプリでは、通常、より正確な情報が利用可能になったときに位置情報を更新する必要があります。

位置情報のグラフィック表示

アプリでは、Geocoordinate.accuracy を使って、ユーザーの現在の位置情報を地図に明確に示すようにします。 精度の幅は、主に、誤差の範囲が半径約 10 m、半径約 100 m、半径 1 km 超、という 3 種類があります。 精度情報を使うことにより、アプリでは、利用可能なデータの状況に応じて位置情報を正確に表示することができるようになります。 マップ コントロールを使用する方法に関する一般的な情報については、「2D、3D、Streetside ビューでの地図の表示」をご覧ください。

  • 約 10 m 相当の精度 (GPS の解像度) の場合、位置情報は点またはピンで地図上に示すことができます。 この精度では、経度と緯度の座標、住所の番地も表示できます。

    約 10 m の GPS 精度で表示される地図の例。

  • 10 ~ 500 m (おおよそ 100 m) の精度の場合、位置情報は通常、Wi-Fi による解決で受信されています。 移動体通信から取得した位置情報は約 300 m の精度です。 この場合、アプリでは誤差を含む範囲を表示することをお勧めします。 道順を表示するアプリなど中心点が必要となる場合は、その中心点を誤差を表す範囲で囲むことができます。

    約 100 m の Wi-Fi 精度で表示される地図の例。

  • 戻される精度が 1 km より大きい場合は、IP レベルの解決で位置情報を受信することになります。 多くの場合、地図上に特定の地点をピンポイントで表示するためにはこのレベルの精度は低すぎます。 アプリでは、地図を市のレベルまで、または誤差の範囲に応じて適切なエリア (たとえば、地域のレベル) までズームインすることをお勧めします。

    約 1 km の Wi-Fi 精度で表示される地図の例。

位置情報の精度が別の精度に切り替わるときは、異なるグラフィック表示が適切に遷移するようにします。 このためには、次のようにします。

  • 切り替え時のアニメーションをスムーズにし、切り替えを高速かつ滑らかに保ちます。
  • 数回の連続的な報告があるのを待ってから、精度が変わったと判断します。これにより、不要なズームが頻繁に行われるのを防ぐことができます。

位置情報のテキスト表示

天気アプリや地域情報アプリなどアプリの種類によっては、さまざまな精度の位置情報をテキストで表現することが必要になります。 位置情報は、データが提供する精度レベルまでに抑えて、明確に表示するようにします。

  • 精度が約 10 m 相当 (GPS の解像度) の場合、受信した位置情報データは相当に正確であるので、ごく近隣の地名のレベルで情報を伝えることができます。 市の名前、都道府県の名前、国/地域の名前も使うことができます。
  • 精度が約 100 m 相当 (Wi-Fi の解像度) の場合、受信した位置情報データはある程度正確です。市の名前までの情報を表示することをお勧めします。 それより詳しい、近隣地域の地名の使用は避けてください。
  • 1 km 超の精度 (IP による解決) の場合は、都道府県の名前、または国/地域の名前のみ表示します。

プライバシーに関する考慮事項

ユーザーの地理的な位置情報は、個人を特定できる情報 (PII) に当たります。 ユーザーのプライバシーの保護に関するガイダンスについては、次の Web サイトをご覧ください。