我最近开始在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
只是我的单例类,可以处理一些赔率和结束,包括保留对位置管理器的引用。
如果我需要发布更多代码,请告诉我。我只是不知道可能导致这个奇怪问题的原因。谢谢!
答案 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它是瞬间的。