iOS Geofence CLCircularRegion 监控。 locationManager:didExitRegion 似乎没有按预期工作

2024-03-10

我目前正在尝试让我的应用程序使用以下方式监视特定区域CoreLocation然而我发现它似乎没有按预期工作,在我看来,它不能在每个位置设置较小的小半径(即 10m)的情况下工作。

我还制作了一个小测试应用程序,它绘制了圆半径在地图上,这样我就可以直观地看到正在发生的事情。

我用于监控位置的代码如下:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

// Set-up a region
CLLocationDegrees latitude = 52.64915;
CLLocationDegrees longitude = -1.1506367;
CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);

CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:centerCoordinate
                                                                 radius:10 // Metres
                                                             identifier:@"testLocation"];

[self.locationManager startMonitoringForRegion:region];

我还没有在这里贴出代码DidEnter据我所知,当我距离监控区域超过 100m 时,该功能就会起作用。

这是应用程序的屏幕截图,当我距离地图上的紫色位置超过 10 米时,退出区域事件不会触发,但是如果我切换我的location to London它会点火,当我设置我的location回到当前蓝色位置,它也会触发。

有谁知道最小区域半径是否有限制,或者我可能做错了什么。

谢谢亚伦


我认为区域监控对于如此小的半径来说效果不佳。

  • GPS 芯片的最佳精度和kCLLocationAccuracyBestForNavigation通常只有10米。
  • 苹果公司表示(在位置和地图 PG https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/RegionMonitoring/RegionMonitoring.html#//apple_ref/doc/uid/TP40009497-CH9-SW11)区域的最小距离应假设为 200m
  • 我听说区域监控正在使用 WiFi 来获取其位置(这对于节省电量很有意义)。 WiFi精度更像是20m-100m。我不确定让另一个应用程序使用后台位置(即使用 GPS)会如何影响这一点。位置经理可能会共享信息以提高准确性。
  • 区域监控在进入区域后可能需要 30 秒才能触发,而在离开区域后需要几分钟才能触发(以防止位置故障触发它)。
  • 当区域监控首次引入时,他们表示它仅适用于 100m 的区域,任何较小的区域都会被提升。这种情况可能仍然会发生。
  • 有一个已弃用的方法startMonitoringForRegion:desiredAccuracy:它允许您指定超出区域边界的距离以开始生成通知。想必这个功能已经被纳入startMonitoringForRegion:但仍然存在。 10m 的区域最终可能有 10m 的缓冲区。
  • 如果要执行此操作,请指定要监控的周围更大的区域,当设备在该区域唤醒时,启动后台位置更新 (GPS) 并使用CLCircularRegion's -containsCoordinate:当设备在10m以内时手动触发。这种方法是苹果官方认可的(参见2013 年全球开发者大会 https://developer.apple.com/videos/wwdc/2013/第 307 节)。

来自CLCircularRegion docs:

请记住,位置管理器不会在跨越区域边界时立即生成通知。相反,它应用时间和距离标准来确保穿越是有意的并且应该真正触发通知。因此,请选择合适的中心点和半径,并给您足够的时间来提醒用户。

来自位置和地图 PG https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG:

区域事件可能不会在跨越区域边界后立即发生。为了防止虚假通知,iOS 在满足某些阈值条件之前不会发送区域通知。具体来说,用户的位置必须跨越区域边界,远离边界最小距离,并在报告通知之前保持在该最小距离至少 20 秒。
具体阈值距离由硬件和当前可用的定位技术确定。例如,如果 Wi-Fi 被禁用,区域监控的准确度就会显着降低。但是,出于测试目的,您可以假设最小距离约为 200 米。

还有更多内幕消息凯文·麦克马洪的这篇文章 http://www.kevfoo.com/2012/07/Core-Location-The-Missing-Details/,他在 WWDC 2012 的实验室中向 Core Location 工程师询问了有关区域监控的问题。此期间信息将会发生变化,但有关区域类别的部分很有趣。这是一个编辑:

精细区 (0 - 150m)
- 楼层为 100m 时,该类别的有效范围为 100-150m。
- 对于区域而言,此大小的性能很大程度上取决于与位置相关的硬件
- 跨越区域边界后,Core Location 检测并调用相应委托方法所需的时间平均约为 2-3 分钟。
- 一些开发人员独立地发现,较小的区域会看到更快的回调,并将较小的区域聚集起来覆盖一大片区域,以改善区域交叉通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS Geofence CLCircularRegion 监控。 locationManager:didExitRegion 似乎没有按预期工作 的相关文章

  • iOS:如何在不降低 fps 的情况下播放音频?

    我正在使用 Sprite Kit 最好使用 Swift 库 为 iOS 9 开发游戏 目前 我正在使用 Singleton 在其中预加载音频文件 每个文件都连接到一个单独的 AVAudioPlayer 实例 这是一个简短的代码片段来了解这个
  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 无法验证包:721772200.itmsp

    我写这篇文章是因为我有一个严重的问题 我在cartoonsmart 网站上购买了Commander Cool 游戏 然而 一个严重的问题发生了 iTune Connect 验证无法接受该申请 我尝试从两个不同的开发者帐户发布它 但错误仍然发
  • scntool:无法转换文件,失败原因:*** -[__NSSingleObjectArrayI objectAtIndex:]:索引 1 超出范围

    我正在 Xcode 9 3 下开发一个基于 iOS 11 3 SceneKit 的项目 我有几个 dae 文件格式的 3D 模型 每当我构建项目时 其中一个模型不会被复制到最终的 iOS 包中 深入研究错误 我在复制捆绑资源构建阶段收到以下
  • UIStackView分布均匀填充

    所以 我有一个UIStackView其中包含四 4 UIViews 如果我删除其中一 1 个UIViews 其他三 3 个将填满UIStackView 我的问题 如何添加最大高度UIView这样它就不会填满整个空间UIStackView即使
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • AFNetworking XML 请求问题

    我在用着AFNetworking 2使用 JSON 响应 它工作正常 现在我必须将其转换为 XML 而不是使用 JSON 因为服务器响应是 XML 格式的 在我搜索之后 我找到了这段代码 但它不起作用 与 Charles 我发现请求是错误的
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • locationOfTouch 和 numberOfTouches

    你好 我有这个识别器 设置为 2 次触摸 但它只返回一个 而不是两个 CGPoint void gestureLoad UIGestureRecognizer recognizer recognizer UITapGestureRecogn
  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • 贴纸包会在模拟器上使 iMessage 崩溃,但在 iPhone 上不会崩溃

    按照 Apple 的在线说明和视频在 Xcode 中创建了一个贴纸包 所有图像的尺寸均正确且远低于文件大小阈值 如果我在我的实体 iPhone 上构建并运行贴纸包 一切都会完美运行 如果我在模拟器上构建并运行贴纸包 对于任何模拟的 iPho
  • 叠加 SKScene 未显示

    我正在尝试将 SKScene 覆盖在 SCNScene 上 当我在模拟器和 iPhone6 上运行我的应用程序时 overlayScene SKScene 按预期显示 但是当我尝试在 iPhone5 上运行它 尝试了 2 个不同的设备 时
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐