web-dev-qa-db-ja.com

CLLocationManager startUpdatingLocationがlocationManager:didUpdateLocations:またはlocationManager:didFailWithErrorを呼び出していません:

IOSプロジェクトでCLLocationManagerフレームワークを使用してユーザーの場所にアクセスしようとしていますが、

[locationManager startUpdatingLocation]

locationManager:didUpdateLocations:locationManager:didFailWithError:も呼び出されません。

//myViewController.h
@interface myViewController : UITableViewController <CLLocationManagerDelegate>
@end

//myViewController.m
@implementation myViewController{
    CLLocationManager *locationManager;
}

//edit
- (void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
}
//finish edit

-(void)getLocation
{
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
UIAlertView *errorAlert = [[UIAlertView alloc]
                           initWithTitle:@"Error" 
                                 message:@"Failed to Get Your Location"              
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                      otherButtonTitles:nil];
[errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations[[locations count] -1];
    CLLocation *currentLocation = newLocation;
    NSString *longitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    NSString *latitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];

if (currentLocation != nil) {
   NSLog(@"latitude: %@", latitude);
   NSLog(@"longitude: @"%@", longitude);
}else {
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" 
                                                     delegate:nil 
                                            cancelButtonTitle:@"OK" 
                                            otherButtonTitles:nil];
    [errorAlert show];
}

}
@end

ドキュメントに記載されているにもかかわらず、どちらのデリゲートメソッドも呼び出されていません。

「このメソッドはすぐに戻ります。このメソッドを呼び出すと、ロケーションマネージャーは初期ロケーション修正(数秒かかる場合があります)を取得し、デリゲートオブジェクトに加えてlocationManager:didUpdateLocations:メソッド[...]を呼び出してデリゲートに通知しますlocationManager:didUpdateLocations:メソッドを実装する場合、潜在的なエラーに対応するためにlocationManager:didFailWithError:メソッドも実装する必要があります。

問題をデバッグする方法がわかりません。

おかげで、

JA

37
ja.

enter image description hereこれをinfo.plistに追加するだけです

NSLocationAlwaysUsageDescription ---場所が必要です

NSLocationWhenInUseUsageDescription ---場所が必要です

プライバシー-ロケーションの使用方法の説明---ロケーションが必要

  locationManager = [[CLLocationManager alloc] init];
  locationManager.delegate=self;
  locationManager.desiredAccuracy=kCLLocationAccuracyBest;
  locationManager.distanceFilter=kCLDistanceFilterNone;
  [locationManager requestWhenInUseAuthorization];
  [locationManager startMonitoringSignificantLocationChanges];
  [locationManager startUpdatingLocation];

これで、didUpdateToLocationが確実に呼び出されます。

詳細については ここをクリック

89
Mohit tomar

位置情報サービスは、iOS 8以降では少し異なります。

主に、キーNSLocationWhenInUseUsageDescriptionInfo.plistファイルに追加し、アプリに場所が必要な理由などの説明を追加する必要があります。 「場所が必要...」として。

IOSのバージョンも確認する必要がある場合があることに注意してください。 Location ManagerがrequestWhenInUseAuthorization呼び出しをリッスンするのは、iOS 8以降のみです。

以下のリンクに詳細が表示されます。 http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

がんばろう!

13
Emilio Barcelos

メインスレッドでCLLocationManagerを初期化することを強く確認する必要があります。それ以外の場合は、updateLocationイベントを取得しません。

私はそのような情報をApple docsで見つけることができませんが、とにかく私にとってはうまくいきます。

10
malex

IOS 8.0では、最初に-[CLLocationManager requestWhenInUseAuthorization ]または-[CLLocationManager requestAlwaysAuthorization]を呼び出す必要があるため、ユーザーはアプリの場所を使用する許可を与えるよう求められます。

5
orkoden

以下のものをプロジェクトに追加する必要があります。

  1. プロジェクトのplistに次のものを追加します。

    1. Key: NSLocationAlwaysUsageDescription Type:String
    2. Key: NSLocationWhenInUseUsageDescription Type:String
  2. [locationManager startUpdatingLocation]の.mファイルに次の条件を追加します。

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
         [locationManager requestAlwaysAuthorization];`
    

その後、CLLocationManagerデリゲートメソッドのみが呼び出されます。

4
Bhavin Trivedi

このリンクを確認する必要があると思います。宣言するときにロケーションマネージャオブジェクトを保持していません。

オブジェクトにプロパティを与えてください@property(nonatomic、strong)

CLLocationManagerデリゲートがiPhone SDK 4.0で呼び出されないのはなぜですか?

1
Dheeraj Kumar

したがって、シミュレータで実行している場合は、シミュレータメニューで場所を設定することを忘れないでください。 noneに設定されている場合、デリゲートで何も呼び出されないように見えます...これが実際のデバイスでも発生するかどうかはわかりませんが、おそらくシミュレーター固有のものです。

0
Renetik

私のコードベースには次のものがありました:

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if( status == kCLAuthorizationStatusAuthorizedAlways ) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        _locationManager.distanceFilter = 200;
    }
}

LocationManagerを初期化すると何らかの理由でこのメソッドがトリガーされるため、これは無限ループで呼び出されていましたか?それに気付いていませんでした。許可が与えられたときにキャッチするためにそこに置いていました。代わりに、ロケーションマネージャーをセットアップしてロケーションの更新を開始しましたが、その後、これが起動し、ロケーションを更新しないものに置き換えられ、繰り返しループを繰り返しました。

私にとっての解決策は、単に&& !_locationManager if条件に。

0
Jake T.