在具有真正 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)的主要内容,如果未能解决你的问题,请参考以下文章