【问题标题】:Geolocation.GetLastKnownLocationAsync() sometimes returns nullGeolocation.GetLastKnownLocationAsync() 有时返回 null
【发布时间】:2019-03-29 15:53:30
【问题描述】:

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

【问题讨论】:

    标签: xamarin xamarin.essentials


    【解决方案1】:

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

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

    iOS 上的

    CLLocationManager.Location 旨在实现从操作系统到应用的快速低功耗返回,并在应用启动、设备重启等时更新...不是每次都调用它。

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

    否则,您应该使用GetLocationAsync 来完全启动 GPS 以获得更新的准确位置。

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

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

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

    【讨论】:

    • 再次感谢@SushiHangover
    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多