WindowsではWi-Fiに関連する一部のAPIを呼び出す場合、位置情報へのアクセスに関するユーザーからの同意が必要となる予定です。
参考:
Wi-Fiと位置情報へのアクセスにどのような関係があるのかを調べたところ、位置情報サービス事業者がWi-Fiのアクセスポイントの位置などの情報を収集してデータベース化しているため、デバイスの周囲にあるWi-Fiのアクセスポイントがわかればかなりの精度で位置情報を取得することが可能であるということがわかりました。
どのくらいの精度で位置情報が取得可能なのか調べてみました。
以下のソースコードを、ビルドしたモジュールをGPSが搭載されていないWi-Fiが使用可能なWindows端末で実行しました。
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Devices.Geolocation.h>
#include <iostream>
#include <string>
using namespace winrt;
using namespace Windows::Devices::Geolocation;
std::wstring PositionSourceToString(PositionSource ps)
{
switch (ps) {
case PositionSource::Cellular:
return L"Cellular";
case PositionSource::Satellite:
return L"Satellite";
case PositionSource::WiFi:
return L"WiFi";
case PositionSource::IPAddress:
return L"IPAddress";
case PositionSource::Default:
return L"Default";
case PositionSource::Obfuscated:
return L"Obfuscated";
case PositionSource::Unknown:
default:
break;
}
return L"Unknown";
}
int main()
{
init_apartment();
try {
Geolocator geolocator;
auto geoposition = geolocator.GetGeopositionAsync().get();
auto coord = geoposition.Coordinate();
auto point = coord.Point().Position();
std::wcout << L"Position: " << point.Latitude << ", " << point.Longitude << std::endl;
std::wcout << L"Source: " << PositionSourceToString(coord.PositionSource()) << std::endl;
}
catch (const winrt::hresult_error&) {
std::wcout << L"error" << std::endl;
}
}
すると、このような結果になりました。
Position: 34.7341, 135.497
Source: WiFi
位置情報取得の情報源がWi-Fiとなっていたので、確かにWi-Fiを使って位置情報が取得できました。
取得した位置情報をGoogle マップに入力してみます。
結果は、以下の通りです。
この位置は、Sky株式会社の大阪本社が入っているビルです。
位置情報を取得した場所も大阪本社でしたので、今回の測定ではビルまで一致しています。
位置情報を取得する場所や状況により、位置情報を測定できる/できないが変わったり、精度も変わるとは思いますが、この一例を見るとかなりの精度だと思いました。
Windowsにおいて、Wi-Fiに関連する一部APIの呼び出しに位置情報へのアクセスに関するユーザーからの同意が必要となる理由がよくわかりました。