0

我最近开始在 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只是我的单例类,它处理一些零碎的事情,包括保持对位置管理器的引用。

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

4

3 回答 3

1

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

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

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

在您的@实现中:

@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;
于 2013-06-21T22:04:04.540 回答
0

你可以尝试一些东西。首先,我没有看到startUpdatingHeading电话。也许你在别的地方做。您应该将该locationManager:didFailWithError:方法添加到委托以检查错误,并尝试返回以防YES出现locationManagerShouldDisplayHeadingCalibration:校准问题。

于 2013-06-21T22:33:25.677 回答
0

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

于 2013-06-22T03:30:44.720 回答