Okno dialogowe uprawnień do bieżącej lokalizacji znika zbyt szybko

Moja aplikacja pobiera lokalizację użytkownika, pobiera współrzędne i zapewnia odległość do lub od miejsca docelowego lub pochodzenia. Wszystkie te możliwe miejsca docelowe są wyświetlane w widoku tabeli, więc otrzymuję współrzędne użytkowników w tym samym czasie, co wypełnianie tabeli. Jedyną rzeczą jest to, że pojawia się widok alertu, który pyta o lokalizację użytkowników, a następnie znika tak szybko, że nie można go kliknąć!

Czy jest jakiś sposób na ręczne przedstawienie tego alertu przy pierwszym ładowaniu aplikacji? Próbowałem uzyskanie lokalizacji użytkownika, gdy aplikacja ładuje się, aby spróbować wymusić wyświetlenie alertu, ale to nie zadziałało.

Author: Josh Caswell, 2011-10-25

10 answers

Chociaż trudno jest go namierzyć, rozwiązanie tego problemu jest dość proste.

Poprzez wiele prób i błędów dowiedziałem się, że podczas gdy okno dostępu do lokalizacji pojawia się podczas próby uzyskania dostępu do usług lokalizacji w aplikacji po raz pierwszy, okno dialogowe znika samodzielnie (bez żadnej interakcji użytkownika), jeśli obiekt CLLocationManager zostanie zwolniony, zanim użytkownik odpowie na okno dialogowe.

Tworzyłem instancję CLLocationManager w mojej metodzie viewDidLoad. Ponieważ była to lokalna instancja metody, instancja została zwolniona przez ARC po zakończeniu wykonywania metody. Gdy tylko instancja została zwolniona, okno dialogowe zniknęło. Rozwiązanie było dość proste. Zmień instancję CLLocationManager ze zmiennej na poziomie metody na zmienną na poziomie klasy. Teraz instancja CLLocationManager jest zwalniana tylko po rozładowaniu klasy.

 578
Author: Zoli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-26 07:05:21

Ten sam objaw, inna przyczyna: nie wywoływaj startUpdatingLocation więcej niż raz z rzędu .

Przypadkowo uporządkowałem rzeczy tak, że kod nieumyślnie wywoływał startUpdatingLocation dwa razy z rzędu, co najwyraźniej jest złe. Może to też mieć coś wspólnego z wyborem kolejki, ponieważ czekałem na rozpoczęcie aktualizacji w oczekiwaniu na wynik żądania sieciowego, ale nie musiałem robić żadnej magii GCD, aby to naprawić...chciałem się tylko upewnić, że nie powtórzę początku.

Nadzieja ktoś może skorzystać z mojego bólu. :)

 5
Author: clozach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 20:02:22

Wpadam w ten sam problem (przynajmniej przez objawy). W moim przypadku problem tkwił w metodzie - (void)applicationWillResignActive:(UIApplication *)application;, gdzie zwalniałem swoją instancję CLLocationManager w ramach przygotowania do przejścia w tle. Kiedy go usunąłem i zostawiłem tylko w - (void)applicationDidEnterBackground:(UIApplication *)application; problem zniknął.
najtrudniejsze jest to, że alert lokalizacji rdzenia zawiesza aplikację, gdy jest jeszcze na pierwszym planie.
Mam nadzieję, że to ci pomoże, Zajęło mi dużo czasu znalezienie tego drania :)

 4
Author: Ariel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-17 16:08:04

Wiem, że to bardzo późna odpowiedź. Ale to może komuś pomóc. Spotkałem się również z tym samym problemem i spędziłem godzinę, aby zidentyfikować problem. Na początku mój kod był taki.

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];

CLLocation *location = locationManager.location;
//my stuff with the location

    [locationManager release];

Teraz alert lokalizacyjny zniknął szybko. Kiedy odkomentuję ostatnią linię, działa poprawnie.

   // [locationManager release];
 4
Author: Ramaraj T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-17 11:36:48

Również napotkałem ten problem, ale rozwiązanie w moim przypadku okazało się zupełnie inne niż przyjęta odpowiedź.

W mojej aplikacji dzwoniłem stopUpdatingLocation z applicationWillResignActive. Był to problem, ponieważ applicationWillResignActive jest wywoływana, gdy pojawi się okno dialogowe uprawnień. Powodowało to stopUpdatingLocation natychmiast po startUpdatingLocation, dlatego okno dialogowe natychmiast znikało.

Rozwiązaniem było po prostu wywołanie stopUpdatingLocation z applicationDidEnterBackground.

 3
Author: Alan Kinnaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 06:36:15

Przydarzyło mi się to podczas korzystania z symulatora iOS. Stwierdziłem, że to się stało, ponieważ mój program biegowy symulował lokalizację. Myślę, że ma to taki sam efekt jak wywołanie locationManager.startUpdatingLocation() przy uruchomieniu i tak zamykało okno dialogowe.

Odznaczenie pola wyboru "Zezwalaj na symulację lokalizacji" w oknie edycji schematów rozwiązało problem. Gdy działa tak, jak chcesz, a uprawnienia są ustawione, możesz ponownie włączyć symulację lokalizacji, a symulator będzie działał dobrze od tego czasu on

 2
Author: Paolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-22 03:58:56

Swift 4 i iOS 11:

Upewnij się, że dodałeś linie prywatności (zarówno zawsze i whinuse ) do pliku .plist i dodaj CoreLocation Framework do swojego projektu

Okno dialogowe uprawnień do lokalizacji wyświetla się poprawnie po zmianie:

locationManager.requestAlwaysAuthorization()

Z:

locationManager.requestWhenInUseAuthorization()

P. S .: Próbowałem wszystkich porad i wszystkie nie powiodły się (prośba o autoryzację do viewDidLoad, var zamiast let dla locationManager nie uruchamiaj startUpdatingLocation() po Prośba..Myślę, że to błąd i mam nadzieję, że rozwiążą go JAK NAJSZYBCIEJ..

 2
Author: Alessandro Ornano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 08:20:19

SWIFT 4 @ Zoli rozwiązanie będzie wyglądało tak:

class WhateverViewController: UIViewController {
    let locationManager = CLLocationManager() // here is the point of the @Zoli answer

    // some code
    override func viewDidLoad() {
        super.viewDidLoad()

        // some other code
        locationManager.requestWhenInUseAuthorization()
        // some other code
    }
}
 1
Author: wm.p1us,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-09 12:33:37

Zmienną locationManager definiujesz najczęściej jako obiekt globalny.

@interface ViewController : UIViewController
{
    CLLocationManager *locationManager;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    [locationManager startUpdatingLocation];
}
 0
Author: Mahdi Nili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 11:04:37

Spotkałem się z tą samą sytuacją.

  • moje rozwiązanie zostało zmienione ze zmiennej lokalnej na instancję członkowską.
  • Przyczyną był miejscowy?instancja była nieprawidłowa po zakończeniu metody, która zawiera lokalną zmienną the (rozszerzenia my locationManager) Mój Env.: Xcode9. 3. 1

#import 
@interface ViewController ()

@end

@implementation ViewController
@synthesize locManager; // after
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //MyLocationService *locManager = [[BSNLocationService alloc]init:nil]; // before. the loc. delegate did not work because the instance became invalid after this method.
    self->locManager= [[MyLocationService alloc]init:nil]; // after
    locManager.startService;
}

 0
Author: user2058374,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-25 07:19:20