Метод didUpdateLocation никогда не вызывался

Я делаю одно приложение на iphone sdk4.0.In, которое никогда не вызывало метод обновления местоположения. Я дал свой код ниже. Пожалуйста, помогите. Заранее спасибо.

-(id)init
{
    [super init];

    obj=[[UIApplication sharedApplication]delegate];

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    //locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];

    return self;

}

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"%f",newLocation.coordinate.latitude);

    NSLog(@"%f",newLocation.coordinate.longitude);

    obj=[[UIApplication sharedApplication]delegate];

    location=[[CLLocation alloc]initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
    obj.lattitude1=[NSString stringWithFormat:@"%f",newLocation.coordinate.latitude];

    obj.longitude1=[NSString stringWithFormat:@"%f",newLocation.coordinate.longitude];
    //location=[[CLLocation alloc]initWithLatitude:39.9883 longitude:-75.262227];
}

person Akshay Aher    schedule 21.03.2011    source источник
comment
наконец, это сработало... я ничего не делал. я просто сделал один новый проект и скопировал в него все классы. я не знаю, как? но это сработало..   -  person Akshay Aher    schedule 23.03.2011


Ответы (6)


Привет, твои коды вроде в порядке. теперь это могут быть возможные причины:

при инициализации: попробуйте проверить, есть ли locationServicesEnabled или нет.

locationManager = [[CLLocationManager alloc] init];
if(locationManager.locationServicesEnabled == NO){
    //Your location service is not enabled, Settings>Location Services  
}

по другой причине вы можете запретить получать местоположение для вашего приложения. решение: просто удалите свое приложение с iPhone и пересоберите, теперь должно появиться всплывающее диалоговое окно «Разрешить местоположение».

используйте это, чтобы проверить ошибку

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error
{       
    NSLog(@"Error while getting core location : %@",[error localizedFailureReason]);
    if ([error code] == kCLErrorDenied) {
        //you had denied 
    }
    [manager stopUpdatingLocation];
}

в остальном вроде бы все в порядке, у вас уже была установлена ​​ios 4.0, которую можно установить на iPhone 3G и более поздние версии, если это был iPhone 2g, то может возникнуть эта проблема.

person Mujah Maskey    schedule 21.03.2011

Кроме того, в iOS8 у вас должны быть две дополнительные вещи:

  • Добавьте ключ в свой Info.plist и запросите авторизацию у менеджера местоположения с просьбой запустить его.

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

  • Вам необходимо запросить авторизацию для соответствующего метода определения местоположения.

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

Пример кода:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];

Источник: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

person MarMass    schedule 22.09.2014
comment
… и вообще методы Всегда не рекомендуются, используйте другие, если вы не уверены, что делаете. - person bshirley; 02.10.2014

Убедитесь, что вы добавили CLLocationManager в качестве свойства.

@property (nonatomic, strong) CLLocationManager *locationManager;

person Gabriel.Massana    schedule 28.01.2014
comment
Габриэль, вы показали мне хороший путь. Теперь я получил решение. Я попытался вызвать метод didupdateLocation, но он не вызвал, хотя я применил все, кроме вашего предложения. Наконец, я применил CLLocationManager как свойство. Теперь вызывается метод делегата и я получаю значение местоположения обновления (широта, долгота). - person user3182143; 01.08.2016
comment
Большое спасибо брат - person user3182143; 01.08.2016
comment
Не могли бы вы рассказать мне причину или объяснение свойства CLLocationManager и почему оно не работает без свойства? - person user3182143; 01.08.2016
comment
Потому что, если это свойство, оно имеет сильную ссылку. Не будучи свойством, он освобождается вне метода. Поэтому он не может получать обратные вызовы от делегата. @user3182143 - person Gabriel.Massana; 01.08.2016
comment
Спасибо, Габриэль. Массана. - person user3182143; 01.08.2016

Если вы тестируете это на симуляторе, это не сработает.

Это происходит потому, что этот метод вызывается только тогда, когда устройство меняет местоположение (а симулятор никогда не меняет местоположение).

person Zebs    schedule 21.03.2011
comment
Нет..Я не проверяю Симулятор..Я проверяю его на устройстве iphone. - person Akshay Aher; 21.03.2011
comment
Пробовали ли вы вызвать текущее местоположение вручную и убедиться, что у вас действительное местоположение? Вы можете сделать это, используя locationManager.location. - person Zebs; 22.03.2011
comment
Это неправда, теперь вы можете имитировать движение. Simulator -> Debug -> Location - person Rui Peres; 09.02.2014

Вызывается ли когда-нибудь -locationManager:didFailWithError: в вашем делегате? Возможно, в какой-то момент вы отказали в доступе к данным о местоположении, и теперь не получаете запрос, но доступ запрещен.

person visakh7    schedule 21.03.2011

После того, как вы alloc и init своего менеджера по местоположению, проверьте, разрешены ли службы определения местоположения. Этот код взят из примера кода Apple «LocateMe».

if (locationManager.locationServicesEnabled == NO) {
    UIAlertView *servicesDisabledAlert = [[UIAlertView alloc] initWithTitle:@"Location Services Disabled" message:@"You currently have all location services for this device disabled. If you proceed, you will be asked to confirm whether location services should be reenabled." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [servicesDisabledAlert show];
    [servicesDisabledAlert release];
}

Если вы тестируете с помощью симулятора, попробуйте вместо этого протестировать устройство. Симулятор требует, чтобы WiFi компьютера был включен и чтобы он мог найти базовую станцию ​​WiFi, которая находится в его базе данных известных местоположений.

person nevan king    schedule 21.03.2011