我试图在WP8.1(WinRT)发生地理栅栏事件(进入/退出)时触发BackgroundTask。 我已经写了一个示例应用程序,试图让它工作,但似乎无法做到这一点。
到目前为止,这些是我为了让Geofences在后台工作而采取的步骤:
LocationTrigger(LocationTriggerType.Geofence);
我已经启用了我的app.manifest:
BackgroundTask.GeofenceBackgroundTask
我的后台任务位于一个单独的项目中,名为BackgroundTask
。 它是一个WindowsRT组件,包含一个类GeofenceBackgroundTask
。
该项目的代码可以在这个[link] ( https://github.com/kiangtengl/GeofenceSample )find:
在模拟器中运行代码
将位置设置为:纬度= 01.3369,经度= 103.7364
单击注册Geofence + BackgroundTasksbutton
退出应用程序(按主页button)
将当前位置更改为距离您之前设置的位置100米的任何地方。 应该popup一个通知。
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); } }
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分钟后触发,即使在位置没有变化的情况下,仍然在围栏内。