22

simまたはデバイスのいずれでもロケーションコールバックを取得していません。私はこのコードを呼んでいます:

- (void)startLocationCallbacks: (NSObject*) ignore
{
  locationManager.delegate = self;
  locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
  locationManager.distanceFilter = MINIMUM_METERS;

  [locationManager startUpdatingLocation];
  NSLog(@"[DEBUG] [locationManager startUpdatingLocation] (%@, %@)", locationManager, locationManager.delegate);
}

両方の上部にあるログステートメント

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

ただし、どちらのログステートメントも呼び出されません。私のアプリでは位置通知が有効になっています([設定]に表示されているほか、「許可」と言いました)。

位置情報が更新されない理由として考えられるものは何ですか?

構成/その他の情報:

  • locationManagerを割り当て、retainプロパティに保存しました。
  • startUpdatingLocationに電話しました
  • 4.1SDKを使用しています
  • 問題はSimとiPod-touch(第2世代)とiPhone-3の両方にあり、すべて4.1を実行しています
  • 位置情報の通知はアプリで許可されています([設定]に示されているように、またアラートで[許可]をクリックしたため)。
  • 私は以前にCLLocationManagerを正常に使用しました(多くの配送アプリで!)これは私にとって本当のヘアプラーです。

ありがとう!

4

5 に答える 5

53

うわー!わかりました、見つけました。

CLLocationManager起動しないロケーション コールバックを作成する方法の 1 つは、メイン スレッド以外ですべての設定を行うことです。セットアップ ルーチンを に移動するとperformSelectorOnMainThread、すべてが期待どおりに機能しました。

なんて悪夢だ!

この回答が他の人に役立つことを願っています...

編集/説明:

もともと、私は次のようなものを持っていました:

- (BOOL) appDidFinishLaunchingWithOptions: (NSDictionary*) options
{
     // ...[app setup, snip]
    [NSThread detachNewThreadSelector: @selector(postLaunchSetupThread) toTarget: self withObject: nil];
}

- (void)postLaunchSetupThread
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    // ...[other setup, snip]
    [self setupLocationManager];
    [pool release];
}

- (void)setupLocationManager
{
     self.myLocationManager = [[[CLLocationManager alloc] init] autorelease];
     [myLocationManager startLocationUpdates];
}

しかしsetupLocationManager、スレッドで呼び出すと、コールバックが妨げられました。だから私の修正は行を移動することでした

[self setupLocationManager];

スレッドから出て、スレッドに戻るappDidFinishLaunchingWithOptions

于 2010-09-17T05:48:40.960 に答える
17

実際には、別のスレッドからも実行できます。Apple のドキュメントから:

ロケーション マネージャー オブジェクトの構成は、アプリケーションのメイン スレッドなど、実行ループがアクティブなスレッドで常に行う必要があります。

実行ループがそのスレッドで実行されていること、および CLLocationManager イベントがディスパッチされていることを確認してください。実行ループの詳細: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

于 2012-02-11T01:58:51.070 に答える
1

iOS 8 の場合

1) ロケーションマネージャーを初期化した直後にこれらの行を配置しました。

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

2) NSLocationAlwaysUsageDescription を plist に追加し、文字列に設定してメッセージを追加しました。3) ターゲットで、[機能] タブをクリックし、[バックグラウンド モード] をオンにして、[位置情報の更新] と [Bluetooth LE アクセサリを使用] をオンにしました。

これは私のために働いた

于 2015-01-22T12:54:16.017 に答える
0

// これを確認してください //...CLLocationManager はデリゲート メソッドを適切に呼び出しません

//...多くの研究開発の後、「ウォッチドッグ メソッドを使用しています」

https://stackoverflow.com/questions/7156920/didupdatetolocation-doesnt-gets-called-immediately/14605889#14605889

于 2013-01-30T14:09:53.997 に答える
0

私の場合、デバイスが位置を特定できなかったことが原因でした-屋内にいる間、GPS信号が利用できず、wi-fiも切断されたため、位置マネージャーは位置データを受信できず、デリゲートは呼び出されませんでした.

Wi-Fiに接続すると、うまくいきました(その場合、屋外に移動することもうまくいくと思いますが、あまり便利な方法ではない場合があります:))

于 2015-03-22T09:57:27.343 に答える