在具有真正 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 设备上从 Windows 运行 React Native 应用程序吗?