后台地理围栏Windows Phone 8.1(WinRT)

问题

我试图在WP8.1(WinRT)发生地理栅栏事件(进入/退出)时触发BackgroundTask。 我已经写了一个示例应用程序,试图让它工作,但似乎无法做到这一点。

到目前为止,这些是我为了让Geofences在后台工作而采取的步骤:

  1. 检查位置function
  2. 创build+注册地理围栏
  3. 创build+注册一个BackgroundTask,用于侦听LocationTrigger(LocationTriggerType.Geofence);
  4. 在我的后台任务中,触发一个简单的popup通知

事情我已经做了解决

我已经启用了我的app.manifest:

  • Toast Capable =>是的
  • function:位置,Internet(客户端和服务器)
  • 声明:BackgroundTasks(位置)。 EntryPoint = BackgroundTask.GeofenceBackgroundTask

我的后台任务位于一个单独的项目中,名为BackgroundTask 。 它是一个WindowsRT组件,包含一个类GeofenceBackgroundTask

项目布局

示例项目

该项目的代码可以在这个[link] ( https://github.com/kiangtengl/GeofenceSample )find:

如何testing

  1. 在模拟器中运行代码

  2. 将位置设置为:纬度= 01.3369,经度= 103.7364

在这里输入图像说明

  1. 单击注册Geofence + BackgroundTasksbutton

  2. 退出应用程序(按主页button)

  3. 将当前位置更改为距离您之前设置的位置100米的任何地方。 应该popup一个通知。

项目代码:

检查位置function

  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); } } 

创build地理围栏

  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); } } 

BackgroundTask代码来触发吐司

 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不会自动触发Geofence事件。 在BackgroundTask被触发之前,您必须等待一定的时间<5分钟。

这也适用于前台的地理围栏。

我忙于同样的事情,而且我也注意到了这种行为,但对我来说却是2分钟。 不幸的是,它总是在2分钟后触发,即使在位置没有变化的情况下,仍然在围栏内。