12

我在 iPhone/iPad 指南针开发上遇到了一些问题。

从 CLHeading 获取的 trueHeading 总是给我“-1”值,我被困在这里。这是我的代码:

self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
self.locationManager.headingFilter = 0.5; //1 degrees
[self.locationManager startUpdatingHeading];

我还发现了一些事情,那就是当我在地图应用程序或指南针应用程序上使用位置信息时,trueHeading 值突然读取正确。我想知道是什么原因,有什么想法吗?它发生在 iPhone4 和 iPad 上。

每当我在设置中关闭位置服务并重新启用它时也会发生这种情况,它将无法读取正确的 trueHeading 值,我想知道是因为我创建的应用程序无法启用位置服务吗?

无论如何,提前谢谢

---我的解决方案---

见下文。

4

8 回答 8

7

为了避免标题不断返回-1.000000,不只是运行 startUpdatingHeading 而是一起运行 startUpdatingLocation,这有帮助。

于 2011-09-20T19:52:35.743 回答
4

试试用这个...

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate=self;
    locationManager.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    // Start heading updates. 
    if (locationManager.headingAvailable && locationManager.locationServicesEnabled) 
    {
        locationManager.headingFilter = kCLHeadingFilterNone; 
        [locationManager startUpdatingHeading];
    }

并在执行此 CLLocationManager 委托方法调用之后

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    // Use the true heading if it is valid. 
    [lblAccuracy setText:[NSString stringWithFormat:@"%.1fmi",newHeading.headingAccuracy]]; 
}

但是这种编码适用于不在模拟器中的设备......

快乐的编码..

于 2011-09-12T06:06:35.237 回答
2

---我的解决方案---

我所做的是,在[self.locationManager startUpdatingLocation]之前或之后添加[self.locationManager startUpdatingHeading];(当位置服务关闭并从设置重新启用时)。我不确定这是一个好的解决方案,但这是我为使其工作所做的工作,如果您有更好的解决方案,请分享。

于 2012-07-19T04:36:23.700 回答
1

我自己在位置管理器上遇到了一些麻烦,发现对我来说,在测试时从计算机上拔下 iPhone 是有帮助的。不知何故,仅在拔下 iPhone 后才弹出校准警报。

于 2011-11-03T20:57:08.783 回答
0

我有同样的问题。我将 startUpdatingHeading 移到一个按钮操作中,然后将其移回分配 CLLocationManager 的位置——它一直工作正常——它开始只返回-1。

我重新启动了我的 iPad,它又开始工作了。希望它保持这种状态。

编辑:不,它并没有保持这种状态。我也不得不使用 startUpdatingLocation 。这不会耗尽电池吗?我将desiredAccuracy 设置为kCLLocationAccuracyThreeKilometers,因为无论如何我都没有使用位置数据。

于 2013-01-21T19:53:03.887 回答
0

真正的读数需要知道您使用指南针的地方的磁场变化。从前面的讨论来看,从磁场方向校正真实方向的功能似乎需要您的位置才能获得变化值。如果您不喜欢在代码中使用位置 GPS 信息,我建议您阅读磁读数并自行更正该值。您需要首先获得所需位置的变化,然后应用以下公式:T=M ± V,其中 T 是真实方向,M 是罗盘磁读数,V 是变化。东用“+”,西用“-”。我发现允许网站为任何需要的位置提供变化(磁偏角):http ://www.geomag.nrcan.gc.ca/calc/mdcal-eng.php 。

于 2014-05-05T03:29:04.047 回答
0

当位置服务关闭时,didUpdateHeading delegate method仅返回磁航向。您可以根据自己的需要使用它。根据苹果文档..

要开始传递与航向相关的事件,请将委托分配给位置管理器对象并调用其 startUpdatingHeading 方法。如果还启用了位置更新,则位置管理器会返回真实航向和磁航向值。如果未启用位置更新,则位置管理器仅返回磁航向值。

于 2016-03-03T12:18:21.317 回答
0

现在正在处理这个问题。当我使用 SpriteKit 时,我可以从 Core Motion 获取更新。它是关于能够像一帧(1/60 秒)或每隔几帧一样连续调用一个函数。在不使用 SpriteKit 的情况下,文档说要在闭包中调用更新,我假设这将在它们自己的线程上并由您来发布。

有一种算法可以将磁力计读数转换为相对于真北的实际度数。想象一张看起来像交流电的时域函数的图表,您会发现对数据进行插值是应用麦克斯韦方程组的简单事情。 这是霍尼韦尔的一个例子

于 2016-03-23T23:20:07.967 回答