ジオフェンスのセットアップ (HTML)

このトピックでは、アプリで Geofence をセットアップする手順について説明します。

ロードマップ: このトピックと他のトピックとの関連については、以下をご覧ください。

はじめに

Geofence のセットアップ時に必要な手順はいくつかあります。 関心領域を定義するほかに、適切な位置情報のアクセス許可を持っているか確認する必要もあります。 最後に、アプリの実行中にユーザーがアクセス許可を変更した場合に備えてイベント ハンドラーをセットアップする必要があります。

位置情報が有効になっていることを確認する

アプリが位置情報にアクセスする前に、デバイスで [位置情報] を有効にする必要があります。設定アプリで、次の位置情報に関するプライバシー設定がオンになっていることを確認します。

  • [このデバイスの位置情報][オン] になっている (Windows 10 Mobile には適用されません)
  • 位置情報サービス設定の [位置情報][オン] になっている
  • [位置情報を使うことができるアプリを選ぶ] で、アプリが [オン] になっている

位置情報機能を有効にする

ソリューション エクスプローラーpackage.appxmanifest をダブルクリックし、[機能] タブを選びます。[機能] の一覧で、[位置情報] をオンにします。これにより、Location デバイス機能がパッケージ マニフェスト ファイルに追加されます。

  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

位置情報のアクセス許可の確認

まず、初期化時に位置情報を取得するコードをアプリに追加してみます。 Windows では、アプリが現在の位置情報を取得するために初めて API を使うと、ユーザーに位置情報のアクセス許可を求めるメッセージが表示されます。 アプリがユーザーからアクセス許可を得られない場合は、ユーザーに警告します。 位置情報のアクセス許可がなくても Geofence をセットアップすることはできますが、アクセス許可が有効になるまで通知を受け取ることはできません。

    function initialize() {

        promise = geolocator.getGeopositionAsync();
        promise.done(
            function (pos) {
                var coord = pos.coordinate;

            },
            function (err) {
            // handle situations where location permissions are not granted to your app
            }
        );

    }


位置情報のアクセス許可の変更のリッスン

次に、ユーザーが何らかの理由で位置情報のアクセス許可を無効にする場合に備えて、アクセス許可の変更イベントに登録します。 まず、初期化メソッドにイベント ハンドラーを追加します。


var accessInfo = null;
accessInfo = DeviceAccessInformation.createFromDeviceClass(Enumeration.DeviceClass.location);
accessInfo.addEventListener("accesschanged", onAccessChanged);

次に、アクセス許可の変更を処理して、位置情報のアクセス許可を無効にするとジオフェンスが機能しなくなることをユーザーに伝えます。

function onAccessChanged(args) {
    var eventDescription = getTimeStampedMessage("Device Access Status");
    var item = null;

    if (DeviceAccessStatus.deniedByUser === args.status) {
        eventDescription += " (DeniedByUser)";

        WinJS.log && WinJS.log("Location has been disabled by the user. Enable access through the settings charm.", "sample", "status");
    } else if (DeviceAccessStatus.deniedBySystem === args.status) {
        eventDescription += " (DeniedBySystem)";

        WinJS.log && WinJS.log("Location has been disabled by the system. The administrator of the device must enable location access through the location control panel.", "sample", "status");
    } else if (DeviceAccessStatus.unspecified === args.status) {
        eventDescription += " (Unspecified)";

        WinJS.log && WinJS.log("Location has been disabled by unspecified source. The administrator of the device may need to enable location access through the location control panel, then enable access through the settings charm.", "sample", "status");
    } else if (DeviceAccessStatus.allowed === args.status) {
        eventDescription += " (Allowed)";

        // clear status
        WinJS.log && WinJS.log("", "sample", "status");
    } else {
        eventDescription += " (Unknown)";

        WinJS.log && WinJS.log("Unknown device access information status", "sample", "status");
    }

    addEventDescription(eventDescription);
}

  LocationStatus プロパティを確認することで、ユーザーが [設定] で位置情報を無効にしたかどうかを判断します。値が Disabled の場合、位置情報は使用できません。

 

ジオフェンスの作成

これでジオフェンスを定義してセットアップする準備が整いました。 ジオフェンスで設定できる値の一部を以下に挙げます。

  • ジオフェンスを識別する Id
  • Geoshape によって定義される円形の関心領域。
  • MonitoredStates。どのジオフェンス イベントで通知を受け取るかを示します。イベントは、定義された領域に入ったとき、定義された領域を離れたとき、ジオフェンスが除去されたときに発生します。
  • SingleUse フラグ。ジオフェンスが監視されている状態がすべて満たされるとジオフェンスを除去します。
  • DwellTime。進入または退出イベントがトリガーされる前に、定義された領域の内側または外側にユーザーがどれぐらいとどまる必要があるかを示します。
  • StartTime。ジオフェンスの監視を開始する時刻を示します。
  • Duration。ジオフェンスを監視する期間です。

function generateGeofence() {
    var geofence = null;

    try {
        var fenceKey = nameElement.value;

        var position = {
            latitude: decimalFormatter.parseDouble(latitude.value),
            longitude: decimalFormatter.parseDouble(longitude.value),
            altitude: 0
        };
        var radiusValue = decimalFormatter.parseDouble(radius.value);

        // the geofence is a circular region
        var geocircle = new Windows.Devices.Geolocation.Geocircle(position, radiusValue);

        var singleUse = false;

        if (geofenceSingleUse.checked) {
            singleUse = true;
        }

        // want to listen for enter geofence, exit geofence and remove geofence events
        var mask = 0;

        mask = mask | Windows.Devices.Geolocation.Geofencing.MonitoredGeofenceStates.entered;
        mask = mask | Windows.Devices.Geolocation.Geofencing.MonitoredGeofenceStates.exited;
        mask = mask | Windows.Devices.Geolocation.Geofencing.MonitoredGeofenceStates.removed;

        var dwellTimeSpan = new Number(parseTimeSpan(dwellTimeField, defaultDwellTimeSeconds));
        var durationTimeSpan = null;
        if (durationField.value.length) {
            durationTimeSpan = new Number(parseTimeSpan(durationField, 0));
        } else {
            durationTimeSpan = new Number(0); // duration needs to be set since start time is set below
        }
        var startDateTime = null;
        if (startTimeField.value.length) {
            startDateTime = new Date(startTimeField.value);
        } else {
            startDateTime = new Date(); // if you don't set start time in JavaScript the start time defaults to 1/1/1601
        }

        geofence = new Windows.Devices.Geolocation.Geofencing.Geofence(fenceKey, geocircle, mask, singleUse, dwellTimeSpan, startDateTime, durationTimeSpan);
    } catch (ex) {
        WinJS.log && WinJS.log(ex.toString(), "sample", "error");
    }

    return geofence;
}

関連トピック

ロードマップ

JavaScript を使ったアプリのためのロードマップ

アプリの UX の設計

タスク

フォアグラウンドでのジオフェンス通知の処理

バックグラウンドでのジオフェンス イベントのリッスン

バックグラウンド タスクからのジオフェンス通知の処理

リファレンス

Geoshape

Geofence

Geolocator

その他のリソース

Windows 10 の地理位置情報のサンプル

Windows 8.1 の地理位置情報のサンプル

ジオフェンスのガイドライン