Geolocation.GetLastKnownLocationAsync()有时会返回null

时间:2019-03-29 15:53:31

标签: xamarin xamarin.essentials

这是在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;
    }
}

1 个答案:

答案 0 :(得分:2)

首先,在挂起运行循环时,使用Thread.Sleep(除非您不在main / UI循环中)是非常不好的做法,如果确实需要延迟,请使用await Task.Delay(... 。同样,iOS上的CLLocationManager在主循环上运行,如果您阻止了该循环,则消息泵将挂起,并且位置管理器无法向应用程序报告。

“发送垃圾邮件” CLLocationManager.Location(在iOS上为Essentials使用)由于操作系统速率限制更新(主要是节省电池电量的措施)以及OS正在为GPS无线电供电而导致(并将)返回null。更新其位置,此方法将在操作系统上超时,因此将nil报告回GetLastKnownLocationAsync,因此您将返回null

iOS上的

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