【问题标题】:Tracking user location while app is terminated在应用程序终止时跟踪用户位置
【发布时间】:2016-11-22 18:08:58
【问题描述】:

我想澄清一下有关在应用暂停时跟踪用户位置的信息。我已经阅读了很多关于它的文章,但没有找到任何明确的答案。

  • 是否可以在应用程序暂停时根据用户的位置创建本地通知?
  • 如果可能,我的应用程序架构是什么样的?我的 CLLocationManager 子类实例需要在 AppDelegate 文件中声明还是可以创建为某个控制器的变量?

【问题讨论】:

  • 关于在应用暂停时跟踪用户位置?这将极大地侵犯用户隐私。用户杀死应用程序,期望它不会在后台执行任何操作。
  • @ProblemSlover 不正确。您可以在后台跟踪用户位置,但仅限于重大位置更改。您可以通过 AppDelegate 完成这一切,只需注册后台位置更新。看一下这个例子,他正在使用地理围栏在后台更新位置,然后在输入其中一个地理围栏时注册新的地理围栏:stackoverflow.com/a/30789632/3543861
  • @MSU_Bulldog 不正确什么?如果我正确理解问题是关于是否可以在应用程序暂停时执行此操作。暂停意味着被用户终止,我正确吗?只要应用保持在后台,您肯定会收到位置更新。
  • 您的问题不清楚。首先你说“终止”。然后你说“暂停”。这是两个完全不同的东西!你问的是哪个?

标签: ios swift core-location


【解决方案1】:

有几种不同的方法来处理这个问题。

您可以设置基于区域的本地通知。如果您的应用不在前台,则会向用户显示一条消息。只有当用户点击本地通知上的操作按钮时,您的应用才会收到通知/启动。

另一种处理方式:

您使用核心位置管理器创建系统代表您的应用监控的“地理围栏”区域。

当您的应用启动时,您应该创建一个位置管理器实例并设置一个委托。您需要处理向用户询问位置更新权限的过程,以及始终监控用户位置的权限。这是一个繁琐的多步骤过程,如果你错过了一个步骤,它就不起作用。有关更多信息,请参阅文档。 (当我设置一个带有位置服务的新应用程序时,我总是需要重新阅读它们,而且通常不会第一次就正确。)

完成此操作后,如果您收到区域进入/退出事件,系统将启动您的应用(如果应用未运行)。创建位置管理器并设置委托后,该委托会收到有关区域进入/退出事件的通知。

在您的区域进入/退出事件处理程序中,您可以根据需要向自己发布本地通知。

【讨论】:

  • 对吗?我会忘记 NSLocationWhenInUseUsageDescription/ NSLocationAlwaysUsageDescription 并且持续缺乏控制台错误会让我摸不着头脑!
  • 系统最多可以监控20个区域。但是,如果我有 20 个区域需要监控,那该怎么办?
【解决方案2】:

您可以使用region 属性为用户注册本地通知。

    //latitude & longitude come from your CLLocationManager delegates
    let region = CLCircularRegion(center: CLLocationCoordinate2DMake(45.5017, 73.5673), radius: 1500, identifier: "identifier") 
    region.notifyOnExit = false
    region.notifyOnEntry = true

    let notification = UILocalNotification()
    notification.region = region
    notification.regionTriggersOnce = true //only show this notification once
    notification.alertTitle = "Foo"
    notification.alertBody = "Hello World"
    UIApplication.shared.scheduleLocalNotification(notification)

请注意,您最多可以有 64 个本地通知: https://developer.apple.com/library/ios/documentation/iPhone/Reference/UILocalNotification_Class/

更新:“您一次最多只能监控 20 个位置区域。(总共有 20 个地理围栏区域和信标区域。)”- DuncanC

【讨论】:

  • @DuncanC 我展示了如何根据用户的位置创建本地通知,这是第一个问题。 OP 已经提到他们知道 CLLocationManager 并且可以使用最后已知的坐标来创建通知。
  • 好的,我明白你在说什么了。基于区域的本地通知。这会通知用户而不是启动您的应用程序。请注意,虽然您最多可以有 64 个待处理的本地通知,但您一次最多只能监控 20 个位置区域。 (总共有 20 个地理围栏区域和信标区域。)
  • @DuncanC 是的。也许func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) 可以在应用程序暂停时使用。然后manager.location 将提供最后收到的位置。在收到位置之前将为零。
【解决方案3】:

是否可以在应用程序暂停时根据用户的位置创建本地通知?

是的。当您使用后台位置监控时,如果您的应用程序未处于活动状态,它会在后台唤醒足够长的时间以接收来自运行时的事件。因此,您的应用程序现在正在临时运行。此时,创建本地通知是合法的。

如果可能,我的应用的架构是什么样的?我的 CLLocationManager 子类实例需要在 AppDelegate 文件中声明还是可以创建为某个控制器的变量?

来自运行时的事件将被发送给您的位置管理器的代表。因此,您的位置经理需要存在,并且需要拥有一个代表。它不一定是应用程序委托的属性,但它肯定需要是实际存在的某个实例的属性,所以如果它是视图控制器,最好不要是并不总是存在的视图控制器。

请注意,如果您的应用在暂停时被终止(这始终是可能的),它将从头开始(在后台)启动以接收此事件。在这种情况下,您可以从 didFinishLaunchingWithOptions: 中的 options: 字典中了解到这是因为传入的位置事件,因此您可以通过做任何必要的事情来响应,以便让自己成为位置经理和代表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多