web-dev-qa-db-ja.com

didUpdateLocationsは呼び出されません

現在の場所を取得しようとしていますが、didUpdateLocationsのブレークポイントが呼び出されることはありません。

LocationManager:

locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDesiredAccuracy:kCLDistanceFilterNone];
[locationManager startUpdatingLocation];

デリゲートメソッド:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

その位置情報サービスを確認し、有効にして承認しました。

LocationManagerデリゲートメソッドが、本来のように呼び出されないのはなぜですか?

ありがとう、マイク

31
user2247438

さらにiOS8では、次の2つの追加事項が必要です。

  • Info.plistにキーを追加し、ロケーションマネージャーに開始を要求する承認を要求します。

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

  • 対応するロケーションメソッドの認証をリクエストする必要があります。

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

コード例:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];

ソース: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

68
MarMass

この問題が発生したときは、スレッドの問題が原因でした。

これらのすべてのメソッドがメインスレッドで呼び出されることを確認してください。メインスレッドでstartUpdatingLocationメソッドだけでなく、他のスレッドでも呼び出されることが非常に重要です。

内部スレッドをラップすることにより、メインスレッドでコードを強制的に実行できます。

dispatch_sync(dispatch_get_main_queue(), ^{

});

this answer もチェックしてください。

30
Tim Bodeit

CLLocationManagerをプロパティとして追加したことを確認してください。

@property (nonatomic , strong) CLLocationManager *locationManager;
9
Gabriel.Massana

はい、プロパティは私にとって解決策であり、位置情報サービスが有効になっていることを確認することをお勧めします:

if ([CLLocationManager locationServicesEnabled]) {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}
6
Zoltan Vinkler

シミュレートする場所をシミュレーターに指示する必要があります。場所を指定しない場合、CLLocationManagerデリゲートメソッドは呼び出されません。シミュレータメニューの[デバッグ]-> [場所]を使用できます。また、Xcodeのデバッグ領域の近くには、Xcodeからアプリを実行したときに表示される小さな場所の矢印があります。これを使用して、モーションをシミュレートするGPXファイルを指定できます(ただし、実際のデバイスとは異なります)。

https://devforums.Apple.com/message/1073267#1073267

2
dreday

IOS 11以降では、3番目のキーをinfo.plistに指定する必要があることに注意してください:NSLocationAlwaysAndWhenInUseUsageDescription

2
Urvish Modi

CLLocationManagerDelegateが設定されている場合、MapView Delegateも設定されます

また、シミュレーターの場所を確認し、[シミュレーター]> [デバッグ]> [場所]をクリックします(都市走行または高速道路ドライブへの変更がない場合)。それは私のために働いた。

1
Satyam Tayal