2014-07-16 100 views
3

我正在开发一个应用程序,当您在附近的升级地点时发送通知。 我的问题是,当我去背景,然后我退出应用程序,我不希望位置服务工作时,应用程序不工作(但我希望他们在后台工作)。当应用程序终止时停止位置更新

我只看到3应用时,应用程序关闭时关闭GPS,我想知道他们是怎么做的,Facebook,谷歌地图和苹果地图,不四方,不实地考察...

谢谢每一个人。

+0

根据我的理解,您希望在应用程序退出时删除位置,但在后台运行位置。在'AppDelegate'的'applicationWillTerminate'方法中。您需要添加'stopUpdatingLocation'或'stopMonitoringSignificantLocationChanges'并将位置对象设置为'nil'。也许它会帮助你。 –

+0

对不起,这不是那么容易...当你关闭应用程序,你在后台它不会触发applicationWillTerminate ... –

+0

哦,现在我可以理解你的问题。 :) –

回答

1

可以为你开始的LocationManager比停止位置更新

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(applicationWillTerminate:) 
               name:UIApplicationWillTerminateNotification 
               object:nil]; 

方法来执行,当您收到通知增加一个观察者

- (void)applicationWillTerminate:(NSNotification *)notification { 
//stop location updates 
} 
+0

我试过了,但不幸的是它并不那么容易......当你关闭应用程序并且你在后台时它没有发送该通知。 –

+0

@JavierPeigneux你测试的方式是什么?当其他应用程序处于前台时,我们会看到' - (void)applicationWillTerminate:(UIApplication *)application'和'UIApplicationWillTerminateNotification',我们通过刷新快照来关闭我们的应用程序。 –

+0

@AlexPeda问题是,当应用程序在后台,然后你通过刷新快照关闭它...我用日志,断点测试它,我有代码来停止在代码的其余部分工作的gps它从来没有在那里工作... –

0

通过@GuyS在此提供的解决方案主题应该工作。如果应用程序处于后台,我会收到,然后通过刷新快照将其关闭。请检查您是否正确使用NSNotificationCenter(特别是添加和删除通知)。另外,当应用程序处于后台时,请检查您订阅的对象是否处于活动状态。

另一个类似的解决方案是在您的AppDelegate方法中将禁用GPS的代码放入合适的UIApplicationDelegate回调中。

- (void)applicationWillTerminate:(UIApplication *)application { 
//stop location updates 
} 
1

我找到了正确的回答我的问题becouse @GuyS第二岗位:

添加在您的AppDelegate.m applicationDidEnterBackground

- (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; 
       } 
      }); 
     }]; 
    } 
} 

并声明变量:

UIBackgroundTaskIdentifier bgTask; 

之后,您只需停止applicationWillTerminat中的位置服务e ...

谢谢你的回复。

+0

这应该是一个公认的答案,它解决了当应用程序在后台时调用applicationWillTerminate的问题。 –

相关问题