web-dev-qa-db-ja.com

self.locationManager stopUpdatingLocationが位置情報の更新を停止しない理由

問題Core Locationがアプリ/トラッキングにアップデートを送信するのを止められないようです。

私は何をしているのかviewWillAppearself.locationManagerを呼び出し、それをメソッドに渡して、マップ上のユーザーの場所を表示します(MKMapViewのインスタンス) )。ゲッターはオーバーライドされて、サービスが利用可能かどうかをチェックし、承認されているかどうかを確認します。もしそうなら、それはallocs/initsstartMonitoringSignificantLocationChangesreturnsです。

viewDidDisappearでは、[self.locationManager stopUpdatingLocation]を呼び出します。しかし、それでもステータスバーに場所のアイコンが表示されます。ホームボタンをダブルタップして閉じることでアプリを終了しても、アイコンはまだそこにあります...長時間(10分以上)経過した後でも。設定アプリに移動すると、アプリがまだ位置情報サービス(紫色のアイコン)を使用していることがわかります。

質問:ここで何が欠けていますか?位置情報の更新が停止しないのはなぜですか?

前もって感謝します。

23
Canopus

startMonitoringSignificantLocationChangesの反対はstopUpdatingLocationではなく、stopMonitoringSignificantLocationChangesです。

場所の大幅な変更のみを監視する特別な理由がない限り、定期的な更新のためにstartMonitoringSignificantLocationChangesstartUpdatingLocationに置き換えることをお勧めします。

詳細は CLLocationのドキュメント をご覧ください。

16
jnic

私もCanopusと同じ問題を経験しました。 showUserLocationを有効にしている場合、stopUpdatingLocationが呼び出されても、ナビゲーションポインターがステータスバーに残っているようです。おそらくこれはバグですか? 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)
}
14
Christopher

Swift:

マップ[〜#〜]と[〜#〜]ロケーションマネージャーの両方を停止する必要があります:

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

    }

エネルギーサービスのデバッグナビゲーターで、Xcodeの位置情報サービスの使用状況をデバッグ/確認できます。

3
Juan Boero

デリゲート後、locationManagerプロパティにこの設定nilを解決しました

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

}
2
iOScar182

私のアプリは「常に」認証をリクエストします。アプリ内の特定の機能のみがそれを必要とします。ユーザーがこの機能をオフにすると、アプリを閉じるときに位置情報の更新を停止できます(バッテリーを節約し、ステータスバーから位置情報アイコンを削除するため)。アプリを閉じた後、ステータスバーの位置アイコンがまだ表示されていたため、停止が機能していないと思っていました。

私にとっての解決策はもう少し辛抱強くなることでした位置ハードウェアをオフにしてステータスバーを更新するのにiOSは約10-15秒かかることに気づきました。ロケーションマネージャーや特別なものを削除する必要はありませんでした。アプリを閉じるときに更新を停止し、15秒待って、iOSがステータスバーからロケーションアイコンを削除するのを確認しました。これが誰かに役立つことを願っています!

1
John Erck

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
}

お役に立てば幸いです。

1
valbu17

これを試して..

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


            }

 [[self locationManager] stopUpdatingLocation];
0
Kiran K

問題:私の場合、startMonitoringSignificantLocationChangesstartUpdatingLocationの両方を使用しています。 locationManager.stopMonitoringSignificantLocationChanges()locationManager.stopUpdatingLocation()を使用して場所を停止した後でも。現在地が頻繁に呼び出されています。

ソリューション:1. タイマーを無効にしたかどうかを確認します。 2.初期化locationManager.delegate = nil

これらは確かにあなたの問題を解決します。

0
Sarthak Sharma

IOS向けGoogleMaps SDKを使用している場合、

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
        }) 

別のビューにセグメンテーションするときにステータスバーにgpsアイコンを表示したくない場合は、viewWillDisappearに同じコードを配置できます。

0
D. Rothschild