iPhone 5上的CLLocationManager标题问题

时间:2013-06-21 21:59:06

标签: iphone ios cllocationmanager cllocation heading

我最近开始在iPhone 5上测试我的应用程序,而且我的警报,似乎CLLocationManager确实没有用!虽然[CLLocationManager headingAvailable]YES,但我根本没有收到任何标题更新。奇怪的是,在iPhone 4上,经过30次左右的标题更新后,locationManager:didUpdateToHeading:不再被调用。这个问题是全新的。位置管理员还会返回verticalAccuracy的负数,因此我假设海拔高度无效。以下是我创建位置管理器的方法:

CLLocationManager* locationManager = [[CLLocationManager alloc] init];
if([locationManager respondsToSelector:@selector(disallowDeferredLocationUpdates)]) {
   [locationManager disallowDeferredLocationUpdates];
   [locationManager setPausesLocationUpdatesAutomatically:NO];
}
locationManager.headingOrientation = CLDeviceOrientationFaceUp;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.headingFilter = -1;
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
[sharedSingleton setLocationManager:locationManager];

sharedSingleton只是我的单例类,可以处理一些赔率和结束,包括保留对位置管理器的引用。

如果我需要发布更多代码,请告诉我。我只是不知道可能导致这个奇怪问题的原因。谢谢!

3 个答案:

答案 0 :(得分:1)

您需要在内存中保留“locationManager”,作为对象的属性或实例变量。

我感到相信的是,您正在创建您的位置管理员,然后您的方法退出,“locationManager”超出范围,并被ARC神奇地释放。

所以,相反,做这样的事情:

你的@implementation中的

@property (strong) CLLocationManager * locationManager;

并在你的@interface中:

self.locationManager = [[CLLocationManager alloc] init];
if([self.locationManager respondsToSelector:@selector(disallowDeferredLocationUpdates)]) {
   [self.locationManager disallowDeferredLocationUpdates];
   [self.locationManager setPausesLocationUpdatesAutomatically:NO];
}
self.locationManager.headingOrientation = CLDeviceOrientationFaceUp;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.headingFilter = -1;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

答案 1 :(得分:0)

你可以尝试一些事情。首先,我没有看到startUpdatingHeading电话。也许你正在其他地方做这件事。您应该将locationManager:didFailWithError:方法添加到代理中以检查错误,并尝试在YES中返回locationManagerShouldDisplayHeadingCalibration:,以防出现校准问题。

答案 2 :(得分:0)

似乎解决方案很明显,我忽略了它。在位置管理器启动后不久,代表被设置为nil,这解释了为什么在像iPhone 4这样的较慢的设备上,一些更新能够在代码设置为nil的代码设置之前运行,但是在iPhone上5它是瞬间的。