0

現在、最初の CoreLocation ベースのアプリを開発していますが、CLLocationManager がデリゲート メソッドを呼び出さないという問題があります。私が使用しているクラスは次のとおりです。

//
//  LocationGetter.h
//  whatsunderme
//
//  Created by Tobias Timpe on 16.06.12.
//  Copyright (c) 2012 tobisoft. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@protocol LocationGetterDelegate
@required
- (void) newPhysicalLocation:(CLLocation *)location;
@end

@interface LocationGetter : NSObject <CLLocationManagerDelegate> {
   CLLocationManager *locationManager;
   id delegate;
} 

- (void)startUpdates;

@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain) id delegate;
@end

//
//  LocationGetter.m
//  whatsunderme
//
//  Created by Tobias Timpe on 16.06.12.
//  Copyright (c) 2012 tobisoft. All rights reserved.
//

#import "LocationGetter.h"

@implementation LocationGetter

@synthesize locationManager, delegate;
BOOL didUpdate = NO;

- (void)startUpdates {
    if (self.locationManager == nil) {
        self.locationManager = [[CLLocationManager alloc] init];
    }
    self.locationManager.delegate = self;
    NSLog(@"Starting Location Updates");
    locationManager.distanceFilter = 100;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Error");
}

// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)manage didUpdateToLocation:(CLLocation *)
newLocation fromLocation:(CLLocation *)oldLocation {
        NSLog(@"new Location found");
    didUpdate = YES;
    // Disable future updates to save power.
    [self.locationManager stopUpdatingLocation];

    [self.delegate newPhysicalLocation:newLocation];

}


@end

didUpdateToLocation メソッドも didFailWithError メソッドも呼び出されていません。どうしてか分かりません。問題が何であるかを2時間把握しようとしていたので、これで私を助けてくれることを願っています.

4

3 に答える 3

2

私のコードを使用してください、それはあなたのために働くはずです...

最初に、たとえば AppDelegate または CoreLocation を動作させたいコントローラーに以下を追加して、プロトコルを使用していることを確認します...

@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate>

いくつかのプロパティを作成します。カスタム メソッドも使用しますが、それもありません...

@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *currentLocation;

- (void)startUpdatingCurrentLocation;

次に、実装ファイルでカスタム メソッドを呼び出して CL を開始します。

// start location services
[self startUpdatingCurrentLocation];

以下は、私のカスタムメソッドのコードです。

- (void)startUpdatingCurrentLocation
{    
  // if location services are on
  if([CLLocationManager locationServicesEnabled])
  {
    // if location services are restricted do nothing
    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted )
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"Determining your current location cannot be performed at this time because location services are enabled but restricted." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
    }
    else 
    {
        if(!locationManager_)
        {
            locationManager_ = [[CLLocationManager alloc] init];
            [locationManager_ setDesiredAccuracy:kCLLocationAccuracyBest];
            [locationManager_ setDelegate:self];
            [locationManager_ setDistanceFilter:5.0f];          // measured in meters
            [locationManager_ setHeadingFilter:5];              // measured in degrees
            [locationManager_ setPurpose:@"Enabling location services is required in order to automatically determine the location of yada yada yada..."];
        }

        [locationManager_ startUpdatingLocation];
    }
  }
  else 
  {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Determining your current location cannot be performed at this time because location services are not enabled." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
  }
}
于 2012-06-20T20:38:08.697 に答える
1

Info.plistのUIRequiredDeviceCapabilities配列に文字列「location-services」を追加すると、問題が解決しました。

ここのドキュメントを読む https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

UIRequiredDeviceCapabilities の値は、アプリに必要な機能を示す文字列の配列です。位置情報サービスに関連する 2 つの文字列があります。

一般的に位置情報サービスが必要な場合は、位置情報サービスの文字列を含めます。アプリが GPS ハードウェアによってのみ提供される精度を必要とする場合は、gps 文字列を含めます。

于 2013-10-31T01:27:58.550 に答える
0

ああ、バカな私!

.mファイルではなく.hファイルでLocationGetterインスタンスの変数を宣言するのを忘れました!

于 2012-06-20T21:27:43.280 に答える