Ios 在应用程序终止时跟踪用户位置

Ios 在应用程序终止时跟踪用户位置,ios,swift,core-location,Ios,Swift,Core Location,我想澄清一下在应用程序暂停时跟踪用户位置的问题。我读了很多关于它的文章,但没有找到任何明确的答案 当应用程序挂起时,是否可以基于用户的位置创建本地通知? 如果可能的话,我的应用程序的架构是什么样子的?我的CLLocationManager子类实例需要在AppDelegate文件中声明,还是可以创建为某个控制器的变量? 您可以使用region属性为本地通知注册用户 //latitude & longitude come from your CLLocationManager del

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

当应用程序挂起时,是否可以基于用户的位置创建本地通知? 如果可能的话,我的应用程序的架构是什么样子的?我的CLLocationManager子类实例需要在AppDelegate文件中声明,还是可以创建为某个控制器的变量?
您可以使用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个本地通知:


更新:一次最多只能监视20个位置区域。总共有20个地理围栏区和信标区邓肯有几种不同的方法来处理这个问题

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

另一种处理方法:

您可以使用Core Location manager创建系统代表您的应用程序监视的地理围栏区域

启动应用程序时,应创建location manager的实例并设置代理。您需要处理向用户请求位置更新权限和始终监视用户位置权限的过程。这是一个复杂的、多步骤的过程,如果你错过了一个步骤,它就不起作用。有关更多信息,请参阅文档。当我使用定位服务设置新应用程序时,我总是要返回并重新阅读它们,而且通常不会在第一次就把它做好

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

在区域进入/退出事件的处理程序中,如果愿意,您可以向自己发布本地通知

当应用程序挂起时,是否可以基于用户的位置创建本地通知

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

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

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


请注意,如果您的应用程序在挂起时被终止(这一直是可能的),则它将在后台从头启动以接收此事件。在这种情况下,您可以从didFinishLaunchingWithOptions中的选项:dictionary中了解到这是由于传入的位置事件造成的,因此您可以通过执行任何必要的操作来响应,以获得位置管理器和代理。

关于在应用程序挂起时跟踪用户位置?这将严重侵犯用户隐私。用户终止应用程序,希望它不会在后台执行任何操作。@ProblemSlover不为true。您可以在后台跟踪用户位置,但仅限于重大位置更改。您可以通过AppDelegate完成这一切,只需注册后台位置更新。看看这个例子,他在后台使用geofences更新位置,然后在输入一个geofences后注册新的geofences:@MSU_Bulldog Not true什么?如果我理解正确的话,问题是在应用程序挂起时是否可以这样做。暂停意味着被用户终止,对吗。?只要应用程序仍在后台,您肯定可以收到位置更新。您的问题尚不清楚。首先你说终止。然后你说暂停。这是两件完全不同的事情!你在问什么?@duncac我在展示如何根据用户的位置创建本地通知,这是第一个问题。OP已经提到他们知道CLLocationManager,可以使用最后一个已知的坐标来创建通知。好的,我知道你在说什么了。基于区域的本地通知。这会通知用户,而不是启动您的应用程序。请注意,虽然您最多可以有64个本地通知挂起,但您可以
一次最多监视20个位置区域。总共有20个地理围栏区和信标区。@duncac-True。当应用程序挂起时,可能可以使用func LocationManager RDIDPauseLocationUpdate\uManager:CLLocationManager。然后manager.location将提供最后收到的位置。在收到位置之前将为零。对吗?如果不使用UsageDescription/NSLocationAlwaysUsageDescription,我就会忘记nsLocation,而继续缺少控制台错误会让我抓狂!系统最多可监控20个区域。但如果我有20多个区域需要监控,情况会怎样?