这是在iPhone 6s上的iOS 12.1.4上。通常Geolocation.GetLastKnownLocationAsync()
有效,但有时无效。这是完全相同的代码,但是如果我坐在这里,一遍又一遍地按我的“获取经纬度”按钮,最终Geolocation.GetLastKnownLocationAsync()
会吐出一个空值。
您知道为什么会发生这种情况以及如何处理吗?也许将其置于尝试10次的循环中,每次尝试之间等待一秒钟?
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;
}
}
答案 0 :(得分:2)
首先,在挂起运行循环时,使用Thread.Sleep
(除非您不在main / UI循环中)是非常不好的做法,如果确实需要延迟,请使用await Task.Delay(...
。同样,iOS上的CLLocationManager
在主循环上运行,如果您阻止了该循环,则消息泵将挂起,并且位置管理器无法向应用程序报告。
“发送垃圾邮件” CLLocationManager.Location(在iOS上为Essentials使用)由于操作系统速率限制更新(主要是节省电池电量的措施)以及OS正在为GPS无线电供电而导致(并将)返回null。更新其位置,此方法将在操作系统上超时,因此将nil
报告回GetLastKnownLocationAsync
,因此您将返回null
。
CLLocationManager.Location
用于从操作系统到应用程序的 快速低功耗返回,该功能在应用程序启动,设备重启等情况下会更新。 ..并非每次都调用它。
您可以通过调用GetLastKnownLocationAsync方法获取设备的最后一个已知位置。这通常比执行完整查询更快,但准确性可能较低。
否则,您应该使用GetLocationAsync
来使GPS完全通电以获取更新的准确位置。
要查询当前设备的位置坐标,可以使用GetLocationAsync。最好传入完整的GeolocationRequest和CancellationToken,因为它可能需要一些时间来获取设备的位置。
通常,我建议使用GetLastKnownLocationAsync
作为了解用户的一般区域的一种快速方法,因为这可能还会返回null
。然后继续在后台执行GetLocationAsync
(同时传递GeolocationRequest和CancellationToken实例),并根据更准确和最近的位置相应地更新应用。
re:https://docs.microsoft.com/en-us/xamarin/essentials/geolocation?tabs=ios