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
これをinfo.plistに追加するだけです
NSLocationAlwaysUsageDescription ---場所が必要です
NSLocationWhenInUseUsageDescription ---場所が必要です
プライバシー-ロケーションの使用方法の説明---ロケーションが必要
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate=self;
locationManager.desiredAccuracy=kCLLocationAccuracyBest;
locationManager.distanceFilter=kCLDistanceFilterNone;
[locationManager requestWhenInUseAuthorization];
[locationManager startMonitoringSignificantLocationChanges];
[locationManager startUpdatingLocation];
これで、didUpdateToLocationが確実に呼び出されます。
詳細については ここをクリック
位置情報サービスは、iOS 8以降では少し異なります。
主に、キーNSLocationWhenInUseUsageDescription
をInfo.plistファイルに追加し、アプリに場所が必要な理由などの説明を追加する必要があります。 「場所が必要...」として。
IOSのバージョンも確認する必要がある場合があることに注意してください。 Location ManagerがrequestWhenInUseAuthorization
呼び出しをリッスンするのは、iOS 8以降のみです。
以下のリンクに詳細が表示されます。 http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/
がんばろう!
メインスレッドでCLLocationManagerを初期化することを強く確認する必要があります。それ以外の場合は、updateLocationイベントを取得しません。
私はそのような情報をApple docsで見つけることができませんが、とにかく私にとってはうまくいきます。
IOS 8.0では、最初に-[CLLocationManager requestWhenInUseAuthorization ]
または-[CLLocationManager requestAlwaysAuthorization]
を呼び出す必要があるため、ユーザーはアプリの場所を使用する許可を与えるよう求められます。
以下のものをプロジェクトに追加する必要があります。
プロジェクトのplistに次のものを追加します。
Key: NSLocationAlwaysUsageDescription Type:String
Key: NSLocationWhenInUseUsageDescription Type:String
[locationManager startUpdatingLocation]
の.mファイルに次の条件を追加します。
if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
[locationManager requestAlwaysAuthorization];`
その後、CLLocationManager
デリゲートメソッドのみが呼び出されます。
このリンクを確認する必要があると思います。宣言するときにロケーションマネージャオブジェクトを保持していません。
オブジェクトにプロパティを与えてください@property(nonatomic、strong)
したがって、シミュレータで実行している場合は、シミュレータメニューで場所を設定することを忘れないでください。 noneに設定されている場合、デリゲートで何も呼び出されないように見えます...これが実際のデバイスでも発生するかどうかはわかりませんが、おそらくシミュレーター固有のものです。
私のコードベースには次のものがありました:
-(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条件に。