问题

我正在尝试在WP8.1(WinRT)中发生地理围栏事件(进入/退出)时触发BackgroundTask。我已经编写了一个示例应用程序来尝试使其正常运行,但似乎无法做到这一点。

到目前为止,以下是我为使Geofences在后台运行而采取的步骤:

  • 检查位置功能
  • 创建并注册地理围栏
  • 创建并注册一个监听LocationTrigger(LocationTriggerType.Geofence);的BackgroundTask
  • 在我的后台任务中,触发一个简单的弹出通知

  • 我为排除故障所做的事情

    我已经在我的app.manifest中启用了:
  • Toast Capable =>是的
  • 功能:位置,互联网(客户端和
    服务器)
  • 声明:BackgroundTasks(位置)。 EntryPoint = BackgroundTask.GeofenceBackgroundTask

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

    样例项目

    可以在以下 [link] (https://github.com/kiangtengl/GeofenceSample)中找到该项目的代码:

    如何测试
  • 在模拟器
  • 中运行代码
  • 将位置设置为:纬度= 01.3369,经度= 103.7364


  • 单击“注册Geofence + BackgroundTasks”按钮
  • 退出应用程序(按“主页”按钮)
  • 将当前位置更改为距先前设置的位置100m的任何位置。将会弹出一个通知。

  • 项目编号:

    检查位置功能
        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的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事件。您必须等待小于5分钟的一定时间才能触发BackgroundTask。

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

    10-08 07:24