MKUserTrackingBarButtonItem се върти, след като на приложението е забранено да използва текущо местоположение

Добавих екземпляр на MKUserTrackingBarButtonItem в viewDidLoad на контролер за изглед, както следва:

MKUserTrackingBarButtonItem *userTrackingButton = [[MKUserTrackingBarButtonItem alloc] initWithMapView:self->mapView];
NSMutableArray *toolbarItems = [[NSMutableArray alloc] initWithArray:[mapToolBar items]];
[toolbarItems insertObject:userTrackingButton atIndex:0];
[mapToolBar setItems:toolbarItems];

Услугите за местоположение са включени в Настройки, но не и за приложението. Когато се докосне бутонът MKUserTrackingBarButtonItem, модалният диалогов прозорец пита потребителя дали да позволи на приложението да използва текущото местоположение. Когато е избрано „Не позволявай“, MKUserTrackingBarButtonItem се превръща в сива пунктирана въртяща се икона и оригиналната икона на компас не се възстановява.

Как да възстановя състоянието на бутона, както се прави в приложението Карти?

Желаното поведение е същото като това в приложението Карти.

  1. Уверете се, че услугите за местоположение са включени в Настройки > Поверителност > Услуги за местоположение.
  2. Нулиране на местоположение и поверителност в Настройки > Общи > Нулиране > Нулиране на местоположение и поверителност.
  3. Стартирайте приложението Карти.
  4. Докоснете иконата на компас в долния ляв ъгъл.
  5. Появява се диалогов прозорец със съобщението „„Карти“ искат да използват вашето текущо местоположение“. В този момент иконата на компас се е превърнала в сива пунктирана въртяща се икона.
  6. Изберете „Не позволявай“.

Оригиналната икона на компас е възстановена.

Тествам това на iPhone, а не на симулатора. Горният код работи без проблем, когато услугите за местоположение са включени и на приложението е разрешено да използва текущото местоположение.


person swifthorseman    schedule 27.06.2014    source източник


Отговори (2)


Приложете метода CLLocationManagerDelegate:

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

И когато CLAuthorizationStatus не е kCLAuthorizationStatusAuthorized, можете да актуализирате свойството userTrackingMode на вашия MKMapview до MKUserTrackingModeNone

person olicarbo    schedule 27.06.2014
comment
Компасът се възстановява след внедряване на kCLAuthorizationStatusAuthorized. Ако бъде докосната отново, тя се променя във въртяща се икона. Как да се справим с това второ докосване, след като първата заявка беше отказана? - person swifthorseman; 28.06.2014
comment
Можете да внедрите - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated във вашия MKMapViewDelegate. Когато режимът се промени на MKUserTrackingModeFollow или MKUserTrackingModeFollowWithHeading и статусът от LocationManager не е разрешен, вие задавате режима на проследяване на MKUserTrackingModeNone точно както направихте в другия метод. - person olicarbo; 28.06.2014
comment
Току-що опитах това. Ако - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated е внедрено, от потребителя вече не се иска да разреши/забрани използването на текущото местоположение, което означава, че потребителят не е уведомен какво трябва да се направи. - person swifthorseman; 28.06.2014

Не можах да намеря много помощ по този въпрос в интернет, но тази публикация помогна много. Ето бързо прилагане на казаното от olicarbo:

        func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    mapView.showsUserLocation = (status == .AuthorizedAlways)

    //if location services are turned off for this app.
    if(status == CLAuthorizationStatus.AuthorizedAlways || status == CLAuthorizationStatus.AuthorizedWhenInUse){
        mapView.userTrackingMode = MKUserTrackingMode.None
    }
}

func mapView(mapView: MKMapView, didChangeUserTrackingMode mode: MKUserTrackingMode, animated: Bool) {
    if(CLLocationManager.locationServicesEnabled() == false || !(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedAlways)){
        //location services are disabled or
        //user has not authorized permissions to use their location.

        mapView.userTrackingMode = MKUserTrackingMode.None
    }
}
person Arthur Garza    schedule 10.01.2016