11

我尝试让 iPhone4 监控区域并通过调用 didEnterRegion 或 didExitRegion 通知我。我无法让它工作。我可能在这里阅读了所有相关的 enries,以及网络上的更多文章....iOS 只是不调用我的 CLLocationManagerDelegate 方法。我做了什么:

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

4

3 回答 3

44

以下是一些需要检查的事项:

  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. 可能发生此类监控失败的一个原因是核心位置对允许应用监控的区域数量施加了限制。在实践中,这个限制似乎是每个应用程序大约十个区域。因此,请确保删除不需要使用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:调用一些代码路径来实例化您的位置管理器对象并在这种情况下设置其委托。一旦你的位置管理器的委托属性被设置,

于 2011-12-06T18:11:29.853 回答
2

同样在这里。我也在尝试获取 didEnterRegion 并通知我。我看到的是该方法永远不会被调用。所以我有一个自定义签入(newLocation,oldLocation 函数)

分配一个距离和:

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

重要的位置变化很糟糕!

于 2010-12-30T15:24:50.093 回答
2

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

您可以下载仍然可以使用的 5.0 模拟器,或者下载 iOS 6 测试版(如果您是付费开发者)并在那里测试您的位置信息。除此之外,我们需要查看一些代码来显示所有设置是否正确。我猜如果区域监控图标出现,你做对了,只是模拟器错误的受害者。

于 2012-07-09T18:23:51.833 回答