Xamarin Geolocation.GetLastKnownLocationAsync()有时返回null
这是iPhone 6s上的iOS 12.1.4版本。通常Xamarin Geolocation.GetLastKnownLocationAsync()有时返回null,xamarin,xamarin.essentials,Xamarin,Xamarin.essentials,这是iPhone 6s上的iOS 12.1.4版本。通常Geolocation.GetLastKnownLocationAsync()可以工作,但有时不行。这是完全相同的代码,但如果我坐在这里反复按下“获取纬度和经度”按钮,最终Geolocation.GetLastKnownLocationAsync()会弹出一个空值 你知道为什么会发生这种情况,我会怎么处理吗?也许把它放在一个循环中,尝试十次,每次尝试之间等待一秒钟 var location = await Essentials.Geoloc
Geolocation.GetLastKnownLocationAsync()
可以工作,但有时不行。这是完全相同的代码,但如果我坐在这里反复按下“获取纬度和经度”按钮,最终Geolocation.GetLastKnownLocationAsync()
会弹出一个空值
你知道为什么会发生这种情况,我会怎么处理吗?也许把它放在一个循环中,尝试十次,每次尝试之间等待一秒钟
var location = await Essentials.Geolocation.GetLastKnownLocationAsync(); // works most of the time but sometimes it doesn't work.
这是我建议的工作:
Essentials.Location location = null;
for(var i = 0; i < 10; i++)
{
location = await Essentials.Geolocation.GetLastKnownLocationAsync();
if(location == null)
{
Thread.Sleep(1000);
}
else
{
break;
}
}
Essentials.Location=null;
对于(变量i=0;i<10;i++)
{
location=await Essentials.Geolocation.GetLastKnownLocationAsync();
if(位置==null)
{
睡眠(1000);
}
其他的
{
打破
}
}
首先,在挂起运行循环时使用线程.Sleep
(除非您不在主/UI循环上)是一种非常糟糕的做法,如果您确实需要延迟,请使用等待任务。延迟(…
。另外,iOS上的CLLocationManager
正在主循环上运行,如果您阻止它,则消息泵将挂起,位置管理器无法向应用程序报告
“垃圾邮件”CLLocationManager。由于操作系统速率限制更新(主要是电池节约措施),位置(Essentials在iOS上使用的位置)可能(并且将)导致空返回如果操作系统正在为GPS无线电通电以更新其位置,此方法将从操作系统超时,从而将nil
报告回GetLastKnownLocationAsync
,从而返回null
CLLocationManager.iOS上的Location
用于从操作系统到应用程序的快速低功耗返回,在应用程序启动、设备重新启动等时更新。并非每次调用它
您可以通过调用GetLastKnownLocationAsync方法获取设备的最后一个已知位置。这通常比执行完整查询更快,但精确度可能更低
否则,您应该使用GetLocationAsync
,以便对GPS进行完全通电,以获得更新的准确位置
要查询当前设备的位置坐标,可以使用GetLocationAsync。最好传入完整的GeolocationRequest和CancellationToken,因为获取设备的位置可能需要一些时间
通常,我建议使用GetLastKnownLocationAsync
作为一种快速方法,让用户知道这可能也会返回null
。然后继续执行GetLocationAsync
(同时传递GeolocationRequest和CancellationToken实例)在后台,并根据更准确和最新的位置相应地更新应用程序
回复:再次感谢您@sushingover