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)
首先,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
| 归档时间: |
|
| 查看次数: |
2366 次 |
| 最近记录: |