2014-07-16 98 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的問題。 –

相關問題