后台地理围栏 Windows Phone 8.1 (WinRT) [英] Geofence in the Background Windows Phone 8.1 (WinRT)

查看:30
本文介绍了后台地理围栏 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:

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

我为排除故障所做的事情

我已在我的 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):

  1. 在模拟器中运行代码

  1. Run the code in the emulator

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

Set Location to to: Latitude = 01.3369, Longitude = 103.7364

  1. 点击注册地理围栏 + 后台任务按钮

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆