我正在为 iOS 5 编写一个基于位置的应用程序。该应用程序使用CLLocationManager
接收位置更新。
当应用程序启动时,我正在创建 LocationManager,调用[self.locationManager startUpdatingLocation];
并且状态栏中出现灰色位置箭头。
当应用程序进入后台时我正在打电话
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
因为我只想在应用程序处于后台时接收重大位置更改。灰色位置箭头仍然显示。
我正在调用的应用程序中也有一个退出按钮
[self.locationManager stopUpdatingLocation];
exit(0);
当用户按下退出按钮时,应用程序完成并且灰色位置按钮从状态栏中消失。到现在为止一切都很好。
当用户使用快速应用程序切换器完成应用程序时,就会出现问题,因为尽管应用程序没有运行,但之后灰色位置箭头仍然显示在状态栏中。当用户从 iPhone 中删除该应用程序时,灰色位置箭头首先消失。
所以问题是:
当用户使用快速应用程序切换器完成应用程序并且状态栏中仍然显示灰色箭头时,这是否意味着位置更新仍在执行,或者这是否意味着应用程序在过去 24 小时内使用了位置服务?我猜答案是第一个,位置更新仍然执行!
该应用程序需要在后台执行,因此当应用程序进入后台时我无法停止LocationManager。applicationWillTerminate:
当用户使用快速应用程序切换器终止应用程序时,永远不会调用。当应用程序使用快速应用程序切换器终止或由操作系统终止时,有什么方法可以接收事件???
我见过一些其他应用程序,当使用快速应用程序切换器终止应用程序时,状态栏中的灰色箭头消失。这些应用程序是如何实现这一点的???
- 如果您的应用程序不在前台,则可以进行重要的位置更新。
- 我只是给你一个想法,我已经做了类似的事情,但我不知道你的情况会发生什么。
只需将您的应用程序注册为后台任务,并执行一些用于测试目的的操作,在这种情况下,如果您通过快速应用程序切换然后委托方法终止您的应用程序applicationWillTerminate:
总是被调用。
___________Edited______________
只需将此变量添加到您的 AppDelegate.h 中
UIBackgroundTaskIdentifier bgTask;
并让你的委托方法像这样,现在杀死你的应用程序
- (void)applicationDidEnterBackground:(UIApplication *)application
{
UIApplication *app = [UIApplication sharedApplication];
if ([app respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) {
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
// Synchronize the cleanup call on the main thread in case
// the task actually finishes at around the same time.
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid)
{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
}];
}
}
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"is terminated");
}
_____________________________
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)