2012-03-30 22 views
4

在底部(在AppDelegate.m中),您可以看到我的CLLocationManager委托方法,它们都不会被调用。我正在使用GPX文件,但即使这些区域没有输入或退出,也应该调用代理方法didStartMonitoringForRegion为什么我的CLLocationManager没有响应startMonitoringForRegion?

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); 
} 
+0

您是否已检查过'+(BOOL)regionMonitoringAvailable'和'+(BOOL) regionMonitoringEnabled'在您的位置管理器上? – 2012-03-30 13:33:54

+1

@DavidRönnqvist我刚刚做了,两者都是真实的。 – Pieter 2012-03-30 13:58:35

+0

也发生在我身上。奇怪的部分是该区域被正确监控,并显示在'monitoredRegions'中......我有一个偷偷的怀疑,只有当一个不同的'CLLocationManager'添加一个区域时才会调用这个区域(因为它们是在你的应用程序中共享的)... – 2012-06-27 22:01:42

回答

0

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

  1. 您还没有设置您的位置经理desiredAccuracydistanceFilter。他们应该默认为某些东西,但是如果您在GPX中的位置不在区域的准确度范围内,那么它可能不足以触发。
  2. 您用于开始监控的方法在iOS 6中已被弃用。您可以将精确度添加到位置管理器,并将其关闭。
  3. 这将是有益的,看看你是如何创建CLRegion监控,regionToMonitor。如果在开始监测时立即生成,您应该看到空心紫色位置箭头出现。您还应该收到代表电话-didStartMonitoringForRegion。如果这些都没有出现,那么你的位置管理器设置可能只是一个问题。
  4. 一个建议是创建自己的位置管理器类并将其转换为单例。这将防止您意外初始化多个代理并获得多个呼叫。它也给你一个干净的类来包含所有的回调方法。

我没有看到你包含的代码有什么问题,所以我猜测问题在于你没有包含的代码。检查以确保您的位置管理器代码正在初始化,并确保您的CLRegion正在正确创建。希望这可以帮助。如果包含更多代码并找出真正的问题,我很乐意更新我的答案。

2

首先你应该添加以下位置经理的委托方法,看看是否出于某种原因,区域监控注册失败的:

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

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

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

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

最后,如果您的应用程序完全终止,没有中止,那么你的应用程序将收到内部应用程序的委托:

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

一个UIApplicationLaunchOptionsLocationKeylaunchOptions字典。 然后,您有责任重新初始化您的位置管理员,获取当前位置并在应用程序生命状态有限的时间内向用户发出本地推送通知。

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

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

相关问题