我创建了一个xamarin表单应用程序,其中一个要求如下:用户应该能够按下按钮并创建地理围栏。创建地理围栏时,应用程序会不断检查用户是否在地理围栏中。这是真的,移动应用程序应该显示一个通知sayinf:你已经进入geofence。
我使用Shiny来实现基于本教程的功能:"https://allancritchie.net/posts/shiny-geofencing".
但问题是它什么都没做。我已经设置了距离我家50米的地理围栏,检查半径为200米,所以当我构建应用程序时,几秒钟/分钟后我应该会收到一个通知,对吧?还是我需要先走出围栏,然后再进去?如何解决此问题。。。
我的代码:
// shiny doesn't usually manage your viewmodels, so we'll do this for now
var geofences = ShinyHost.Resolve<IGeofenceManager>();
var notifications = ShinyHost.Resolve<INotificationManager>();
Register = new Command(async () =>
{
// this is really only required on iOS, but do it to be safe
var access = await notifications.RequestAccess();
if (access == AccessState.Available)
{
await geofences.StartMonitoring(new GeofenceRegion(
"CN Tower - Toronto, Canada",
new Position(52.079779, 4.337133),
Distance.FromMeters(200)
)
{
NotifyOnEntry = true,
NotifyOnExit = true,
SingleUse = false
});
}
});
public class GeofenceDelegate : IGeofenceDelegate
{
private readonly INotificationManager _notifications;
public GeofenceDelegate(INotificationManager notifications)
{
_notifications = notifications;
}
public async Task OnStatusChanged(GeofenceState newStatus, GeofenceRegion region)
{
if (newStatus == GeofenceState.Entered)
{
await GeofenceEntered(region);
}
else if (newStatus == GeofenceState.Exited)
{
await GeofenceLeft(region);
}
}
}
我有与教程完全相同的代码,如果我调试它,地理围栏是在我点击按钮时创建的。所以我觉得一切都很好。
我也遇到过类似的问题,只是假设当你开始进入围栏时,它不会识别你进入/或离开,因为你已经在围栏内了。
我必须走出/进入创建的围栏才能触发"OnStatusChanged"方法。
需要注意的是,除非我的应用程序激活了手机的GPS系统(例如,定期重新请求当前位置(,否则它不会进入该方法,但我不确定这是由我的旧手机(运行Android6.1(引起的,还是以这种方式修复。
还要注意的是,我没有使用shiny.notifications,只是在方法运行时显示了一个弹出窗口(用于测试目的(,如下所示:
public async Task OnStatusChanged(GeofenceState newStatus, GeofenceRegion region)
{
await Application.Current.MainPage.DisplayAlert(newStatus.ToString(), $"{region.Identifier}", "Ok");
}
希望这能有所帮助;(