关闭应用程序时的 iOS 7.1 CoreLocation 和地理围栏

Posted

技术标签:

【中文标题】关闭应用程序时的 iOS 7.1 CoreLocation 和地理围栏【英文标题】:iOS 7.1 CoreLocation and geofencing when app is closed 【发布时间】:2014-05-28 00:36:03 【问题描述】:

我目前正在使用 CoreLocation 来设置地理围栏,并且每当用户进入或退出地理围栏时,我都需要该应用程序将事件存储在数据库中。它在应用程序运行或在后台运行时工作,但我需要它以某种方式执行应用程序的数据库保存代码,即使应用程序终止(即通过向上滑动多任务菜单关闭)。

我正在使用我认为自动执行此操作的 ios 7.1,但它不适合我。我怎样才能让它工作?我正在使用 CLLocationManager 类中的 startMonitoringForRegion 方法来监视区域。我是否需要做一些额外的事情才能在后台通知应用程序?此外,当应用程序重新启动时,数据库保存代码在应用程序中的位置(当前它位于应用程序委托的 didFinishLoadingWithOptions 菜单中)。

【问题讨论】:

您指的是 iOS 7.1 中的什么功能?我认为您可能会混淆后台与应用终止。 【参考方案1】:

根据 Apple Docs,我不确定 iOS7,但从 iOS8 开始:

当应用在前台或后台运行时,区域监控服务会正常传递事件。 (您可以将此服务用于地理和信标区域。)对于已终止的 iOS 应用程序,此服务会重新启动该应用程序以传递事件。使用此服务需要用户“始终”授权。

这意味着即使应用程序终止,地理围栏也能正常工作。此外,回调在 appDidFinishLaunching 中,您可以在其中获取密钥 UIApplicationLaunchOptionsLocationKey 中的信息字典

在 iOS 中,您向位置管理器注册的区域会在应用程序启动之间保持不变。如果在您的 iOS 应用程序未运行时发生跨区域,系统会在后台自动将其唤醒(或重新启动),以便处理该事件。重新启动后,您之前配置的所有区域都会在您创建的任何位置管理器对象的受监控区域属性中可用。

【讨论】:

【参考方案2】:

我正在使用 CLLocationManager 类中的 startMonitoringForRegion 方法来监控区域。我需要做些什么才能在后台通知应用程序吗?

不,因为您说的是终止,而不是后台处理:

它在应用程序运行或在后台运行时工作,但我需要它以某种方式执行应用程序的数据库保存代码,即使应用程序终止(即通过向上滑动多任务菜单关闭)。

您可能混淆了背景和未运行状态as mentioned here。如果您的应用没有运行,那么它不能也不应该做任何事情。

另外,这样想吧。当您滑动以杀死您的应用程序时,您的应用程序会从系统获得 SIGKILL。如果你在 Xcode 中运行调试器,你可以在 main.m 中观察到这一点。

另外,当应用重新启动时,数据库保存代码在应用中的哪个位置(当前它位于应用委托的 didFinishLoadingWithOptions 菜单中)。

您可以在didFinishLaunchingWithOptions 中执行此操作,或者在其他课程中通过收听来自NSNotificationCenterUIApplicationDidBecomeActiveNotification:See more about that here。

【讨论】:

【参考方案3】:

我相信如果您的应用被终止(暂停模式),您将无能为力。在暂停模式下触发本地通知时,您只能在应用再次激活时通过点击通知在didFinishLaunchingWithOptions 中处理。

代码可以是这样的:-

UILocalNotification *localNotif = [launchOptions objectForKey:  
                                  UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) 
    NSDictionary * userinfo = localNotif.userInfo;        
    if(userinfo)
        NSString * typeOfNotify = [userinfo objectForKey:@"typeOfNotify"];
        if([typeOfNotify isEqualToString:@"YOURKEY"])
            
                //TODO: Handle the database saving and etc.
            
    

处理local notification 的另一个地方是application:didReceiveLocalNotification:

我在 2 个地方有相同的代码来处理本地通知。

补充说明:请在此处查看我如何处理区域监控的代码:Region Monitoring Glitch on iOS 7 - Multiple Notifications at the same time

Region Monitoring 我遇到了一个故障,您可能需要采取预防措施来处理它。

【讨论】:

以上是关于关闭应用程序时的 iOS 7.1 CoreLocation 和地理围栏的主要内容,如果未能解决你的问题,请参考以下文章

应用程序关闭时的 iOS 任务

应用程序关闭时的 iOS 定位服务启用/禁用事件

如何在iphone的后台获取位置[关闭]

应用程序关闭时的本地通知处理

iOS 后台模式下的 GPS 监控

如何使用 Xcode 7.1 和 iOS 部署目标 iOS 7.1 启动应用程序?