我正在为iOS 5编写基于位置的应用程序。该应用程序正在使用CLLocationManager
来接收位置更新。
当应用程序启动时,我正在创建LocationManager,调用[self.locationManager startUpdatingLocation];
并且状态栏中会出现灰色位置箭头。
当应用程序进入后台时,我正在调用
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
因为我只想在应用程序处于后台时收到重要的位置更改。灰色位置箭头仍然显示。
我的应用程序中还有一个退出按钮,我正在调用
[self.locationManager stopUpdatingLocation];
exit(0);
当用户按下Exit-Button时,应用程序完成,灰色位置按钮从状态栏消失。到目前为止,一切都很好。
当用户使用快速应用程序切换器完成应用程序时出现问题,因为之后灰色位置箭头仍显示在状态栏中,尽管应用程序未运行。当用户从iPhone移除应用程序时,灰色位置箭头首先消失。
所以问题是:
当用户使用Fast App Switcher完成应用程序并且状态栏中仍然显示灰色箭头时,这是否意味着仍然执行位置更新,或者这是否意味着应用程序使用了位置服务whithin过去24小时?我想答案是第一个,位置更新仍在执行!
应用程序需要在后台执行,因此当应用程序进入后台时我无法停止LocationManager。当用户使用Fast App Switcher杀死应用程序时,永远不会调用applicationWillTerminate:
。当使用快速应用程序切换器终止应用程序或被操作系统终止时,有没有办法接收事件????
我见过其他一些应用程序,当使用Fast App Switcher杀死应用程序时,状态栏中的灰色箭头消失。这些应用程序如何实现这一目标
答案 0 :(得分:3)
applicationWillTerminate:
。
的 _ __ _ __ _ __ _ _ 强> 被修改的 _ __ _ __ _ __ _ __ _ _ 强>
只需将此varibale添加到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");
}
的 _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _ 强>
答案 1 :(得分:3)
尝试恢复"位置警告" in" settings-> general-> reset-> reset reset warnings"。它适用于我使用" startupdatinglocation"。