22

我在 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,并将其保存在一个保留属性中。
  • 我打电话给 startUpdatingLocation
  • 我正在使用 4.1 SDK
  • 问题出在 Sim & iPod-touch (2nd Gen) & iPhone-3 上,都运行 4.1
  • 我的应用程序中允许位置通知(如“设置”中所示,并且因为我在警报中单击了“允许”。)
  • 我以前曾成功使用过 CLLocationManager(在许多运输应用程序中!)这对我来说是一个真正的拔毛器。

谢谢!

4

5 回答 5

53

哇!好的,我找到了。

事实证明,使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

于 2010-09-17T05:48:40.960 回答
17

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

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

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

于 2012-02-11T01:58:51.070 回答
1

对于 iOS 8

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

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

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

这对我有用

于 2015-01-22T12:54:16.017 回答
0

// 看看这个 //...CLLocationManager 没有正确调用委托方法

//...经过大量研发后,我正在使用它调用的看门狗方法“

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

于 2013-01-30T14:09:53.997 回答
0

在我的情况下,这是因为我的设备无法确定位置 - 待在室内时 GPS 信号不可用且 wi-fi 也已断开连接,因此位置管理器无法接收任何位置数据,并且从未呼叫过代表。

一旦我连接了wi-fi,它就可以工作了(我想在这种情况下搬到户外也应该可以解决问题,但有时这不是很方便的方式:))

于 2015-03-22T09:57:27.343 回答