在应用终止时跟踪用户位置

时间:2016-11-22 18:08:58

标签: ios swift core-location

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

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

3 个答案:

答案 0 :(得分:2)

有几种不同的方法可以解决这个问题。

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

处理它的另一种方法:

您使用核心位置管理器来创建"地理围栏"系统在您的应用上监控的区域。

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

当您完成此操作后,系统会在您收到区域进入/退出事件时启动您的应用程序。创建位置管理器并设置委托后,该委托会收到有关区域进入/退出事件的通知。

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

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:1)

  

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

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

  

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

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

请注意,如果您的应用在暂停时终止(这种情况总是可能),则会从头开始 (在后台),以便接收此事件。在这种情况下,您可以从options:中的didFinishLaunchingWithOptions:词典中了解这是因为传入的位置事件,因此您可以通过执行必要的操作来做出回应,以便让自己成为位置管理员和代表。