Проблем при получаване на текущото местоположение

Искам да получа текущото местоположение на устройството. Кодът работи нормално. Дава местоположение, ако потребителят не е променил състоянието на оторизация на приложението за услугата за местоположение. Също така мога да проверя дали потребителят е отказал разрешение за услуга за местоположение.

Проблемът е, когато потребителят деуторизира приложението за използване на услугата за местоположение и след това упълномощава отново. В този случай, след това, ако се опитам да получа местоположение, това дава nil, въпреки че се обади

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

делегиран метод със статус 3 т.е. kCLAuthorizationStatusAuthorized.

Код за получаване на текущото местоположение:

CLLocation * location = self.locationManager.location;

Метод за получаване:

- (CLLocationManager *)locationManager
{
    if (!locationManager)
    {
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
    }

    return locationManager;
}

Метод на делегиране на CLLocationManager:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    DLog(@"Location authorization changed : %d", status);

    // If user has denied permission for location service
    if (status == kCLAuthorizationStatusDenied)
    {
        DLog(@"Location service denied.");

        // If authorization status changed method is already called, then SDK will not call again on same object.
        // Thus, set CLLocationManager object to nil so that next time we try to get location, it will create a new object,
        // and that will send message about authorization status changed.
        self.locationManager.delegate = nil;
        self.locationManager = nil;
    }
    else if (status == kCLAuthorizationStatusNotDetermined)
    {
        // If authorization status changed method is already called, then SDK will not call again on same object.
        // Thus, set CLLocationManager object to nil so that next time we try to get location, it will create a new object,
        // and that will send message about authorization status changed.
        self.locationManager.delegate = nil;
        self.locationManager = nil;
    }
    else if (status == kCLAuthorizationStatusAuthorized)
    {

    }
}

Някаква идея за това?


person Geek    schedule 01.04.2014    source източник
comment
в горното задавате locationManager.delegate на нула, ако разрешението бъде отменено... задавате ли го някога отново на съответния клас?   -  person Volker    schedule 01.04.2014
comment
току-що забелязах, че сте задали и LocationManager на нула...   -  person Volker    schedule 01.04.2014
comment
Въз основа на вашите коментари в кода вие пресъздавате locationManager обекта някъде - сигурни ли сте, че това се задейства, когато зададете self.locationServiceDisabled = false?   -  person Paulw11    schedule 01.04.2014
comment
@Volker Зададох го отново метод за получаване. Въпросният добавен метод за получаване.   -  person Geek    schedule 01.04.2014
comment
Не виждам да сте започнали да актуализирате местоположението си (cllocationmanager startupdatinglocation)   -  person Nils Ziehn    schedule 01.04.2014
comment
@Paulw11 self.locationServiceDisabled флагът вече не се използва. Актуализирах въпросния си код.   -  person Geek    schedule 01.04.2014
comment
@NilsZiehn Не извиква този делегиран метод. И трябва да даде местоположение на CLLocation * location = self.locationManager.location; ред.   -  person Geek    schedule 01.04.2014
comment
В документите на Apple е посочено за свойството местоположение на locationManager: Стойността на това свойство е нула, ако никога не са били извлечени данни за местоположение. Поради тази причина трябва по някакъв начин да актуализирате местоположението на вашия iPhone! За да направите това, трябва да извикате метода на locationmanager startupdatinglocation...!   -  person Nils Ziehn    schedule 01.04.2014
comment
@NilsZiehn Да, това беше причината. Можете да го публикувате като отговор.   -  person Geek    schedule 01.04.2014


Отговори (2)


self.locationManager.location е nil, тъй като никога не сте започнали да актуализирате местоположението.

В документите на Apple се посочва за свойството location на locationManager:

Стойността на това свойство е нула, ако никога не са били извлечени данни за местоположение.

Поради тази причина трябва по някакъв начин да актуализирате местоположението на вашия iPhone!

Apple Docs CLLocationManager

Обикновено това означава, че искате да се обадите

[self.locationManager startUpdatingLocation]

но можете също да използвате

[self.locationManager startMonitoringSignificantLocationChanges]

person Nils Ziehn    schedule 01.04.2014
comment
Бих искал да добавите целия текст на вашия коментар тук. Това би направило този отговор много по-добър. Благодаря. - person Geek; 02.04.2014

Ако зададете делегата на нула, няма да получавате актуализации за промени в статуса на оторизация, нали?

self.locationManager.delegate = nil;

Мисля, че трябва да запазите делегата, за да получавате актуализации на състоянието на оторизацията и след това да извикате метода startUpdatingLocation, за да получите текущото местоположение.

- (void)startUpdatingLocation
person Morpheus78    schedule 01.04.2014
comment
Ако искате да видите кода ми внимателно, тогава е ясно, че в метода getter отново зададох делегат. - person Geek; 02.04.2014