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 中获取 Facebook 好友时出错

    我正在尝试获取登录用户的 Facebook 好友列表 它在我的帐户中工作正常 但是当我将应用程序详细信息迁移到新帐户并更改应用程序 ID 和应用程序密码时 我收到以下错误 Error Domain com facebook sdk Code
  • 使用 popToRootViewController 时我丢失了导航栏

    我有一个 iOS 应用程序 其中主屏幕是 UICollectionViewController 从集合视图中选择项目时 视图将推送到该项目的详细信息视图 在细节视图中 我构建了一个从侧面移出的抽屉 滑块 为了让视图看起来像我想要的那样 我隐
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • 从 Xcode iOS 项目运行 swift 脚本作为构建阶段

    这是一个简单的快速脚本 usr bin env xcrun swift import Foundation let task NSTask task launchPath bin echo task arguments farg1 arg2
  • 我可以更改导航栏项目的位置吗?

    Here is the snapshot 代码在这里 UIButton leftButton UIButton buttonWithType UIButtonTypeCustom leftButton frame CGRectMake 0
  • dequeueReusableCellWithIdentifier: 如何工作?

    我想要一些精确的信息dequeueReusableCellWithIdentifier kCellIdentifier 如果我理解得很好 下面的 NSLOG 应该只打印一次 但事实并非如此 那么 dequeueReusableCell 的意
  • 应用程序终止时处理通知(iOS)

    我正在开发接收通知的应用程序 使用苹果推送通知 我正在存储这些通知并在一个控制器中显示为列表 据我了解 每当收到通知时都会调用 didReceiveRemoteNotification 当应用程序位于前台和后台时 我可以通过 didRece
  • 更改“返回”键盘按钮的文本

    如何将 返回 按钮的标准文本更改为其他内容 我希望它是 添加 不幸的是 您可以使用以下命令将 Return 更改为这些预定义标签之一 returnKeyType财产 返回 默认 Go Google Join Next Route Searc
  • UIButton 触摸事件落入底层视图

    我创建了一个小UIView其中包含两个UIButton是 视图响应UITapGesture事件 按钮应该响应TouchUpInside 但是当我点击按钮时 响应者是底层视图 并且点击手势选择器被触发 寻找意见或建议 您可以修改橙色视图中响应
  • iOS 中输入字段显示不同大小

    我有一个带有背景和固定宽度 高度的输入字段 它在我桌面上的所有浏览器中看起来都很好 但由于某种原因 它看起来更大iPad and iPhone 我在 CSS 中尝试了一些技巧 但到目前为止没有任何效果 width 120px importa
  • 从核心数据存储创建 .sqlite 文件?

    我在书籍和提供 sqlite 文件下载的网站上看到过教程 sqlite 文件用于核心数据 如何获取 sqlite 文件FROM应用程序或核心数据存储TO我的桌面 如果您要创建一个预填充的 sqlite 文件以与 Core Data 一起使用
  • PreferredInterfaceOrientationForPresentation 必须返回受支持的界面方向 (iOS 6)

    我的应用程序窗口的根视图控制器是 UINavigationController 的子类 我已将此代码添加到类中 BOOL shouldAutorotate return self topViewController shouldAutoro
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • 如何在 Swift 编程中获得基于导航的模板功能

    我的项目需要一个导航控制器 并且我的应用程序最初有一个社交登录 一旦验证通过 用户将被推送到另一个视图 我在其中显示一个具有 2 个选项卡的选项卡控制器 我不知道如何在 Swift 编程中做到这一点 我已将视图控制器嵌入到导航控制器中 一旦
  • Xcode 4 Core Data:如何使用在数据模型编辑器中创建的获取属性

    如何在 Xcode 4 中实现获取的属性 Here is an example of two entities a book and a page 我按照此处的指南创建了一个获取的属性 该属性使用变量 FETCH SOURCE 引用来自源实
  • GIDSignIn 在提示前指定范围

    我在 iOS 上升级到 GoogleSignIn 6 0 但找不到在登录时指定登录范围的方法 我只能看到一个名为 addScopes 的 API 我可以在基本登录后指定范围 但这会导致两个单独的登录提示 这很奇怪 之前 我们可以简单地指定登
  • 如何将图像放在 UIButton 中文本的右侧?

    如果可以避免的话 我不想使用子视图 我想要一个UIButton其中包含背景图像 文本和图像 现在 当我这样做时 图像位于文本的左侧 背景图像 文本和图像都有不同的高亮状态 最简单的解决方案 iOS 10 及更高版本 Swift button
  • Swift 中的 AURenderCallback

    我正在创建一个使用音频单元的应用程序 虽然 Objective C 中有很多代码示例 包括 Apple 自己的 aurioTouch 等 但我正在尝试用 Swift 编写整个代码 我已经能够设置我的 AUGraph 并通过它运行一些音频 但
  • 在 swift 中从本地视频创建缩略图

    如何从本地视频文件快速创建缩略图 例如 如果视频文件路径位于此处 file Users Dev Library Developer CoreSimulator Devices F33222DF D8F0 448B A127 C5B03C64
  • cocos2d 2.0-rc2:结束director并重新启动

    我有一款由 cocos2d 驱动的游戏 它使用 UIKit 菜单 所以我只使用一个视图控制器的框架 即游戏本身 而且 它只有一个场景 从cocos2d 2 0开始 director本身就是一个UIViewController子类 所以我只是

随机推荐