3

位置情報アプリを作っています。しかし、Core Location は機能しません。iPhoneで他のiPhoneアプリケーションをテストしました。
グーグルアースのようなナビゲーションソフト。他のアプリケーションも動作しません。
場所を更新しないのはなぜですか?
「locationManager:didUpdateToLocation:fromLocation:」メッセージが 2 回しか呼び出されないのはなぜですか?

もしかして… iPhone壊れた?または iOS 6 CoreLocation フレームワークにはバグがありますか?

位置情報サービス - iPhone の設定でオン

Info.plist

  • armv7
  • 加速度計
  • 位置情報サービス
  • GPS
  • マイクロフォン
  • 磁力計

コード例:

- (CLLocationManager *)setupLocationManager
{
  if ([CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) {

     CLLocationManager *locationManager = [[CLLocationManager alloc] init];
     locationManager.delegate = self;
     locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
     locationManager.distanceFilter = kCLDistanceFilterNone;
     locationManager.headingFilter = kCLHeadingFilterNone;
     [locationManager startUpdatingLocation];
     [locationManager startUpdatingHeading];
     return locationManager;
  }
  return nil;
}

- (CLLocationManager *)locationManager
{
  switch([CLLocationManager authorizationStatus])
  {
    case kCLAuthorizationStatusAuthorized:
      _deltaTimeLocationReceived = 0.0;
      if (_locationManager == nil)
        _locationManager = [self setupLocationManager];
       return _locationManager;

      case kCLAuthorizationStatusDenied:
      case kCLAuthorizationStatusRestricted:
        if (_locationManager)
          _locationManager = nil;
        return _locationManager;

      case kCLAuthorizationStatusNotDetermined:
        _deltaTimeLocationReceived = 0.0;
        if (_locationManager == nil)
          _locationManager = [self setupLocationManager];
        return nil;
    }
    return nil;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
  NSLog(@"%@ %@", NSStringFromSelector(_cmd), newLocation.description); 
  if (self.locationManager) _locationSignal++;
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
  NSLog(@"%@ %@", NSStringFromSelector(_cmd), error.description);
}
4

3 に答える 3

8

iOS 6 では、Apple は AutoPause API を実装することで Core Location に重大な変更を加えました。AutoPause API は、アプリケーションがバックグラウンドになり、いくつかの基準 (ユーザーが移動していない、位置情報が修正されていない、ユーザーがアクティビティを中止したなど) に適用されると、位置情報の更新を一時停止します。一時停止イベントを正確に処理するために、アクティビティの種類 (ナビゲーション、フィットネス、その他) を設定して位置情報の更新を一時停止するかどうかをより適切に予測できるように Apple が要求しています。アプリケーションが iOS 6 に対してコンパイルされると、AutoPause API はデフォルトで有効になります。

簡単な修正は、'pausesLocationUpdatesAutomatically' を常に NO に設定することで、今のところ AutoPause API を無効にすることです。以前の iOS 6 で動作していたように、アプリがバックグラウンドになっている場合でも、位置情報の更新が送信されます。

詳細はこちら:

http://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html

于 2012-10-20T16:26:41.330 に答える
0

デリゲート メソッドからのメッセージはありますか?

メッセージが表示されない場合は、クラスのインターフェイスの説明を確認してください。

@interface ... <... CLLocationManagerDelegate ...>

于 2012-10-14T17:22:54.887 に答える