为什么我的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(在很多发货应用程序中!)这对我来说是一个真正的发型师。
  • 谢谢!


    呼! 好的,我找到了。

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


    其实你也可以从另一个线程运行它。 从Apple文档:

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

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


    对于iOS 8

    1)在我启动位置管理器之后,我就放置了这些行。

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

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

    这对我有效

    链接地址: http://www.djcxy.com/p/20337.html

    上一篇: Why is my CLLocationmanager delegate not getting called?

    下一篇: does it help or hurt?