CLLocationManager startUpdatingLocation не вызывает locationManager: didUpdateLocations: или locationManager: didFailWithError:
Я пытаюсь использовать структуру CLLocationManager
в моем проекте iOS для доступа к местоположению пользователя, но когда я звоню
[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
Ответы
Ответ 1
Просто добавьте это в info.plist
NSLocationAlwaysUsageDescription --- Мне нужно местоположение
NSLocationWhenInUseUsageDescription --- Мне нужно местоположение
privacy - описание использования местоположения --- Мне нужно местоположение
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate=self;
locationManager.desiredAccuracy=kCLLocationAccuracyBest;
locationManager.distanceFilter=kCLDistanceFilterNone;
[locationManager requestWhenInUseAuthorization];
[locationManager startMonitoringSignificantLocationChanges];
[locationManager startUpdatingLocation];
Теперь он будет называть ваш didUpdateToLocation определенно.
для более подробной информации нажмите здесь
Ответ 2
Службы местоположения работают немного иначе, начиная с iOS 8.
В основном вам нужно добавить ключ NSLocationWhenInUseUsageDescription
в ваш Info.plist файл и добавить описание, почему вашему приложению нужно местоположение, например "Местоположение необходимо...".
Обратите внимание, что вам также может потребоваться проверить версию iOS. Только для iOS 8 и выше диспетчер местоположения прослушивает вызов requestWhenInUseAuthorization
.
Ниже приведена приведенная ниже ссылка:
http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/
Удачи!
Ответ 3
С iOS 8.0 сначала нужно вызвать -[CLLocationManager requestWhenInUseAuthorization
]
или -[CLLocationManager requestAlwaysAuthorization]
, чтобы пользователь попросил дать ваше разрешение на использование этого местоположения.
Ответ 4
Вам настоятельно необходимо проверить, что вы инициализируете CLLocationManager в основном потоке.
В другом случае вы не получите событие updateLocation.
Я не могу найти такую информацию в документах Apple, но она работает для меня в любом случае.
Ответ 5
Вам нужно добавить что-то в свой проект,
-
В plist вашего проекта добавьте следующие вещи:
-
Key: NSLocationAlwaysUsageDescription Type:String
-
Key: NSLocationWhenInUseUsageDescription Type:String
-
В файле .m с [locationManager startUpdatingLocation]
добавьте это условие:
if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
[locationManager requestAlwaysAuthorization];`
Затем будут вызваны только ваши методы делегата CLLocationManager
.
Ответ 6
Я думаю, вы должны проверить эту ссылку. Вы не сохраняете объект менеджера местоположений при объявлении.
просьба указать свойство объекта
@property (неатомный, сильный)
Почему делегат CLLocationManager не вызван в iPhone SDK 4.0?