Xamarin.forms Xamarin形态-在土工围栏中时不触发发光的土工围栏

Xamarin.forms Xamarin形态-在土工围栏中时不触发发光的土工围栏,xamarin.forms,shiny,notifications,geolocation,geofencing,Xamarin.forms,Shiny,Notifications,Geolocation,Geofencing,我已经创建了一个xamarin表单应用程序,其中一个要求如下:用户应该能够按下按钮并创建地理围栏。创建地理围栏时,应用程序会不断检查用户是否在地理围栏中。这是真的,移动应用程序应该显示一个通知sayinf:您已进入geofence 我使用Shiny实现基于本教程的功能:“” 但问题是它什么也没做。我已经将geofence设置在离我家50米的地方,检查半径设置为200米,所以当我构建应用程序时,几秒钟/分钟我应该会收到一个不适,对吗?还是我需要先走出栅栏,然后再进去?如何解决此问题 我的代码:

我已经创建了一个xamarin表单应用程序,其中一个要求如下:用户应该能够按下按钮并创建地理围栏。创建地理围栏时,应用程序会不断检查用户是否在地理围栏中。这是真的,移动应用程序应该显示一个通知sayinf:您已进入geofence

我使用Shiny实现基于本教程的功能:“”

但问题是它什么也没做。我已经将geofence设置在离我家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);
        }
    }

}
//shiny通常不管理您的viewmodels,所以我们现在就来做
var geofenses=ShinyHost.Resolve();
var notifications=ShinyHost.Resolve();
寄存器=新命令(异步()=>
{
//这实际上只在iOS上需要,但这样做是为了安全
var access=等待通知。RequestAccess();
if(access==AccessState.Available)
{
等待地理围栏。开始监控(新地理围栏区域)(
“加拿大多伦多CN塔”,
新职位(52.079779,4.337133),
距离。米(200)
)
{
NotifyOnEntry=true,
NotifyOnExit=true,
单次使用=错误
});
}
});
公共类GeofenceDelegate:IGeofenceDelegate
{
私有只读INotificationManager\u通知;
公共GeofenceDelegate(INotificationManager通知)
{
_通知=通知;
}
公共异步任务OnStatusChanged(GeofenceState newStatus,GeofenceRegion)
{
if(newStatus==geofenstate.Entered)
{
等待进入(区域);
}
else if(newStatus==geofenstate.Exited)
{
等待左(区域);
}
}
}

我有与教程完全相同的代码,如果我调试了某个按钮,那么当我单击该按钮时就会创建地理围栏。所以在我看来一切都很好。

我也有类似的问题,只是假设当你开始进入围栏时,它不会识别你进入/退出,因为你已经在围栏内了

我必须走出/进入创建的围栏才能触发“OnStatusChanged”方法

需要注意的是,除非我的应用程序激活了手机的GPS系统(例如,定期重新请求当前位置),否则它不会进入该方法,但我不确定这是否是由我的旧ass手机(运行Android6.1)引起的,或者它是否以这种方式工作

还要注意的是,我没有使用shinny.notifications,只是在方法运行时(出于测试目的)显示了一个弹出窗口,如下所示:

public async Task OnStatusChanged(GeofenceState newStatus, GeofenceRegion region)
{
     await Application.Current.MainPage.DisplayAlert(newStatus.ToString(), $"{region.Identifier}", "Ok");
}

希望这有帮助;)

非常好,最后我选择不再使用闪亮。他们的文档不是最新的,样品也不是很好..是的。。。您是否使用了其他框架,或者您自己完成了所有工作?我使用了geolocator插件。我不知道用户的位置,并将其与另一个位置进行比较,当该值低于treshhold时,用户处于地理围栏中。我不知道这是否是一个真正好的解决方案,因为电池消耗。。