【问题标题】:startMonitoringForRegion never calls didEnterRegion/didExitRegionstartMonitoringForRegion 从不调用 didEnterRegion/didExitRegion
【发布时间】:2011-05-08 07:57:29
【问题描述】:

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

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

【问题讨论】:

  • 曾经修复过这个问题吗?我真的很感激这方面的一些帮助。谢谢!

标签: iphone monitoring core-location region


【解决方案1】:

这里有一些事情要检查:

  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 的建议仅监控离用户最近的区域:

    在指定区域集时,您应该始终保持审慎 监视器。区域是共享的系统资源,其总数 全系统可用区域有限。为此,Core 位置限制了可能同时出现的区域数量 由单个应用程序监控。要解决这些限制,您 应该考虑只在用户的即时注册那些区域 附近。随着用户位置的变化,您可以删除 现在更远了,并在用户的路径上添加了即将出现的区域。如果 您尝试注册一个区域并且空间不可用,则 位置管理器调用 locationManager:monitoringDidFailForRegion:withError:它的方法 使用 kCLErrorRegionMonitoringFailure 错误代码委托。

  6. 希望显而易见,但请确保在设置委托后调用 startMonitoringForRegion:desiredAccuracy:

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

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

【讨论】:

  • monitoringDidFailForRegion 是我尝试添加数百个区域时的罪魁祸首。很好的答案,谢谢!
  • 在我的情况下,监控区域半径必须>= 450,否则不会调用didEnter/didLeave方法
  • 区域半径必须>=450?我希望每次恢复的半径为 5m。我的 didEnterRegion 和 didExitRegion 正在触发,但时间不一致;也许这可能是为什么?半径是150m而不是5m是不一致的,这是我设置的。帮助!
  • 监控区域半径必须大于450m是真的吗?我正在尝试使用 5m,当我用 iPhone 在外面实际测试它时,didEnterRegion 和 didExitRegion 的实际注册半径更像是 150m。这是地图套件的极限吗?
  • 6 号现已弃用。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    分配一个距离和:

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

    significantlocationchanges 糟透了!!

    【讨论】:

    • 曾经修复过这个问题吗?我真的很感激这方面的一些帮助。谢谢!
    • 我对答案太感兴趣了 :) 也有地区问题。
    猜你喜欢
    • 2013-12-13
    • 2013-04-27
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多