虽然基于位置的应用程序使用Fast App Switcher杀死,但状态栏中显示灰色GPS箭头

时间:2012-01-31 09:21:34

标签: ios location xcode4.2 cllocationmanager fast-app-switching

我正在为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杀死应用程序时,状态栏中的灰色箭头消失。这些应用程序如何实现这一目标

2 个答案:

答案 0 :(得分:3)

  1. 如果您的应用不在前台,则可以使用重要的位置更新。
  2. 我只是给你一个想法我做过这样的事情,但我不知道你的情况会发生什么 只需注册您的应用程序以执行后台任务,并在此情况下做一些测试,如果您通过快速应用程序切换终止您的应用程序,则始终调用委托方法applicationWillTerminate:

  3. _ __ _ __ _ __ _ _ 被修改 _ __ _ __ _ __ _ __ _ _
    只需将此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"。