我在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值,我想知道因为我创建的应用程序无法启用位置服务?
无论如何,提前谢谢
---我的解决方案---
见下文。
答案 0 :(得分:7)
要避免标题保持返回-1.000000,不要只是运行startUpdatingHeading而是一起运行startUpdatingLocation,这会有所帮助。
答案 1 :(得分: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]];
}
但是这种编码适用于不在模拟器中的设备......
快乐编码..
答案 2 :(得分:2)
---我的解决方案---
我做的是,在[self.locationManager startUpdatingLocation]
之前或之后添加[self.locationManager startUpdatingHeading];
(当位置服务关闭并从“设置”重新启用时)。我不确定这是一个很好的解决方案,但这就是我做的工作,如果你有更好的解决方案请分享。
答案 3 :(得分:1)
我自己的位置管理员遇到了一些麻烦,发现对我来说,测试时有助于将iPhone从电脑上拔下来。不知何故,只有在拔下iPhone后才会弹出校准警报。
答案 4 :(得分:0)
我有同样的问题。我将startUpdatingHeading移动到一个按钮操作,然后将其移回到分配CLLocationManager的位置 - 它一直正常工作 - 它开始只返回-1。
我重新启动了iPad,它又开始工作了。希望它保持这种状态。
编辑:不,它不会那样。我也必须使用startUpdatingLocation。这会不会耗尽电池吗?我将desiredAccuracy设置为kCLLocationAccuracyThreeKilometers,因为我还没有使用位置数据。
答案 5 :(得分:0)
真实读数需要知道您使用指南针的地方的磁性变化。从前面的讨论来看,似乎是从磁方向校正真实方向的函数需要您的位置来获得变化值。如果您不想在代码中使用位置GPS信息,我建议您阅读磁读数并自行更正值。您需要首先获得所需位置的变化,然后应用以下公式:T = M±V,其中T是真实方向,M是罗盘磁读数,V是变化。使用“+”表示东方,“ - ”表示西方。我发现允许的网站为任何需要的位置提供变化(磁偏角):http://www.geomag.nrcan.gc.ca/calc/mdcal-eng.php。
答案 6 :(得分:0)
当位置服务关闭时,didUpdateHeading delegate method
仅返回磁性航向。您可以根据自己的需要使用它。根据Apple文档..
要开始传送与标题相关的事件,请指定一个委托 位置管理器对象并调用其startUpdatingHeading方法。 如果还启用了位置更新,则位置管理器将返回 真实航向和磁航向值。如果位置更新 未启用,位置管理器仅返回磁性 标题值。
答案 7 :(得分:0)
立即解决此问题。当我使用SpriteKit时,我可以从Core Motion获得更新。它是关于能够像一帧(1/60秒)或每几帧一样连续调用一个函数。在不使用SpriteKit的情况下,文档说要在闭包中调用更新,我假设它将在他们自己的线程上并由你来释放。
有一种算法可将磁力计读数转换为相对于真北的实际度数。想象一下看起来像交流电的时域函数的图表,你会发现插值数据是应用麦克斯韦方程式的一个简单问题。 Here's an example on honeywell