2014-12-29 20 views
7

AKTUALIZACJA: TO NIE JEST DUPLIKAT. Dodałem już wymagany klucz do pliku info.plist, jak podano w moim oryginalnym pytaniu, a problem pozostaje. Próbowałem wszystkich trzech kluczy w różnych kombinacjach.Nie jest wyświetlany monit o włączenie usług lokalizacyjnych w aplikacji

Zanim ktokolwiek się zdenerwuje, przeczytałem wiele postów na forum Apple Dev i stosów przepełnienia stosu i nie mogę się domyślić, dlaczego moja aplikacja nie zachęca użytkownika do zezwolenia na używanie w czasie użytkowania.

Dodałem następujący klucz do mojego pliku Info.plist z towarzyszącym wartości String:

NSLocationWhenInUseUsageDescription 

ja wtedy pisemnej (zarówno w Swift i obj-c) kod, który powinien monitować użytkownika:

@property CLLocationManager *location; 
... 
@synthesize location; 
... 
location = [[CLLocationManager alloc] init]; 
location.delegate = self; 

location.desiredAccuracy = kCLLocationAccuracyBest; 
location.distanceFilter = kCLDistanceFilterNone; 

[location requestWhenInUseAuthorization]; 
[location startUpdatingLocation]; 


I'm using the following CLLocationManagerDelegate methods. 
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
- (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status 

Zostało to w zasadzie skopiowane prosto z kodu przykładowego Apple "LocateMe".

Bez względu na różne sekwencje lub drobne zmiany, które próbuję, aplikacja nigdy nie prosi o autoryzację. Użyłem instrukcji switch do określenia stanu [CLLocationManager authorizationStatus], ale ciągle otrzymuję odpowiedź "Not Determined".

if ([CLLocationManager locationServicesEnabled]) { 
     switch ([CLLocationManager authorizationStatus]) { 
      case kCLAuthorizationStatusAuthorizedAlways: 
       NSLog(@"Always Authorized"); 
       break; 
      case kCLAuthorizationStatusDenied: 
       NSLog(@"Denied"); 
       break; 
      case kCLAuthorizationStatusAuthorizedWhenInUse: 
       NSLog(@"Authorized in Use"); 
       break; 
      case kCLAuthorizationStatusNotDetermined: 
       NSLog(@"Not Determined"); 
       break; 
      case kCLAuthorizationStatusRestricted: 
       NSLog(@"Restricted"); 
       break; 
     } 

    } 

Każda pomoc zostanie bardzo doceniona. Używam Xcode 6.2 (6C101) z fizycznym urządzeniem iOS 8.1.2 i symulatorem iOS 8.2 (12D5452a) do testowania.

+0

@ n00bProgrammer Nie widzę opcji resetowania dostępnej w zakładce Ustawienia> Reset na symulatorze. Napisałem również dwa programy, jeden w Swift i jeden w Obj-C, i oba robią to samo. Przetestowałem także urządzenie fizyczne i uzyskałem takie same wyniki. Nie próbowałem jeszcze resetować sprzętu. – Andrew

Odpowiedz

1

wiele przydatnych porównań tutaj: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

również głupie raz pytanie: wymieszać _location i self.location, ale nie wyświetlasz swojego kodu własności/syntezatora. Czy na pewno pracujesz nad tym samym obiektem?

+0

Edytowałem kod, aby dodać @synthesize i zmodyfikować właściwość, aby po prostu użyć wartości 'location'. Również. Czytałem tę stronę, ale z jakiegoś powodu nie pomaga ona w moim problemie. 'NSLocationWhenInUseUsageDescription' jest wartością ciągu w moim pliku Info.plist. – Andrew

+0

Oto fragment z aktywnego projektu, który monituje poprawnie. Z wyjątkiem testu zgodności iOS7/8, w zasadzie pasuje on do twojego. '_locationManager = [[init CLLocationManager] init]; _locationManager.delegate = self; if ([_locationManager replySToSelector: @selector (requestWhenInUseAuthorization)]) { [_locationManager requestWhenInUseAuthorization]; } [_locationManager startUpdatingLocation]; ' Huh. GuessMode: Sprawdź Ustawienia> Prywatność> Usługi lokalizacyjne. Czy są już jakieś ustawienia aplikacji? –

+0

Brak wyświetlanych ustawień i status CLAuthorization jest "Nie określono" – Andrew

1

Okazało się, że w pliku info.plst nie można używać prywatności - położenie Wykorzystanie Opis klucza, trzeba mieć klucz o nazwie NSLocationWhenInUseUsageDescription a wartość. Udało mi się dostać kod działa dodając ten klucz do mojego Info.plist

enter image description here

#import <MapKit/MapKit.h> 

@interface ViewController() 

@property CLLocationManager * location; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _location = [[CLLocationManager alloc] init]; 

    self.location.delegate = self; 
    self.location.desiredAccuracy = kCLLocationAccuracyBest; 
    self.location.distanceFilter = kCLDistanceFilterNone; 

    [_location requestWhenInUseAuthorization]; 
    [self.location startUpdatingLocation]; 
} 
+0

Testuję jednak na wersji 8.1, a nie 8.2. –

+0

Przetestowałem to przy użyciu trzech różnych kluczy dostępnych na różne sposoby, mając nadzieję, że uda się je uruchomić - w pewnym momencie jeden z moich projektów zaczął działać magicznie, ale nie mogę zreplikować tych zmian do tego prostego projektu (kto jest jedynym celem jest ten test), aby uczynić go szybkim. – Andrew

2

Zmierzyłem się z tym samym problemem, po tym, jak zagłębiłem się na dwa dni, okazało się, że aplikacja nie czyta z pliku info.plist, który jest zawarty w pakiecie w panelu nawigatora projektu, ponieważ został zlokalizowany do w innym języku i podstawa internacjonalizacja jest używany, co oznacza, że ​​w Finder będą 3 pliki info.plist:

1 w folderze Testy

2- w folderze base.lproj

3- pod Ar .lprj (ar odnosi się do języka arabskiego).

projekt czyta z wersji base.lproj, która nie jest zawarta w pakiecie w panelu nawigatora projektu.

zrobiłem kopię zapasową pliku plist, którego chcę (numer 2 powyżej) i usunięto lokalizację na podstawie informacji.plik plist, który znajduje się wewnątrz nawigatora projektu i wybrał usunięcie z dysku, aby go całkowicie usunąć, a następnie wziąłem kopię zapasową i umieściłem ją w katalogu głównym projektu w Finderze i zaimportowałem z powrotem do Xcode, a teraz projekt czyta z nowej listy info.plist plik i klucz NSLocationWhenInUseUsageDescription uruchamia alert autoryzacji użytkownika podczas uruchamiania aplikacji.

mam nadzieję, że to pomoże.

0

To może być głupie, ale właśnie spędziłem prawie 2 godziny podwójne i potrójne sprawdzanie wszystkich odpowiedzi, jakie mogłem znaleźć na temat uprawnień CLLocationManager.

Czułem się głupio, kiedy w końcu zrozumiałem, że mam 2 pliki info.plist i używałem niewłaściwego!

Można sprawdzić ustawienia kompilacji projektu - istnieje wartość o nazwie Info.plist Plik.

Po prostu zostaw to tutaj dla przyszłych czytelników.

0

Po zmianie ustawień lokalizacji w symulatorze iPhone'a może to spowodować, że monit nie będzie wyświetlany. Jeśli na przykład ustawiono już uprawnienia do lokalizacji za pomocą opcji Zezwalaj na lokalizacje, uzyskaj dostęp do monitu systemu iOS i podjęto decyzję, że jest to zapisane w ustawieniach Prywatności dla symulatora iPhone'a, więc kolejne wywołania do locationManager.requestAlwaysAuthorization() lub locationManager.requestWhenInUseAuthorization() nie będą wyświetlać monitu systemu iOS, ponieważ już masz zdefiniował swoją Prywatność -> Ustawienia lokalizacji dla Twojej aplikacji.

Aby wyczyścić ustawienia symulatora iPhone: "iOS Simulator" -> "Reset Content and Settings..."

Również zrobiłem czystą kompilację w Xcode i zamknąć i ponownie uruchomić symulator iPhone w pewnym momencie, mogę się mylić o tym część jest jakiejkolwiek pomocy ...