地理围栏应用指南

在应用中遵循这些适用于地理围栏的最佳做法。

重要的 API

建议

  • 如果在发生 Geofence 事件时应用需要具备 Internet 访问权限,请在创建地理围栏之前先检查有无 Internet 访问权限。

    • 如果应用当前没有 Internet 访问权限,你可以提示用户在你设置地理围栏之前连接到 Internet。
    • 如果不能访问 Internet,请避免消耗进行地理围栏位置检查所需的电源。
  • 在地理围栏事件指示 EnteredExited 状态发生更改时,通过检查时间戳和当前位置来确保地理围栏通知的相关性。 有关详细信息,请参阅下面的检查时间戳和当前位置

  • 当设备无法访问位置信息时,创建异常来管理这些情况,并在需要时通知用户。 由于以下原因,可能不提供位置信息:已禁用权限、设备未包含 GPS 无线电、GPS 信号受阻或者 Wi-Fi 信号不够强。

  • 总体而言,没有必要同时在前台和后台侦听地理围栏事件。 然而,如果你的应用需要同时在前台和后台侦听地理围栏事件:

    • 请调用 ReadReports 方法以查明是否发生了某个事件。
    • 在用户看不到你的应用时,将前台事件侦听器取消注册,并在它再次可见时为其重新注册。

    有关代码示例和详细信息,请参阅后台和前台侦听器

  • 对每个应用不要使用多于 1000 个地理围栏。 系统实际上支持每个应用数千个地理围栏,你可以通过使用多于 1000 个来维持良好的应用性能以帮助减少应用的内存使用量。

  • 不要创建带有小于 50 米的 radius 的地理围栏。 如果应用必须带有小型 radius 的地理围栏,则最好建议用户在具备 GPS 无线电的设备上使用该应用,确保获得最佳性能。

其他使用指南

检查时间戳和当前位置

当某个事件表明 EnteredExited 状态存在变化时,应同时检查事件的时间戳和你的当前位置。 各种因素(例如系统没有足够的资源来启动后台任务、用户未注意到通知或设备处于待机状态)可能会影响用户实际处理事件的时间。 例如,可能会出现下面的顺序:

  • 你的应用创建了一个地理围栏并监视地理围栏有无进入和退出事件。
  • 当用户在地理围栏内移动设备时,则会触发一个进入事件。
  • 应用会向用户发送一个通知,指明用户当前正处于地理围栏内。
  • 用户一直忙于其他的事情,没有注意到这则通知,直至 10 分钟以后才察觉。
  • 在这 10 分钟的延迟期内,用户将设备移出了地理围栏。

通过时间戳,你可以判断出过去发生的操作。 通过当前位置,你可以了解到用户现已离开地理围栏。 根据应用的功能,你可能希望过滤掉这个事件。

后台侦听器和前台侦听器

通常,你的应用不需要同时在前台和后台任务中侦听 Geofence 事件。 如果遇到可能同时需要在前台和后台任务中侦听的情况,最简洁的方法是由后台任务来处理通知。 如果你同时设置了前台和后台地理围栏侦听器,则无法保证哪个侦听器先被触发,为此你必须一直调用 ReadReports 方法以判断是否发生了事件。

此外,如果你已经同时设置了前台和后台地理围栏侦听器,请在应用对用户不可见时取消注册前台事件侦听器;当应用再次对用户可见时,应重新注册应用。 下面是一些注册可见性事件的示例代码。

Windows.UI.Core.CoreWindow coreWindow;    

// This needs to be set before InitializeComponent sets up event registration for app visibility
coreWindow = CoreWindow.GetForCurrentThread();
coreWindow.VisibilityChanged += OnVisibilityChanged;

当可见性出现变化时,你可以按照此处显示的情况,启用或禁用前台事件处理程序。

private void OnVisibilityChanged(CoreWindow sender, VisibilityChangedEventArgs args)
{
    // NOTE: After the app is no longer visible on the screen and before the app is suspended
    // you might want your app to use toast notification for any geofence activity.
    // By registering for VisibiltyChanged the app is notified when the app is no longer visible in the foreground.

    if (args.Visible)
    {
        // register for foreground events
        GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
        GeofenceMonitor.Current.StatusChanged += OnGeofenceStatusChanged;
    }
    else
    {
        // unregister foreground events (let background capture events)
        GeofenceMonitor.Current.GeofenceStateChanged -= OnGeofenceStateChanged;
        GeofenceMonitor.Current.StatusChanged -= OnGeofenceStatusChanged;
    }
}

确定地理围栏的大小

虽说 GPS 可以提供最精确的位置信息,但是地理围栏也可以使用 Wi-Fi 或其他位置传感器来确定用户的当前位置。 不过,使用这些方法会影响你创建地理围栏的大小范围。 如果精确度较低,创建较小的地理围栏不会有任何帮助。 通常,建议不要创建半径小于 50 米的地理围栏。 同样,地理围栏后台任务仅在 Windows 上定期运行;如果你使用较小的地理围栏,你可能会完全错过 EnterExit 事件。

如果应用必须带有小型 radius 的地理围栏,则最好建议用户在具备 GPS 无线电的设备上使用该应用,确保获得最佳性能。