后台地理围栏 Windows Phone 8.1 (WinRT) [英] Geofence in the Background Windows Phone 8.1 (WinRT)
问题描述
我正在尝试在 WP8.1 (WinRT) 中发生地理围栏事件(进入/退出)时触发 BackgroundTask.我已经编写了一个示例应用程序来尝试让它工作,但似乎无法这样做.
I'm trying to trigger a BackgroundTask when a Geofence Event (Enter / Exit) occurs in WP8.1 (WinRT). I've written a sample application to try to get it working, but can't seem to be able to do so.
到目前为止,这些是我尝试让地理围栏在后台工作的步骤:
So far, these are the steps I've taken to try to get Geofences working in the background:
- 检查位置功能
- 创建 + 注册地理围栏
- 创建并注册一个监听
LocationTrigger(LocationTriggerType.Geofence);
的BackgroundTask - 在我的后台任务中,触发一个简单的弹出通知
我为排除故障所做的事情
我已在我的 app.manifest 中启用:
Things I have done to Troubleshoot
I have enabled in my app.manifest:
- Toast Capable => 是的
- 功能:位置、互联网(客户端和服务器)
- 声明:BackgroundTasks(位置).EntryPoint =
BackgroundTask.GeofenceBackgroundTask
我的后台任务位于一个名为 BackgroundTask
的单独项目中.它是一个 WindowsRT 组件,包含一个 GeofenceBackgroundTask
类.
My background task is located in a separate project, titled BackgroundTask
. It is a WindowsRT Component and contains one class GeofenceBackgroundTask
.
该项目的代码可以在这个[link](https://github.com/kiangtengl/GeofenceSample):
The code for the project can be found at this [link](https://github.com/kiangtengl/GeofenceSample):
在模拟器中运行代码
Run the code in the emulator
将位置设置为:纬度 = 01.3369,经度 = 103.7364
Set Location to to: Latitude = 01.3369, Longitude = 103.7364
点击注册地理围栏 + 后台任务按钮
Click the Register Geofence + BackgroundTasks button
退出应用程序(按主页按钮)
Exit the app (press the home button)
将当前位置更改为距您之前设置的位置 100m 以外的任何位置.应弹出通知.
Change the current location to anywhere 100m away from the location you set previously. A notification should pop out.
项目代码:
检查位置功能
public static async Task GetLocationCapabilities()
{
try
{
var geolocator = new Geolocator();
await geolocator.GetGeopositionAsync();
var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
Debug.WriteLine("background access status" + backgroundAccessStatus);
}
catch (UnauthorizedAccessException e)
{
Debug.WriteLine(e);
}
catch (TaskCanceledException e)
{
Debug.WriteLine(e);
}
}
创建地理围栏
public static void CreateGeofence(BasicGeoposition position, double radius, string id = "default")
{
// The Geofence is a circular area centered at (latitude, longitude) point, with the
// radius in meter.
var geocircle = new Geocircle(position, radius);
// Sets the events that we want to handle: in this case, the entrace and the exit
// from an area of intereset.
var mask = MonitoredGeofenceStates.Entered | MonitoredGeofenceStates.Exited;
// Specifies for how much time the user must have entered/exited the area before
// receiving the notification.
var dwellTime = TimeSpan.FromSeconds(1);
// Creates the Geofence and adds it to the GeofenceMonitor.
var geofence = new Geofence(id, geocircle, mask, false, dwellTime);
try
{
GeofenceMonitor.Current.Geofences.Add(geofence);
}
catch (Exception e)
{
Debug.WriteLine(e);
// geofence already added to system
}
}
注册后台任务
public static async Task RegisterBackgroundTask()
{
try
{
// Create a new background task builder
var geofenceTaskBuilder = new BackgroundTaskBuilder()
{
Name = GeofenceBackgroundTaskName,
TaskEntryPoint = "BackgroundTask.GeofenceBackgroundTask"
};
// Create a new location trigger
var trigger = new LocationTrigger(LocationTriggerType.Geofence);
// Associate the location trigger with the background task builder
geofenceTaskBuilder.SetTrigger(trigger);
var geofenceTask = geofenceTaskBuilder.Register();
// Associate an event handler with the new background task
geofenceTask.Completed += (sender, e) =>
{
try
{
e.CheckResult();
}
catch(Exception error)
{
Debug.WriteLine(error);
}
};
}
catch(Exception e)
{
// Background task probably exists
Debug.WriteLine(e);
}
}
触发 Toast 的后台任务代码
namespace BackgroundTask
{
public sealed class GeofenceBackgroundTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
var toastTemplate = ToastTemplateType.ToastText02;
var toastXML = ToastNotificationManager.GetTemplateContent(toastTemplate);
var textElements = toastXML.GetElementsByTagName("text");
textElements[0].AppendChild(toastXML.CreateTextNode("You have left!"));
var toast = new ToastNotification(toastXML);
ToastNotificationManager.CreateToastNotifier().Show(toast);
}
}
}
推荐答案
我发现上面的代码示例以及上面的代码都有效.我面临的问题是 Windows Phone 8.1 不会自动触发地理围栏事件.在触发 BackgroundTask 之前,您必须等待一定的时间 <5 分钟.
I've discovered that the above code sample, as well as the above code works. The problem that I was facing was that Windows Phone 8.1 does not automatically trigger a Geofence event. You have to wait a certain amount of time <5 mins before the BackgroundTask is triggered.
这也适用于前台的地理围栏.
This applies to Geofencing in the foreground as well.
这篇关于后台地理围栏 Windows Phone 8.1 (WinRT)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!