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

Oli*_*lie 20 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);
}
Run Code Online (Sandbox Code Playgroud)

并在两者的顶部记录日志

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
Run Code Online (Sandbox Code Playgroud)

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
Run Code Online (Sandbox Code Playgroud)

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

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

配置/其他信息:

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

谢谢!

Oli*_*lie 48

呼!好的,我找到了.

事实证明,使一个CLLocationManager非关闭位置回调的方法之一是在非主线程中进行所有设置.当我将我的设置例程移动到a时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];
}
Run Code Online (Sandbox Code Playgroud)

但是调用setupLocationManager一个线程阻止了回调.所以我的修复是移动线

[self setupLocationManager];
Run Code Online (Sandbox Code Playgroud)

走出线程并重新进入 appDidFinishLaunchingWithOptions

  • 谢谢你 - 只是为了解决这个问题而节省了我几个小时的疯狂.CLLocationManager确实不喜欢在主线程之外创建. (5认同)
  • 我试图想出这个来疯了!非常感谢! (3认同)
  • 你是救命稻草!花了一整天的时间在这个上拉我的头发......谢谢! (2认同)

tte*_*kin 15

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

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

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

  • 我试图让这个在带有运行循环的线程上工作,并且仍然没有调用委托方法.你能提供一个有效的实例吗? (3认同)