为什么我的CLLocationManager没有响应startMonitoringForRegion?

时间:2012-03-30 12:49:09

标签: ios xcode ios5 core-location cllocationmanager

在底部(在AppDelegate.m中),您可以看到我的CLLocationManager委托方法,其中没有一个被调用。我正在使用GPX文件,但即使没有输入或退出区域,也应该调用委托方法didStartMonitoringForRegion

SomeOtherClass.m

AppDelegate appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.locationManager startMonitoringForRegion:regionToMonitor desiredAccuracy:kCLLocationAccuracyNearestTenMeters];

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate>
@property (nonatomic, retain) CLLocationManager *locationManager;

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (locationManager==nil) {
        locationManager = [[CLLocationManager alloc] init];  
        locationManager.delegate = self;
    }

    return YES;
}

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"Did enter region");
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"Did exit region");
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Fail");
    NSLog(@"%@", [error description]);
}

-(void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    NSLog(@"Did start monitoring for region: %@", region.identifier);
}

2 个答案:

答案 0 :(得分:2)

首先,您应该添加以下位置管理器委托方法,并查看由于某种原因区域监控注册失败:

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {
    NSLog(@"%@",error);
}

其次,区域监控是系统共享资源。 该文档指出,它允许您监控有限数量的区域(不幸地不指定任何数字),并提到如果另一个应用程序注册要监控的其他区域,您的某些应用程序监控区域可能会被丢弃。

第三,区域监测没有使用任何GPS技术。它只使用网络运营商的蜂窝天线,无论何时更换蜂窝塔,它都会触发一个循环遍历所有受监控区域的系统事件,并查看某个区域是否位于您现在所在的新区域内。

这意味着您应该期望服务的准确性降低,因此您应该增加为区域设置的半径。

最后,如果您的应用已完全终止且未暂停,那么您的应用将在应用代理中收到:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

UIApplicationLaunchOptionsLocationKey字典中的launchOptions。 在您的应用程序实时状态的有限时间内,您有责任重新初始化您的位置管理员,获取当前位置并向用户发送本地推送通知。

由于应用程序不会在该阶段正常运行,但处于有限的后台模式状态。

此外,如果您想在模拟器中测试应用程序,则应将track.gpx文件添加到项目中,并将模拟器设置为跟踪模式。 确保放置在模拟器中的2个位置不是很远(因为完成跟踪可能需要很长时间)并将它们设置在路径中,它将进入受监控区域。 然后看看你是否得到任何回调。 不要使用您的设备进行测试,因为您需要实际走几个街区以查看与设备的任何真实互动: - )

答案 1 :(得分:0)

不完全确定为什么它不会收到你的回调。我会介绍一些我注意到的事情,你可以看看他们是否有所帮助。

  1. 您没有在位置管理器中设置desiredAccuracydistanceFilter。它们应该默认为某些东西,但是如果你在GPX中的位置不在区域的准确度范围内,那么它可能不会足够接近触发。
  2. 您在iOS 6中已弃用了用于开始监控的方法。您可以将准确性添加到位置管理器中,并将其保留在您的通话之外。
  3. 了解如何创建CLRegion进行监控regionToMonitor会很有帮助。如果一旦开始监视就创建好了,您应该会看到空心的紫色位置箭头。您还应该收到代理人电话-didStartMonitoringForRegion。如果这些都没有出现,那么您可能只是遇到了您的位置管理器设置问题。
  4. 一个建议是创建自己的位置管理器类并将其转换为单例。这将防止您意外初始化多个代理并获得多个调用。它还为您提供了一个包含所有回调方法的干净类。
  5. 我没有看到你所包含的代码有什么问题,所以我猜测问题在于你没有包含的代码。检查以确保您的位置管理器代码已初始化,并确保正确创建CLRegion。希望这可以帮助。如果您包含更多代码并且我们发现真正的问题是什么,我将很乐意更新我的答案。