CLLocationManager上一次已知位置

14

为了获取最后已知的地理位置,我已经:

CLLocationManager * locationManager = [[CLLocationManager alloc] init];
CLLocation * lastKnownLocation = [locationManager location];

lastKnownLocation指的是我的应用程序上一次被调用时的位置,还是指全局iOS系统级别的最后位置(其他应用程序或iOS可能已经查询了)?

我这样做是为了避免主动查询用户位置而浪费用户的电池。

如果用户没有授予访问位置的权限,显然lastKnownLocation应该为nil。我的问题专门针对用户已经给予应用程序访问位置的情况。

3个回答

5
通常情况下,你不应仅仅依赖于现有(如果有的话)从location返回的值,除非你检查其准确性和时间戳(与你的要求相比)。最好启动startUpdatingLocation直到获得符合你准确度要求的位置,然后停止stopUpdatingLocation或切换到stopMonitoringSignificantLocationChanges(如果可用)。
location返回的位置非常依赖历史记录,因此你不能确定它是完全正确的还是错误的,你总是需要验证其准确性以满足你的需求。

4
就只查找用户所在的城市如何?我只需要定位数据精确到100公里左右。假设用户至少在其他应用程序中打开了位置管理器,那么这意味着我可以得到一个足够的结果,对吗?我真的很想念安卓中的getLastKnownLocation()。链接 - stephanlindauer

1

我知道这是一个老问题,但为了完整起见,也许其他人会在这里结束:

CLLocationManager类有一个location属性,根据官方苹果文档,返回:

最近检索到的用户位置。

当没有已知位置时,此方法将返回nil


1

我在2023年也有同样的问题,但是在Apple文档或Google中仍然找不到任何好的答案。我还尝试向ChatGPT询问,答案是:

您代码中的lastLocation变量反映了您的应用程序通过CLLocationManager对象接收到的最后已知位置。这意味着它代表了您的应用程序获取的位置,而不是其他应用程序或iOS可能查询的系统级位置。

但我还想使用iOS模拟器进行测试。我创建了两个具有不同Bundle ID的应用程序。

应用程序A有两个按钮,每个按钮都具有以下功能:

  • 第一个按钮:使用locationManager.requestLocation()请求位置并在func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])中打印结果
  • 第二个按钮:使用locationManager.location打印最后一次位置

应用程序B只有一个按钮,具有以下功能:

  • 使用locationManager.requestLocation()请求位置,并在func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])中打印结果

之后,我按照以下步骤进行:

  1. 在iOS模拟器中运行应用程序A
  2. 设置模拟位置(功能>位置>自定义位置)为例如(-10,-20)
  3. 请求新的位置(第一个按钮)。该应用程序给我以下信息:

新位置:[<-10.00000000,-20.00000000>+/- 5.00米 (速度-1.00 mps / 路线-1.00) @18/04/2023 10:45:53 Horário Padrão de Brasília]。

  1. 请求最后的位置(第二个按钮)。该应用程序给我以下信息:

上次位置:Optional(<-10.00000000,-20.00000000>+/- 5.00米 (速度-1.00 mps / 路线-1.00) @18/04/2023 10:45:53 Horário Padrão de Brasília)。

  1. 在同一个iOS模拟器中运行应用程序B

  2. 设置模拟位置(功能>位置>自定义位置)为例如(30,40)

  3. 请求新鲜的位置。 应用程序将给我以下信息:

[<+30.00000000,+40.00000000> +/- 5.00m(速度-1.00 mps / 路线-1.00)@ 2023年4月18日10:48:44布拉西利亚标准时间]

  1. 再次运行应用程序A

  2. 再次请求最后的位置(第二个按钮)。应用程序将给我以下信息:

上次位置:Optional(<+30.00000000,+40.00000000> +/- 5.00m(速度-1.00 mps / 路线-1.00)@ 2023年4月18日10:48:44布拉西利亚标准时间)

将模拟位置(功能>位置>自定义位置)更改为例如(5, 5)。应用程序给出了以下结果: 上次位置:可选(<+30.00000000,+40.00000000> +/- 5.00m(速度-1.00 mps / 路径-1.00)@ 18/04/2023 10:48:44巴西利亚标准时间)
因此,如果设备跟随模拟器,locationManager.location应该给我们一个全局的iOS系统级别的最后位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接