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

このトピックでは、アプリでバックグラウンド タスクをセットアップして Geofence 通知をリッスンする手順について説明します。

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

はじめに

ジオフェンスを作成すると、ジオフェンス イベントが発生したときの処理ロジックを追加する必要があります。 セットアップした MonitoredStates に応じて、次の場合にイベントを受け取ります。

  • ユーザーが関心領域に入りました。
  • ユーザーが関心領域から離れました。
  • ジオフェンスが期限切れになったか、除去されました。除去イベントではバックグラウンド アプリがアクティブ化されないことに注意してください。

このトピックでは、バックグラウンド タスクをセットアップして、ジオフェンス イベントが発生したときにアプリに通知する方法を説明します。 ただし、実行中のアプリから直接イベントを処理することもできます。 詳しくは、「フォアグラウンドでのジオフェンス通知の処理」と「ジオフェンスのガイドライン」をご覧ください。

バックグラウンドでジオフェンス イベントをリッスンするには、いくつか手順を踏む必要があります。

  • アプリのマニフェストでバックグラウンド タスクを宣言します。
  • アプリでバックグラウンド タスクを登録します。クラウド サービスへのアクセスなど、インターネット アクセスがアプリに必要な場合は、イベントがトリガーされたときにそのためのフラグを設定します。 イベントがトリガーされたときにユーザーがその場にいて、ユーザーに通知が確実に届くようにするために、フラグを設定することもできます。
  • アプリをフォアグラウンドで実行中に、位置情報のアクセス許可をアプリに与えるようユーザーに求めます。

ジオフェンスの状態変更イベントに登録

アプリのマニフェストの [宣言] タブで、位置情報バックグラウンド タスクの宣言を追加します。そのためには、次のようにします。

  • タイプが [バックグラウンド タスク] の宣言を追加します。
  • プロパティのタスク タイプを [位置情報] に設定します。
  • イベントがトリガーされたときに呼び出すアプリのエントリ ポイントを設定します。

バックグラウンド タスクの登録

次のコードでは、ジオフェンス バックグラウンド タスクを登録しています。ジオフェンスを作成したときに、位置情報のアクセス許可を確認したことを思い出してください。 詳しくは、「ジオフェンスのセットアップ」をご覧ください。

function registerBackgroundTask() {
    try {
        // Request lockscreen access
        Background.BackgroundExecutionManager.requestAccessAsync().done(
            function (backgroundAccessStatus) {
                var builder =  new Windows.ApplicationModel.Background.BackgroundTaskBuilder();

                // Register the background task
                builder.name = sampleBackgroundTaskName;
                builder.taskEntryPoint = sampleBackgroundTaskEntryPoint;
                builder.setTrigger(new Windows.ApplicationModel.Background.LocationTrigger(Windows.ApplicationModel.Background.LocationTriggerType.geofence));

                // If it is important that there is user presence and/or
                // internet connection when OnCompleted is called
                // the following could be called before calling Register()
                // var condition = new SystemCondition(SystemConditionType.userPresent | SystemConditionType.internetAvailable);
                // builder.addCondition(condition);

                geofenceTask = builder.register();

                geofenceTask.addEventListener("completed", onCompleted);

                LocationTriggerBackgroundTask.updateButtonStates(/*registered:*/ true);

                switch (backgroundAccessStatus) {
                    case Background.BackgroundAccessStatus.unspecified:
                    case Background.BackgroundAccessStatus.denied:
                        WinJS.log && WinJS.log("This app is not allowed to run in the background.", "sample", "status");
                        break;

                    default:
                        // Finish by getting an initial position. This will present the location consent
                        // dialog if it's the first attempt for this application to access location.
                        getGeopositionAsync();
                        break;
                }
            },
            function (e) {
                // Did you forget to do the background task declaration in the package manifest?
                WinJS.log && WinJS.log(e.toString(), "sample", "error");
            }
        );
    } catch (ex) {
        // HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) === -2147024846

        if (ex.number === -2147024846) {
            WinJS.log && WinJS.log("Location Simulator not supported.  Could not get permission to add application to the lock screen, this application must be added to the lock screen before the background task will run.", "sample", "status");
        } else {
            WinJS.log && WinJS.log(ex.toString(), "sample", "error");
        }
    }
}

関連トピック

ロードマップ

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

アプリの UX の設計

タスク

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

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

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

リファレンス

Geoshape

Geofence

Geolocator

その他のリソース

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

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

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