[英]Location services don't stop when application is terminated
我目前正在開發一個iPhone應用程序,它需要各種用途的定位服務,包括AR。
我在模擬器和iPhone 3GS上測試一切,一切順利。
我最近在iPhone4和iPad2上進行了測試,即使手動殺死應用程序,位置服務(狀態欄中的小圖標)仍然顯示! 禁用此圖標的唯一方法是在設置中手動停止我的應用的位置服務。
有誰知道這件事? 如果需要,我可以發布我的代碼。
先感謝您
編輯:
當我終止應用程序時,轉到位置服務,關閉我的應用程序,位置圖標消失。 但是當我重新打開它時,它會重新出現! 這是正常的嗎?
聽起來你是應用程序進入后台仍然使用CLLocation。 當您收到應用程序正在退出活動的通知時,您可以停止CLLOcationManager,這是最好的方法。 然后在它變為活動狀態時恢復。 這個問題的答案顯示了如何在這里做到這一點
[編輯]當您的應用程序進入后台或因任何原因(例如:電話)激活時,您應該停止當時的位置服務。 您需要訂閱通知並提供停止和啟動位置服務的方法,如下所示:
-(void)appDidBecomeActiveNotif:(NSNotification*)notif
{
[locationManager startUpdatingLocation];
}
-(void)appWillResignActiveNotif:(NSNotification*)notif
{
[locationManager stopUpdatingLocation];
}
-(void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActiveNotif:) name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActiveNotif:) name:UIApplicationWillResignActiveNotification object:nil];
}
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
我找到了答案! 它來自我之前啟用的區域監控,但幾周前刪除了使用它的所有代碼。
由於我已經在iPad上進行了測試,即使我刪除並重新安裝了應用程序,系統似乎也保留了我監控的區域信息。
因此,如文檔所述,iOS繼續定位我的應用程序,就像startMonitoringSignificantLocationChanges一樣。
感謝您的回答,它讓我更好地了解了定位系統以及如何有效地使用它(特別感謝progrmr和Bill Brasky )
我一直在與這個問題作斗爭,我想我終於深究了它...
當您提出要求時,位置服務不會停止的原因不是因為您沒有停止或正確釋放它。 根據我的經驗,它實際上是由釋放和重新分配CLLocationManager本身引起的。
如果您的代碼在applicationDidEnterBackground中釋放您的CLLocationManager,然后在applicationDidEnterForeground等中分配一個全新的CLLocationManager,那么您可能會遇到此問題。
解決方案是這樣的:
這樣,我就讓我的應用程序繼續使用位置服務長達12小時后將我的應用程序放在后台,到位置服務箭頭在使用這種新方法進行后台處理后10秒內消失。
注意:在運行iOS 5.1.1的iPhone 4S上測試。 要在這方面獲得應用程序性能的准確結果,請確保進入“設置” - >“位置服務” - >“系統服務”並關閉狀態欄圖標開關。 這樣,狀態欄箭頭將准確反映應用程序的使用情況。
在使用區域監控工具時,我遇到了同樣的問題。 我做了什么來禁用區域並不重要,箭頭仍然存在。 我最終通過清理對locationManager的調用來解決問題。 如果您要關閉視圖但不需要位置管理器,請將其設置為nil和/或將其釋放。 如果您在后台監控位置,它將保持在那里,但如果沒有,請確保您正在清理所有位置監控。
它似乎是一個錯誤,但正如我發現的那樣,它不是。 只需要更多的清理。
這是解決這個問題的解決方案。
只需停止監控位置的變化即可
- (void) applicationDidEnterBackground: (UIApplication *)application
{
[locationManager stopMonitoringSignificantLocationChanges];
locationManager.delegate = nil;
}
不在applicationWillEnterForeground:
然后,消失定位圖標需要幾秒鍾。
我不知道為什么它不適用於后一種方法。
據推測,這是因為用戶不需要盯着酒吧注意到一些惡作劇的應用正在使用位置服務。 當您使用任何位置服務時,該圖標會出現,並在之后的某些不確定時間內保留。
這是故意行為Apple希望用戶知道哪些應用正在使用他們的位置。 看來這是敏感數據,你不同意嗎?
我剛剛遇到這個問題,發現只applicationDelegate
一個applicationDelegate
對象的方法很有用
- (void)applicationWillEnterForeground:(UIApplication *)application;
如果您阻止CLLocationManager
接收該呼叫內的更新,您將沒有問題。 當然你需要在其他地方開始更新,並且- (void)applicationDidBecomeActive:(UIApplication *)application;
將是一個不錯的選擇。 您還需要注意,有兩種位置感知方法
基於gps -(void)start/stop_UpdatingLocation;
和3g / wi-fi -(void)start/stop_MonitoringSignificantLocationChanges;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.