为什么我的CLLocationmanager委托没有被调用?

时间:2010-09-17 00:24:50

标签: iphone cllocationmanager

我没有在sim或设备上获得任何位置回调。我已经调用了这段代码:

- (void)startLocationCallbacks: (NSObject*) ignore
{
  locationManager.delegate = self;
  locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
  locationManager.distanceFilter = MINIMUM_METERS;

  [locationManager startUpdatingLocation];
  NSLog(@"[DEBUG] [locationManager startUpdatingLocation] (%@, %@)", locationManager, locationManager.delegate);
}

并在两者顶部记录日志

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

但两个日志语句都没有被调用。为我的应用启用了位置通知(如设置中所示,加上我说“允许”。)

我没有获得位置更新的可能原因是什么?

配置/其他信息:

  • 我已经分配了locationManager,并将其保存在retain属性中。
  • 我调用了startUpdatingLocation
  • 我正在使用4.1 SDK
  • 问题在于Sim& iPod-touch(第二代)& iPhone-3,全部运行4.1
  • 我的应用中的允许位置通知(两者都在“设置”中指示,因为我在提醒中点击了“允许”。)
  • 之前我已成功使用过CLLocationManager(在许多运送应用程序中!)这对我来说是一个真正的拔毛器。

谢谢!

5 个答案:

答案 0 :(得分:48)

呼!好的,我找到了。

事实证明,使CLLocationManager无法触发位置回调的方法之一是在非主线程中进行所有设置。当我将我的设置例程移动到performSelectorOnMainThread时,所有操作都完全符合预期。

多么噩梦!

希望这个答案有助于其他人......

修改/澄清:

最初,我有这样的事情:

- (BOOL) appDidFinishLaunchingWithOptions: (NSDictionary*) options
{
     // ...[app setup, snip]
    [NSThread detachNewThreadSelector: @selector(postLaunchSetupThread) toTarget: self withObject: nil];
}

- (void)postLaunchSetupThread
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    // ...[other setup, snip]
    [self setupLocationManager];
    [pool release];
}

- (void)setupLocationManager
{
     self.myLocationManager = [[[CLLocationManager alloc] init] autorelease];
     [myLocationManager startLocationUpdates];
}

但是在线程中调用setupLocationManager会阻止回调。所以我的修复是移动线

[self setupLocationManager];

离开主题并返回appDidFinishLaunchingWithOptions

答案 1 :(得分:15)

实际上你也可以从另一个线程运行它。 来自Apple文档:

  

您的位置管理器对象的配置必须始终在a上进行   具有活动运行循环的线程,例如应用程序的主循环   线程。

只需确保您的运行循环在该线程上运行,并调度CLLocationManager事件。 更多关于运行循环: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

答案 2 :(得分:1)

适用于iOS 8

1)我在初始化位置管理员后立即放置了这些行。

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

2)我将NSLocationAlwaysUsageDescription添加到plist并将其设置为字符串并添加了一条消息。 3)在我的目标中,我点击了功能选项卡,然后打开后台模式并选中“位置更新”和“使用蓝牙LE附件”

这对我有用

答案 3 :(得分:0)

//查看此  //...CLLocationManager没有正确调用委托方法

// ...在很多R& D之后我正在使用看门狗方法,它称之为“

https://stackoverflow.com/questions/7156920/didupdatetolocation-doesnt-gets-called-immediately/14605889#14605889

答案 4 :(得分:0)

在我的情况下,这是因为我的设备无法确定位置 - 而在室内GPS信号不可用,Wi-Fi也断开连接,因此位置管理员只是无法接收任何位置数据,代表是从未打电话过

一旦我连接了Wi-Fi,它就可以工作了(我想在户外移动也应该可以做到这一点,但有时它不是很方便:))