在具有真正 GPS 的 iOS 设备上无法获得真正的 GPS 数据 (Altitutde)

Posted

技术标签:

【中文标题】在具有真正 GPS 的 iOS 设备上无法获得真正的 GPS 数据 (Altitutde)【英文标题】:Not getting true GPS data (Altitutde) on iOS devices that HAVE a real GPS 【发布时间】:2018-04-02 14:48:16 【问题描述】:

所以,我有一个导航应用程序。它使用板载 GPS(以及磁罗盘和加速度计)构建类似于 Google Sky 工作方式的 3D 增强现实视口。我们不使用 ARKit 的原因有很多,包括该设备将用于移动的车辆,我们担心 ARKit 会被明显不动的车辆内部分散注意力,而不是关注不可见移动的外部车辆外部的参考系,这是我们希望 AR 导航显示对齐的参考系。

AR 方向部分不是我的主要问题(尽管我发现磁罗盘加加速度计确实很容易出错)。我烦恼的问题是,无论我多么努力,一些 ios 设备(主要是 iPad)似乎都没有使用实际的 GPS 硬件来确定核心位置数据。它似乎使用 Wifi 三边测量,因此提供了较差的位置数据(缺少高度),因此提供了从位置数据计算的较差的速度数据。

这里有一些事实。

我这样初始化定位服务:

_locationManager = [[CLLocationManager alloc]init];  
[_locationManager requestAlwaysAuthorization];  
_locationManager.delegate = self;  
_locationManager.distanceFilter = kCLDistanceFilterNone;  
_locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;  
[_locationManager startUpdatingLocation]; 

在某些设备上,我们肯定会获得完整的 3D GPS 位置,包括海拔高度。

但是,某些测试设备(“APPLE MPMF2LL/A iPad Pro with Wi-Fi + Cellular 512GB, 10.5”, Silver”、“Apple iPad Air 2 MH2V2LL/A (16GB, Wi-Fi + Cellular, Silver) 2014模型”,同时具有蜂窝功能和 OS 11.2.6),我们得到的位置数据报告垂直精度

我们已尝试开启和关闭飞行模式,确保已启用定位服务并已向我们的应用授予权限。我们尝试将位置权限设置为“始终”。我们尝试过恢复出厂设置。

来自其他应用开发者的简单指南针应用似乎可以正常工作,并在这些设备上显示正确的高度和垂直精度。我们的应用程序似乎在其他设备(各种口味的 iPhone、全尺寸第 5 代 iPad)上运行良好,并获得完整的 GPS 位置。所以,这似乎不是测试设备的硬件故障,但也不是我们代码的完全故障。

是否有一些我们没有请求或正确执行的魔法来确保我们获得完整的 GPS 来源位置数据?

对于我们无法获得 GPS 海拔高度的设备或情况,代码中已经有一个后备方案。但是,如果设备具有该功能,我们希望确保我们以最佳功能使用它。我们也在研究使用外部 GPS 的能力,但如果我们要求的话,我们应该能够使用 iOS 设备肯定具备的功能。

感谢任何见解。好像不应该这么难。

【问题讨论】:

【参考方案1】:

所以,在经历了许多痛苦和磨难之后,我们确定了罪魁祸首,但仍有一个未知数未解。

我将从修复的差异开始,因为参考代码胜过一切,然后我将解释我们认为出了什么问题。

-    CLGeocoder *geocoder = [[CLGeocoder alloc] init] ;
-    [geocoder reverseGeocodeLocation:_currentLocation completionHandler:^(NSArray *placemarks, NSError *error)
+    if(_udpSocket == nil || timesincelastnetwork > _waitSecondsWithNoNetwork)
     
-        if (!(error))
-        
-            CLPlacemark *placemark = [placemarks objectAtIndex:0];
-           // NSLog(@"\nCurrent Location Detected\n");
-            //NSLog(@"placemark %@",placemark);
-            NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
-            NSString *Address = [[NSString alloc]initWithString:locatedAt];
-            NSString *Area = [[NSString alloc]initWithString:placemark.locality];
-            NSString *Country = [[NSString alloc]initWithString:placemark.country];
-            NSString *CountryArea = [NSString stringWithFormat:@"%@, %@", Area,Country];
-            //NSLog(@"%@",CountryArea);
-            
-            
-            CLLocation* l = placemark.location;
-            CLLocationCoordinate2D coords = l.coordinate;
+        _currentLocation = [locations objectAtIndex:0];
+        //[_locationManager stopUpdatingLocation];

-            
-            float lati = coords.latitude; //39.8560963f; //
-            float longi = coords.longitude; //-104.67373759999998f; //
-            
-            float alti = l.altitude;

因此,似乎发生的情况是,在地理编码过程中,在某些设备上,海拔高度丢失了,但在某些设备上却被保留了下来。由于我们并不真正需要地理编码(我们将其从示例代码中保留以防万一它有用),我们只是将其取出并直接从定位服务中使用 lat/lon/alt 并且它可以正常工作现在所有设备。

我认为这是一个错误,或者至少是一个未记录的情况,即地理编码器在某些不清楚的情况下会清除海拔值,但在其他情况下不会,但幸运的是,这是一个我们能够解决的错误。

【讨论】:

以上是关于在具有真正 GPS 的 iOS 设备上无法获得真正的 GPS 数据 (Altitutde)的主要内容,如果未能解决你的问题,请参考以下文章

为啥这条线不能在真正的 iOS 设备上工作?

无法在真正的 android 设备上获取当前位置

我可以在真正的 iOS 设备上从 Windows 运行 React Native 应用程序吗?

到最近的火车站的距离

无法在真正的 Apple Watch 上构建 hello world 应用

Flutter 应用程序无法在真实的 iOS 设备上运行(白屏)