gpt4 book ai didi

iphone - (iOS)通过locationManager的多个通知:didExitRegion: when exiting a region

转载 作者:可可西里 更新时间:2023-11-01 03:38:51 24 4
gpt4 key购买 nike

我正在开发一个使用CLLocationManager区域监视的基于位置的应用程序。

我使用的是单个CLLocationManager和单个委托(delegate)(它们在启动时在主应用程序委托(delegate)中设置),并且我注意到退出时经常收到对我的委托(delegate)的多次调用(在locationManager:didExitRegion:上)受监控的区域-通常有两个电话,但有时还会更多。有没有其他人经历过这种情况,或有任何想法可能出什么问题?

我在应用程序委托(delegate)实例化的类中实例化CLLocationManager,如下所示:

    _locationManager = [[CLLocationManager alloc] init];
_locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
_locationManager.delegate = self;

我正在像这样设置区域监视:
    // The region instance has a radius of 300 meters
[_locationManager startMonitoringForRegion:region desiredAccuracy:1000];

据我从 documentation理解,提供所需的1000精度意味着仅当我们在区域外1000米处时才调用locationManager:didExitRegion:。

另外一点-据我所知,如果我在车上(因此旅行非常快),我只会收到一连串的多个通知。如果我骑自行车或步行,这似乎不会发生。任何有关我做错事情的指针(或者如果这是其他人已经遇到的问题),将不胜感激。

最佳答案

tl;博士:这确实非常简单-您正在获得苹果公司可以提供的有关您越过蜂窝塔边界的事实的信息-意味着,根本就不是很好的数据。

现在是真实的故事:

通常,CoreLocation只能通过几种方式确定自己的位置:

  • 通过GPS。这是非常准确的(几十米),但是要消耗很多功率。
  • 通过WiFi。尽管wifi基站可以而且确实会发生变化,但这通常是准确的,这使其变得模糊。这种方法会对照该区域中的wifi站与一些已知的准确位置进行交叉引用-因此,当它看到“FooWifiStation”时,它便与某个特定区域相关联,这是由精密仪器测量的,甚至可能是其他打开了GPS的电话(是有争议的,我们可能永远不知道苹果是否使用此方法)
  • 按手机信号塔位置。它们不会移动,因此当您与塔楼关联时,它知道您处于覆盖范围内的一个大模糊点。这是最不准确的方法,但是耗电量最少,因为您的电话已经在做保持联系的工作。

  • 如果进入“冷” map 应用程序,您甚至可以看到此信息:您立即以一个大的模糊蓝点开始(我所在的地方至少为1公里),然后随着得到wifi位置修复而缩小,然后更多GPS修复后,消失的甚至更少。它正在实时进行[手机信号塔] => [wifi] => [gps]精度。

    根据我的经验,“位置发生重大变化”子句的意思是“只要您不必再做任何工作或花费更多精力来获取这些数据,只要您进行大规模移动,我们就会通知您。实际上,这意味着您可以依靠的最好的方法是使用手机信号塔之间的转换苹果故意将这个模糊不清的地方保留下来,因为如果另一个应用程序使用了分辨率更高的东西-例如,您打开Maps.app,并获得了GPS修复-您可能会突然对位置进行很好的修复,但是您不能总是这样,您已经要求对位置进行“弱引用”。

    现在想一想,当您在车上闲逛时会发生什么:您的手机必须管理这种过渡。它被传递,立即与多个塔进行对话,以管理无缝过渡,这在您进行对话时必须是可行的。对于任何小盒子来说,这都是一件很整洁的壮举。必要时,这会导致您在位置更新中看到一些反弹,因为在电话协商过渡时,此时您正在手机塔之间振动。

    因此,半径实际上意味着您对大致准确的数据感兴趣-但API不能保证您在该半径范围内获得更新。您可以将其想像成苹果公司所说的:“我们将把您的准确性归为3组之一-但我们没有给您一个枚举,因为我们想保留开发更好的方法来固定您的位置的权利,而无需您必须更改代码”。当然,实际上,如果任何实际的应用程序更改了获取位置的方法,它们都将发生变化,因为它们会烦恼于此位置信息。

    换句话说,您将在手机信号塔上找到定位信息,并完全猜出该精度有多好。当您移至下一个塔楼时,您将立即跳至其位置,并进行类似的模糊修复-这样做有意义吗? CoreLocation告诉您,无论信号塔到达的距离多远,您都在信号塔内;当您移至另一座塔楼时,您可能会得到移交的弹性。

    因此,要真正做好,就必须假设数据是“很好”,“确定”或“不好”之一,并且如果确实需要使用其他方法(例如 Kalmann filters),更好地猜测用户所在的位置。作为零阶近似值,我将根据更新时间对回调进行反跳处理,并给出该更新时间,并假设用户并没有真正在几秒钟内来回飞跃,而是在第一次新更新的方向。

    关于iphone - (iOS)通过locationManager的多个通知:didExitRegion: when exiting a region,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9306683/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com