Xamarin - 将设备特定代码中的数据传回Xamarin表单

时间:2016-12-10 22:32:12

标签: xamarin xamarin.ios xamarin.android xamarin.forms

全部, 我有一个Forms / iOS / Android项目,其中包括需要以特定间隔从设备检索地理位置数据。经过一些研究,我发现正确的方法是在IOS和Android中使用后台服务而不是在Forms中尝试这样做。我已经做到这一点,并且通过使用依赖服务调用方法,每隔X分钟让IOS和Android报告lat / long信息。因此,作为一个概念,一切都很好。

现在我试图在主要PCL项目中连接所有内容,并且我想就最佳方法做一些建议。例如,在iOS中,我有一个事件处理程序,用于何时CLLocationManager对象触发位置更改事件。如何让我的Forms项目知道这一点并将新的lat / long值传递给父项目代码?这是我的第一个特定设备密码的项目,所以我在这里面对未知的水域。

我很感激任何建议。

1 个答案:

答案 0 :(得分:0)

这是一个非常常见的场景,它可以通过几种不同的方式解决。我个人的偏好是遵循Xamarin.Forms插件中使用的模式。看一下Geolocator Plugin的结构:

// Abstraction for the information you want to access in shared (PCL) code
public interface IGeolocator
{
    event EventHandler<PositionEventArgs> PositionChanged;
    ...
}

此处,事件有助于为使用IGeolocator的任何PCL代码订阅位置更新。这听起来像是你对CLLocationManager提出的要求。要转发此信息,IGeolocator的iOS特定实施会在PositionChanged触发时引发CLLocationManager.LocationsUpdated事件。

manager.LocationsUpdated += OnLocationsUpdated;
...

void OnLocationsUpdated(object sender, CLLocationsUpdatedEventArgs e)
{
    foreach (CLLocation location in e.Locations)
        UpdatePosition(location);
    ...
}

// UpdatePosition copies the lat/long/etc into the PositionEventArgs and calls OnPositionChanged

void OnPositionChanged(PositionEventArgs e) => PositionChanged?.Invoke(this, e);

最后,它在共享代码中使用单例或使用DependencyService.Get<IGeolocator>()

try
{
  // Singleton usage
  var locator = CrossGeolocator.Current;

  // DependencyService
  // var locator = DepedencyService.Get<IGeolocator>();

  locator.DesiredAccuracy = 50;

  // Subscribing to event in shared code
  locator.PositionChanged += OnPositionChanged;
}
catch(Exception ex)
{
  ...
}

可以找到所有这些代码here。您也可以考虑使用此插件。它还有一些您可能会觉得有用的功能。 GitHub页面显示了如何开始使用它。