Настройка геозоны (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]
В этом разделе описывается пошаговая настройка 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
Проектирование взаимодействия с пользователем в приложениях
Задачи
Обработка уведомлений геозоны на переднем плане
Прослушивание событий геозоны в фоновом режиме
Обработка уведомлений геозоны из фоновой задачи
Справочные материалы
Другие ресурсы
Пример определения географического положения в Windows 10