2012-02-27 66 views
19

問題:似乎我不能阻止Core Location發送更新到我的應用程序/跟蹤。爲什麼self.locationManager stopUpdatingLocation不停止位置更新

我在做什麼:在我viewWillAppear我稱之爲self.locationManager,並把它傳遞給一個方法來顯示用戶在地圖上的位置(的MKMapView一個實例)。 getter被覆蓋以檢查serive的可用性,以查看它是否被授權。如果是這樣,它allocs/initsstartMonitoringSignificantLocationChangesreturns。我的電話是[self.locationManager stopUpdatingLocation]。但是我仍然可以看到狀態欄中的位置圖標。即使當我通過雙擊主頁按鈕並關閉應用程序來終止應用程序時,即使在延長的時間(10分鐘以上)之後,圖標仍然存在。當我去設置應用程序,它告訴我,我的應用程序仍在使用位置服務(紫色圖標)。

問題:我在這裏錯過了什麼?爲什麼位置更新不停止?

在此先感謝。

+0

如果你有兩個問題(即使它們是相關的),你應該問兩個單獨的問題。 – benzado 2012-02-27 17:56:30

+0

沒問題的第二部分。我拿出來了。我找到了答案。謝謝。 – Canopus 2012-02-27 18:28:52

+0

[Swift版本](http://stackoverflow.com/a/42936517/1634890) – 2017-03-21 19:30:58

回答

15

startMonitoringSignificantLocationChanges的反義詞不是stopUpdatingLocation,而是stopMonitoringSignificantLocationChanges

除非您有特定的原因只對重大的位置更改進行監控,否則您可能希望將startMonitoringSignificantLocationChanges替換爲startUpdatingLocation以獲得更定期的更新。

查看CLLocation documentation瞭解更多詳情。

+0

我試過了。實際上,當我第一次編寫代碼時,stopMonitoringSignificantLocationChanges,但由於它並沒有停止更新,我將其更改爲stopUpdatingLocation。我試圖在地圖上顯示某類商家的位置,所以我只需要一次用戶的位置。我不需要跟蹤它。 – Canopus 2012-02-27 18:20:44

+2

我仍然主張在你的場景中使用'startUpdatingLocation',一旦你的位置有足夠的精度滿足你的需求,就在你的'CLLocationManagerDelegate'中調用'stopUpdatingLocation'。 – jnic 2012-02-27 18:23:49

+2

我看到這個答案被檢查爲正確的。 jnic的回覆是有效的,但我懷疑我在下面提供的回覆是正確的。 – Christopher 2012-04-08 18:12:54

11

我也只是遇到了與Canopus相同的問題。看起來,即使調用了stopUpdatingLocation,如果我啓用了showUserLocation,導航指針仍駐留在狀態欄上。也許這是一個錯誤?這可能是因爲我正在運行並使用iOS 4.2.1進行測試,並且此問題可能已在更高版本的SDK中修復。

我會認爲,如果stopUserLocation被調用,它也將停止顯示用戶的位置,因爲我使用它的視圖已經消失,隨後釋放。

在停止用戶位置更新之前,您似乎必須將showUserLocation設置爲NO。

不管怎樣,在我viewDidLoad方法中,我有以下代碼:

self.mapView.showsUserLocation = YES; 

更多的代碼...

- (void)viewWillDisappear:(BOOL)animated 
{  
    if (locationManager) 
    { 
     mapView.showsUserLocation = NO; 
     [locationManager stopUpdatingLocation]; 
    } 

    [super viewWillDisappear:animated]; 
} 

- (void)dealloc 
{ 
    if (locationManager) 
    { 
     [locationManager release]; 
     locationManager = nil; 
    } 

    (other code) 
} 
+0

此答案適合我。 – 2012-09-25 15:18:05

+0

這也適用於我! – CainaSouza 2013-01-24 13:46:02

+4

這是因爲stopUpdatingLocation只是告訴LocationManager您的locationManager不再對位置更新感興趣。 mapView有它自己的locationManager,當showUserLocation被啓用時,它仍然請求位置更新。 GPS硬件在沒有任何等待位置更新的情況下不會關閉,因此指示燈保持點亮狀態。 – aranasaurus 2014-02-14 18:10:31

2

我解決了這個設置零到的LocationManager財產委託後

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    // Your code getting coordinates 
    //Here set nil 
    locationManager = nil; 

} 
+0

這將無法將locationManager設置爲零,當我嘗試將其值設置爲零時,出現類型不匹配錯誤。 – 2015-09-03 13:33:02

+0

它在Swift 3上完美運行,謝謝! – cubycode 2017-02-08 12:57:08

+0

請顯示更多關於locationManager的代碼,它是一個變量嗎?在文檔中哪裏說我們應該沒有經理? – 2017-03-21 19:37:21

1

我的應用程序請求「始終」身份驗證。只有應用程序中的某個功能需要。如果用戶關閉該功能,然後關閉應用程序,我們可以停止位置更新(目標是節省電量並從狀態欄中刪除位置圖標)。我也認爲停止不工作,因爲應用程序關閉狀態欄中的位置圖標後,仍然存在,即使我的應用程序是唯一的應用程序在我的手機上運行的位置訪問和「應用程序關閉」我只是告訴它停止更新位置。

對我來說,解決辦法是更加耐心一點,然後我意識到,需要的iOS約10-15秒至關閉位置的硬件和更新狀態欄。我不必刪除我的位置管理器或任何特殊的東西,只關閉應用關閉的更新,等待15秒,觀察iOS從狀態欄中刪除位置圖標。希望這能幫助那裏的人!

+0

請展示一些代碼 – 2017-03-21 19:38:38

1

我在Swift中使用CLLocationManager,我認爲它與Swift或Objective-C都有關係,但是我只是創建了一個布爾值,只要我接收到位置更新就更新爲true。因爲在我來說,我只需要一次就推出。例,

// my boolean to stop location updates 
var alreadyUpdatedLocation = Bool() 

而且,在我的情況我已經創建了一個輔助函數,每當我得到的數據/用戶的位置,我只是叫我自己stopUpdatingLocation這樣,

// helper function to stop updates 
func stopUpdationgLocation() { 

    // since I received my data within a block, I don't want to just return whenever it wants to :)  
    dispatch_async(dispatch_get_main_queue()) { 

     // the building stop updating location function call 
     self.locationManager.stopUpdatingLocation() 

     // my own trick to avoid keep getting updates 
     self.alreadyUpdatedLocation = true 

    } 
} 

然後,你在哪裏都使用您收到的位置更新,你可以這樣做......

// avoiding multiple calls after I have received user location 
if(self.alreadyUpdatedLocation) { 
     return 
} 

我希望它能幫助!

+0

保留週期麻煩提前 – 2017-03-21 19:41:22

0

試試這個..

if ([CLLocationManager significantLocationChangeMonitoringAvailable]) 
      { 
       [self.locationManager startMonitoringSignificantLocationChanges]; 


      } 

[[self locationManager] stopUpdatingLocation]; 
1

斯威夫特:

你的地圖位置管理器都需要停止:

override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     locationManager.stopMonitoringSignificantLocationChanges()    
     locationManager.stopUpdatingLocation() 
     mapView.showsUserLocation = false 

    } 

可以調試/檢查位置服務使用權在Xcode中,在Energy Impact下的調試導航器中。

+0

爲了我的目的,我還關閉了應用程序進入後臺時的showsUserLocation(偵聽通知'.UIApplicationDidEnterBackground'),並在獲取'.UIApplicationDidBecomeActive'時將其重新打開並且顯示視圖('如果self.isViewLoaded &&(self.view.window!= nil)')。在我的情況下,使用GPS的地圖視圖與應用何時在前景和背景中使用位置管理器用於其他目的無關。 在設備上,位置「箭頭」表示它在大約10秒後關閉。 – James 2017-04-30 02:04:48

0

如果您使用的是谷歌地圖SDK適用於iOS,我發現,如果你調用

locationManager.stopUpdatingLocation() 

,仍然有

mapView.isMyLocationEnabled = true 

那麼GPS圖標依然存在。

我選擇做的是先顯示用戶在地圖上的位置,然後在8秒後關閉它。這對我使用GoogleMaps SDK有效。我在viewDidLoad中添加此:

DispatchQueue.main.asyncAfter(deadline: .now() + 8.0, execute: { 
      self.locationManager.stopUpdatingLocation() 
      self.mapView.isMyLocationEnabled = false 
     }) 

你可以把在viewWillDisappear相同的代碼,如果你願意,當你Segue公司另一種觀點認爲不具有在狀態欄上的圖標GPS。