【问题标题】:Not getting true GPS data (Altitutde) on iOS devices that HAVE a real GPS在具有真正 GPS 的 iOS 设备上无法获得真正的 GPS 数据 (Altitutde)
【发布时间】: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 设备肯定具备的功能。

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

【问题讨论】:

    标签: ios ipad geolocation gps core-location


    【解决方案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 并且它可以正常工作现在所有设备。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 2015-10-10
      • 1970-01-01
      相关资源
      最近更新 更多