startMonitoringForRegion从不调用didEnterRegion / didExitRegion

时间:2010-11-11 07:57:36

标签: iphone monitoring core-location region

我尝试让iPhone4监控区域并通过调用didEnterRegion或didExitRegion通知我。我无法让它发挥作用。我正在阅读这里所有相关的enries,再加上网上的几篇文章...... iOS只是不调用我的CLLocationManagerDelegate方法。 我做了什么:

我有一个简单的AppDelegate,它还实现了didEnterRegion和didExitRegion的CLLocationManagerDelegate方法。在这些方法中,我只需使用UILocalNotification来报告事件。在ViewController中,我创建了一个区域(当前位置),其宽度为1000米。

3 个答案:

答案 0 :(得分:43)

以下是要检查的内容:

  1. 在开始监控代码中的区域之前,请致电[CLLocationManager regionMonitoringAvailable][CLLocationManager regionMonitoringEnabled]以确保该服务在用户手机上可用并启用。

  2. 确保将位置管理员的delegate属性设置为您已实施locationManager:didEnterRegion:和/或locationManager:didExitRegion:的对象。

  3. 确保这些方法签名中没有任何拼写错误。小的大写错误会导致这些消息的传递失败。将这些复制/粘贴到您的代码中并确保它们匹配:

    - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
    { /* Handle enter */ }
    
    - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
    { /* Handle exit */ }
    
  4. 确保您的代理人也实施locationManager:monitoringDidFailForRegion:withError:,因为它可能会告诉您服务失败的原因。

    - (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
    {
        NSLog(@"Region monitoring failed with error: %@", [error localizedDescription]);
    }
    
  5. 可能发生此类监控失败的一个原因是Core Location对允许应用程序监控的区域数量施加限制。实际上,这个限制似乎是每个应用程序大约十个区域。因此,请务必使用stopMonitoringForRegion:删除不需要的区域,并按照Apple Location Awareness Programming Guide的建议仅监控离用户最近的区域:

      

    在指定区域集时,您应始终谨慎   监控。区域是共享系统资源和总数   系统范围内可用的区域有限。出于这个原因,核心   位置限制了可能同时的区域数量   由单个应用程序监控。为了解决这些限制,你   应该考虑只注册用户的那些区域   附近。随着用户位置的变化,您可以删除该区域   现在更进一步,并添加区域出现在用户的路径上。如果   你试图注册一个区域和空间不可用,   位置经理打电话给   locationManager:monitoringDidFailForRegion:withError:方法   委托使用kCLErrorRegionMonitoringFailure错误代码。

  6. 希望很明显,但请确保在设置代理后致电startMonitoringForRegion:desiredAccuracy:

  7. 使用CLRegion初始化您正在监控的initCircularRegionWithCenter:radius:identifier:对象时,请确保为每个区域使用唯一标识符。

  8. 如果您的locationManager:didEnterRegion:locationManager:didExitRegion:方法在应用处于活动状态时被正确调用,而不是在操作系统被杀后重新启动后台应用程序时,那么您可能不会在这种情况下正确初始化您的位置管理器并设置其委托。如果您在应用未运行时跨越已注册的区域边界,操作系统将在后台启动您的应用,您可以使用应用代表的if ([launchOptions objectForKey:@"UIApplicationLaunchOptionsLocationKey"]]) {}方法中的application:didFinishLaunchingWithOptions:来检测该应用。您的应用程序在后台启动时可能不会加载任何视图,因此您需要确保application:didFinishLaunchingWithOptions:调用一些代码路径来实例化您的位置管理器对象并在此情况下设置其委托。一旦您的位置经理的委托属性设置完毕,任何待处理的区域监控事件都将被传递。

答案 1 :(得分:2)

同样在这里。我也试图得到didEnterRegion并通知我。我看到的是该方法永远不会被调用。所以我正在进行自定义检查(newLocation,oldLocation函数)

分配距离并:

{
distance = [newLocation distanceFromLocation:(your location)];
if(distance < 300){
[appDelegate Notify:@"Entering "];
}

重要位置变化很糟糕!!

答案 2 :(得分:2)

iOS 5.1 Simulator存在一个已知错误,其中未调用区域监视委托方法。我使用它的经验是它会调用第一个触发的方法(进入或退出)但在此之后不再调用。我已经向Apple提交了雷达这个事实,但是在当前的迭代中大多数都被忽略了。他们确实回答询问它是否在iOS 6测试版中工作,它确实如此。我完全不希望他们为5.1修复它。

您可以下载仍然有效的5.0模拟器,或下载iOS 6测试版(如果您是付费开发者)并在那里测试您的位置。除此之外,我们需要查看一些代码,显示是否所有内容都已正确设置。我猜测区域监控图标是否显示,你做得对,并且只是模拟器bug的受害者。