Geolocation.GetLastKnownLocationAsync() 有时返回 null

use*_*234 3 xamarin xamarin.essentials

这是在 iPhone 6s 上的 iOS 12.1.4 上。通常Geolocation.GetLastKnownLocationAsync()有效,但有时无效。这是完全相同的代码,但如果我坐在这里一遍又一遍地按下“获取纬度和经度”按钮,最终会Geolocation.GetLastKnownLocationAsync()吐出一个空值。

你知道为什么会发生这种情况以及我该如何处理吗?也许把它放在一个循环中,尝试十次,在每次尝试之间等待一秒钟?

var location = await Essentials.Geolocation.GetLastKnownLocationAsync(); // works most of the time but sometimes it doesn't work.
Run Code Online (Sandbox Code Playgroud)

这是我建议的解决方法:

Essentials.Location location = null;
for(var i = 0; i < 10; i++)
{
    location = await Essentials.Geolocation.GetLastKnownLocationAsync();
    if(location == null)
    {
        Thread.Sleep(1000);
    }
    else
    {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

Sus*_*ver 6

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

“垃圾邮件” CLLocationManager.Location(Essentials 在 iOS 上使用)可以(并且将会)由于操作系统速率限制更新(主要是电池保护措施)以及操作系统正在启动 GPS 无线电以更新其位置而导致空返回,此方法将从操作系统超时,从而nil返回报告GetLastKnownLocationAsync并因此您获得null.

CLLocationManager.Location在 iOS 上用于从操作系统到应用程序的快速低功耗返回,因为在应用程序启动、设备重新启动等时更新......而不是每次调用它时。

您可以通过调用 GetLastKnownLocationAsync 方法获取设备的最后一个已知位置。这通常比执行完整查询更快,但可能不太准确。

否则,您应该使用GetLocationAsync它来完成完整的 GPS 电源以获得更新的准确位置。

要查询当前设备的位置坐标,可以使用 GetLocationAsync。最好传入完整的 GeolocationRequest 和 CancellationToken,因为获取设备位置可能需要一些时间。

通常,我建议使用GetLastKnownLocationAsync作为一种快速的方式来让用户知道这也可能返回null。然后继续GetLocationAsync在后台执行(同时传递 GeolocationRequest 和 CancellationToken 实例)并根据更准确和最近的位置相应地更新应用程序。

回复:https : //docs.microsoft.com/en-us/xamarin/essentials/geolocation?tabs=ios