全部, 我有一个Forms / iOS / Android项目,其中包括需要以特定间隔从设备检索地理位置数据。经过一些研究,我发现正确的方法是在IOS和Android中使用后台服务而不是在Forms中尝试这样做。我已经做到这一点,并且通过使用依赖服务调用方法,每隔X分钟让IOS和Android报告lat / long信息。因此,作为一个概念,一切都很好。
现在我试图在主要PCL项目中连接所有内容,并且我想就最佳方法做一些建议。例如,在iOS中,我有一个事件处理程序,用于何时CLLocationManager对象触发位置更改事件。如何让我的Forms项目知道这一点并将新的lat / long值传递给父项目代码?这是我的第一个特定设备密码的项目,所以我在这里面对未知的水域。
我很感激任何建议。
答案 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页面显示了如何开始使用它。