3

这是在 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.

这是我建议的解决方法:

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

1 回答 1

6

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

“垃圾邮件”CLLocationManager.Location(Essentials 在 iOS 上使用)可能(并且将)由于操作系统速率限制更新(主要是电池节省措施)以及操作系统正在启动 GPS 无线电以更新其位置而导致返回空值,此方法将从操作系统超时,因此报告nilGetLastKnownLocationAsync您,因此您将获得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

于 2019-03-29T16:30:24.170 回答