問題:Core Location
がアプリ/トラッキングにアップデートを送信するのを止められないようです。
私は何をしているのか:viewWillAppear
でself.locationManager
を呼び出し、それをメソッドに渡して、マップ上のユーザーの場所を表示します(MKMapView
のインスタンス) )。ゲッターはオーバーライドされて、サービスが利用可能かどうかをチェックし、承認されているかどうかを確認します。もしそうなら、それはallocs/inits
とstartMonitoringSignificantLocationChanges
とreturns
です。
viewDidDisappear
では、[self.locationManager stopUpdatingLocation]
を呼び出します。しかし、それでもステータスバーに場所のアイコンが表示されます。ホームボタンをダブルタップして閉じることでアプリを終了しても、アイコンはまだそこにあります...長時間(10分以上)経過した後でも。設定アプリに移動すると、アプリがまだ位置情報サービス(紫色のアイコン)を使用していることがわかります。
質問:ここで何が欠けていますか?位置情報の更新が停止しないのはなぜですか?
前もって感謝します。
startMonitoringSignificantLocationChanges
の反対はstopUpdatingLocation
ではなく、stopMonitoringSignificantLocationChanges
です。
場所の大幅な変更のみを監視する特別な理由がない限り、定期的な更新のためにstartMonitoringSignificantLocationChanges
をstartUpdatingLocation
に置き換えることをお勧めします。
詳細は CLLocationのドキュメント をご覧ください。
私も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)
}
Swift:
マップ[〜#〜]と[〜#〜]ロケーションマネージャーの両方を停止する必要があります:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
locationManager.stopMonitoringSignificantLocationChanges()
locationManager.stopUpdatingLocation()
mapView.showsUserLocation = false
}
エネルギーサービスのデバッグナビゲーターで、Xcodeの位置情報サービスの使用状況をデバッグ/確認できます。
デリゲート後、locationManagerプロパティにこの設定nilを解決しました
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Your code getting coordinates
//Here set nil
locationManager = nil;
}
私のアプリは「常に」認証をリクエストします。アプリ内の特定の機能のみがそれを必要とします。ユーザーがこの機能をオフにすると、アプリを閉じるときに位置情報の更新を停止できます(バッテリーを節約し、ステータスバーから位置情報アイコンを削除するため)。アプリを閉じた後、ステータスバーの位置アイコンがまだ表示されていたため、停止が機能していないと思っていました。
私にとっての解決策はもう少し辛抱強くなることでした位置ハードウェアをオフにしてステータスバーを更新するのにiOSは約10-15秒かかることに気づきました。ロケーションマネージャーや特別なものを削除する必要はありませんでした。アプリを閉じるときに更新を停止し、15秒待って、iOSがステータスバーからロケーションアイコンを削除するのを確認しました。これが誰かに役立つことを願っています!
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
}
お役に立てば幸いです。
これを試して..
if ([CLLocationManager significantLocationChangeMonitoringAvailable])
{
[self.locationManager startMonitoringSignificantLocationChanges];
}
[[self locationManager] stopUpdatingLocation];
問題:私の場合、startMonitoringSignificantLocationChangesとstartUpdatingLocationの両方を使用しています。 locationManager.stopMonitoringSignificantLocationChanges()&locationManager.stopUpdatingLocation()を使用して場所を停止した後でも。現在地が頻繁に呼び出されています。
ソリューション:1. タイマーを無効にしたかどうかを確認します。 2.初期化locationManager.delegate = nil。
これらは確かにあなたの問題を解決します。
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に同じコードを配置できます。