Wi-Fi アクセスと位置情報に関する API 動作の変更
変更の概要
位置情報にアクセスできるアプリをより適切に管理するために、Windows に新しいプライバシー コントロールが追加される予定です。
現在、アプリは、アプリを実行しているデバイスの近くにある Wi-Fi ネットワークを表示し、それらのネットワークを使用してデバイスの正確な位置を判断できます。 ただし、今後、必要な基本サービス セット識別子 (BSSID) を提供する API へのアクセスは、ユーザーの正確な位置情報へのアクセスを許可するようにユーザーが構成したアプリのみに制限されます。 ロケーション サービスを使うこの同意は、Windows の [設定]>[プライバシーとセキュリティ]>[位置情報] で構成します。 デバイス レベル、ユーザー レベル、または個々のアプリ レベルで設定できます。 この変更が実装された後、ユーザーが必要な同意を与えていない場合は、アプリが初めてブロックされたときに、システムによって 1 回限りのプロンプトがトリガーされます。
システム プロンプトの例を次に示します:
wlanapi.h または Windows.Devices.WiFi 名前空間、NetworkInformation、または Geolocator のいずれかで Wi-Fi API を 呼び出すアプリがある場合は、このトピックが適しています。 アプリの動作を最適化してユーザー エクスペリエンスを向上させる方法について詳しく説明します。
変更はいつ行われますか?
変更は、最初は Windows Insider Preview リリースで行われ、その後、Windows 機能リリース (商用リリース) で行われます。
- Windows Insider Preview リリースでは、変更は 2023 年 10 月に初めて有効になります。
- その後、2024 年秋にある次の Windows 機能リリースまでに、アプリのシナリオをテストし、必要な変更を加える必要があります。 その日以降、Windows デバイスは、上記の動作変更を含む更新プログラムの取得を開始します。
前述のように、この機能が商用リリースされる前に、このドキュメントの詳細も変更される可能性があります。
変更に備える方法は?
この変更の影響を受ける API サーフェスがいくつかあります。 また、後で説明するように、一部の API では、特定の条件下で "アクセス拒否" コードが返されるようになります。 そのため、ユーザーのマシンにあるアプリでこれらの "アクセス拒否" の戻り値を受け取り始めたら、すべてが期待どおりに動作していることを確認するために、アプリをテストすることをお勧めします。
つまり、アプリ開発者は、アプリのコードに次の変更を加えるようにすることをお勧めします。 これらの変更は、(必要に応じて) ユーザーがアプリにユーザーの正確な位置情報へのアクセスを許可し、ユーザー エクスペリエンスを向上させるのに役立ちます:
- 厳密に必要な場合を除き、アプリ内で Wi-Fi スキャン呼び出しを行わないようにします。
- 位置情報の取得の目的で Wi-Fi スキャンを使用している場合は、そのスキャンを Location API 呼び出しに置き換えます。
- アプリ内シナリオと共にプロンプトが表示されるように、システム プロンプトが表示されるタイミングを制御します。
- アクセス権を付与するために Windows の[設定] を調整する必要があることをユーザーに知らせるアプリ プロンプトを組み込みます。
影響を受ける API はどれですか?
次のいずれかの API を呼び出すと、アプリが影響を受けます:
- BSSID を含む wlanapi.h ヘッダー内の Win32 API。
- Windows.Devices.WiFi 名前空間の Windows ランタイム (WinRT) API。
- WinRT メソッド Windows.Networking.Connectivity.NetworkInformation.GetLanIdentifiers。
- WinRT メソッド Windows.Devices.Geolocation.Geolocator.RequestAccessAsync。
- また、wiFiControl デバイス機能を要求するには、位置情報へのアクセスに関するユーザーからの同意が必要です。 「アプリ機能の宣言」を参照してください。
Win32 の wlanapi.h または WinRT の Windows.Devices.WiFi の Wi-Fi API
- ユーザーが正確な位置情報へのアクセスに同意していない場合、影響を受ける API をアプリが初めて呼び出すと、プロセスがユーザーのコンテキスト内で
C:\Windows\System32
フォルダーの外部で実行されている場合は、アプリごとに 1 回限りのシステム プロンプトが表示されます。 アプリがこれらの API を呼び出す方法に応じて、プロンプトはアプリのユーザー インターフェイスでさまざまな方法で表示される場合があります。 - ユーザーが正確な位置情報へのアクセスに同意していない場合、wlanapi.h ヘッダー 内の次の Win32 API は ERROR_ACCESS_DENIED を返します:
- WlanGetAvailableNetworkList
- WlanGetNetworkBssList
- WlanQueryInterface (OpCode の引数が wlan_intf_opcode_current_connection の場合)
- WlanScan
- ユーザーが正確な位置情報へのアクセスに同意していない場合、 Windows.Devices.WiFi.WiFiAdapter.RequestAccessAsync API は DeniedBySystem を返します。 また、Windows.Devices.WiFi 名前空間の Windows.Devices.WiFi 名前空間内の他の API では、"アクセスが拒否されました" という例外がスローされます。
- これらの API への呼び出しは、使用中のシステム トレイと位置情報の最近のアクティビティに表示されます。
渡した引数に応じて、WlanRegisterNotification も影響を受けます。 WLAN_NOTIFICATION_SOURCE_MSM フラグが dwNotifSource で設定されている場合は、wiFiControl デバイス機能が必要です (「アプリ機能の宣言」を参照してください)。 その機能が許可されていない場合、関数は ERROR_ACCESS_DENIED を返します。 wiFiControl デバイス機能を要求するには、位置情報へのアクセスに関するユーザーからの同意が必要です。
Wi-Fi API に必要なアクション
アプリのユーザーのエクスペリエンスを向上させ、スムーズな操作を実現するには、システム プロンプトが表示されるタイミングを制御するために、アプリの動作に次の変更を加える必要があります:
- アプリでホスト デバイスの位置情報を知る必要がある場合は、Wi-Fi スキャンを使用するのではなく、Geolocation API を呼び出すようにしてください。
- アプリごとに 1 回限りのシステム プロンプトをユーザー エクスペリエンスの適切なポイントで表示するには、アプリで WiFiAdapter.RequestAccessAsync を呼び出す必要があります。 プロセスはユーザーのコンテキスト内で、
C:\Windows\System32
フォルダーの外部で実行されている必要があります。 呼び出しは、Wi-Fi または位置情報を必要とするユーザー アクションに合わせる必要があります (その結果、インストール直後にユーザーにプロンプトを表示するよりも高い同意率になります)。 - アプリは、WiFiControl デバイス機能と併せて AppCapability.CheckAccess API を使用することで、位置情報へのアクセス状態を照会できます。 次のアクセスによってダイアログがトリガーされる場合、API は AppCapabilityAccessStatus.UserPromptRequired を返します。
- ユーザーが位置情報の同意を変更するたびに通知を受け取り、それに応じて応答するには、アプリで AppCapability.AccessChanged イベントをサブスクライブする必要があります。
- アクセスが拒否されたシナリオ用のアプリ内エクスペリエンスを追加する必要があります。 そのシナリオでは、ユーザーがアプリが正確な位置情報にアクセスできるように、アプリでユーザーを Windows の [設定] にリダイレクトする必要があります。 これを行うには、Launcher.LaunchUriAsync メソッドに文字列 "ms-settings:privacy-location" を渡します。
- アプリでは、位置情報を使用中のアイコンがシステム トレイに頻繁に表示されないように、要求を適切なレベルに調整する必要があります。
WinRT NetworkInformation.GetLanIdentifiers メソッド
- ユーザーが正確な位置情報へのアクセスに同意していない場合、Windows.Networking.Connectivity.NetworkInformation.GetLanIdentifiers API は WLAN 関連の情報を返しません。
- この API への呼び出しは、使用中のシステム トレイと位置情報の最近のアクティビティに表示されます。
NetworkInformation に必要なアクション
前述の Wi-Fi API と同様に、アプリはアクセスの要求/クエリし、変更の監視し、ユーザーを [設定]へ誘導する必要があります。
WinRT Geolocator.RequestAccessAsync メソッド
- ユーザーが正確な位置情報へのアクセスに同意していない場合、Windows.Devices.Geolocation.Geolocator.RequestAccessAsync が初めて呼び出されると、アプリごとに 1 回限りのシステム プロンプトが表示されます。
Geolocation に必要なアクション
アプリのユーザーのエクスペリエンスを向上させ、スムーズな操作を実現するには、システム プロンプトが表示されるタイミングを制御するために、アプリの動作に次の変更を加える必要があります:
- アプリごとに 1 回限りのシステム プロンプトをユーザー エクスペリエンスの適切なポイントで表示するには、アプリで Geolocator.RequestAccessAsync を呼び出す必要があります。 プロセスはユーザーのコンテキスト内で、
C:\Windows\System32
フォルダーの外部で実行されている必要があります。 通常、呼び出しは、正確な位置情報を必要とするユーザー アクションに合わせる必要があります (その結果、インストール直後にユーザーにプロンプトを表示するよりも高い同意率になります)。 - ユーザーが位置情報の同意を変更するたびに通知を受け取り、それに応じて応答するには、アプリで Geolocator.StatusChangedevent イベントをサブスクライブし、StatusChangedEventArgs.Status プロパティから場所のアクセス許可の状態を取得する必要があります。
- アクセスが拒否されたシナリオ用のアプリ内エクスペリエンスを追加する必要があります。 そのシナリオでは、ユーザーがアプリが正確な位置情報にアクセスできるように、アプリでユーザーを Windows の [設定] にリダイレクトする必要があります。 これを行うには、Launcher.LaunchUriAsync メソッドに文字列 "ms-settings:privacy-location" を渡します。
アプリをテストする方法
- Windows Insider Program に登録されている Windows PC を使用します。 これは Canary チャネル (ビルド 25976 以上) 上にある必要があります。
- Windows の [設定]>[プライバシーとセキュリティ]>[位置情報] で、位置情報サービスをオフにします。
- 位置情報または Wi-Fi 情報を使用するアプリを実行します。
- 期待される結果は、位置情報の同意を求めるシステム プロンプトが表示されることです。
フィードバックを送信する方法
引き続きご支援、ご意見を賜りますようお願い申し上げます。 フィードバック ハブ アプリ を通じてバグ レポートを送信し、説明欄にアプリまたはその他の詳細を示してください。 カテゴリは、 [デバイスとドライバー]>[位置情報サービス]です。