Geçerli konum izni iletişim kutusu çok hızlı bir şekilde kayboluyor


175

Uygulamam kullanıcının yerini alıyor, koordinatları alıyor ve hedefine veya menşeine bir mesafe sağlıyor. Tüm bu olası hedefler bir tablo görünümünde gösterilir, bu yüzden kullanıcıların tabloyu doldurmakla aynı zamanda koordinasyonlarını elde ediyorum. Tek şey, kullanıcıların yerini soran uyarı görünümü o kadar hızlı bir şekilde kaybolur ki tıklamak imkansızdır!

Uygulama ilk yüklendiğinde bu uyarıyı manuel olarak sunmanın bir yolu var mı? Uygulama yüklenmeye çalıştığında ve uyarıyı göstermeye zorladığında kullanıcının konumunu almaya çalıştım, ancak bu işe yaramadı.

Yanıtlar:


699

İzlenmesi zor olsa da, bunun çözümü oldukça basittir.

Çok sayıda deneme yanılma yoluyla, uygulamadaki herhangi bir konum hizmetine ilk kez erişmeye çalıştığınızda konum erişimi iletişim kutusunun açılırken, CLLocationManagernesne daha önce serbest bırakılırsa iletişim kutusunun kendi kendine (herhangi bir kullanıcı etkileşimi olmadan) kaybolacağını öğrendim. kullanıcı iletişim kutusuna yanıt verir.

Metodumda bir CLLocationManagerörnek oluşturuyordum viewDidLoad. Bu yöntemin yerel bir örneği olduğundan, örnek, yöntemin yürütülmesini tamamladıktan sonra ARC tarafından serbest bırakıldı. Örnek yayınlanır yayınlanmaz iletişim kutusu ortadan kayboldu. Çözüm oldukça basitti. Örneği, CLLocationManageryöntem düzeyinde bir değişken olmaktan, sınıf düzeyinde bir örnek değişkeni olarak değiştirin. Şimdi CLLocationManagerörnek ancak sınıf kaldırıldıktan sonra serbest bırakılır.


117
Keşke sana +100
kodlayıcı

1
Sadece Xamarin.iOS ile aynı sorunu vurmak. CLLocationManager sınıf kapsamı yapın ve iletişim kutusu görünür kalır.
Krumelur

1
Yaaaaa .... eğer devam edip kendine zam verebilirsen, bu greeeeeaaaat olurdu. (Cidden, bu benim için de büyük bir tasarruf)
Garfonzo

2
Ben de bu partiye katılmak zorundayım. İşte, benden bir İnternet Çak bir Beş olsun!
Matthieu Riegler

3
Swift'te bu sorunu yaşayan herkes, LocationManager bildirimini viewDidLoad dışına taşıdığınızdan emin olur. Şerefe!
KD.

5

Aynı belirti, farklı neden: art arda birden fazla aramayınstartUpdatingLocation .

Kod yanlışlıkla istemeden startUpdatingLocationkötü iki kez üst üste çağırıyordu öyle yanlışlıkla yapılandırılmış şeyler vardı . Bir ağ isteğinin sonucunu beklemeden güncellemeye başlamak için beklediğimden, kuyruk seçimi ile ilgili bir şey de olabilirdi, ancak düzeltmek için herhangi bir GCD sihri yapmama gerek yoktu ... sadece emin olmak için gerekli başlangıcı tekrar etmedi.

Umarım birisi acımdan faydalanabilir. :)


5

Benzer bir durumla karşılaştım. Hata ayıklamadan sonra buldum

let locationManager = CLLocationManager()

bir yöntem kapsamında çağrılır, ancak genel olarak çağrılmalıdır.

Neden?

Özetle, yöntem geri döndükten sonra locationManager serbest bırakıldı. Ancak kullanıcı izin verene veya reddetene kadar serbest bırakılmamalıdır


4

Aynı konuya düşüyorum (en azından semptomlarla). Benim durumumda sorun, arka plan geçiş hazırlığı bir parçası olarak - (void)applicationWillResignActive:(UIApplication *)application;benim CLLocationManagerörnek serbest bırakıldığı yöntem oldu . Çıkardığımda ve bıraktığımda sadece - (void)applicationDidEnterBackground:(UIApplication *)application;sorun gitti.
Zor kısmı, Çekirdek Konum uyarısının hala ön plandayken uygulamanızı askıya almasıdır.
Umarım size yardımcı olur, o piçi bulmak için çok zamanımı aldım :)


4

Bunun çok geç bir cevap olduğunu biliyorum. Ama birisine yardım edebilir. Aynı problemle de karşılaştım ve sorunu tanımlamak için bir saat geçirdim. İlk başta kodum böyleydi.

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

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

    [locationManager release];

Şimdi konum uyarısı hızla kayboldu. Son satırı açtığımda doğru çalışıyor.

   // [locationManager release];

3
Bu doğru. Bu yanıta ekleyeceğim tek uyarı, projeniz ARC etkin olduğunda, kodunuza release deyimini eklemeniz gerekmediği ve yine de bu sorunla karşılaşacağınızdır. Bu senaryoda sorunu çözmenin tek yolu, değişken düzeyi yöntem düzeyi yerine sınıf düzeyidir.
Zoli

3

Ben de bu problemle karşılaştım, ama benim durumumdaki çözüm kabul edilen cevaptan tamamen farklıydı.

Benim uygulamasında, ben çağırıyordu stopUpdatingLocationdan applicationWillResignActive. Bu bir sorundu çünkü applicationWillResignActiveizin iletişim kutusu göründüğünde çağrılıyor. Bu, stopUpdatingLocationhemen sonra gerçekleşiyordu startUpdatingLocation, bu yüzden iletişim kutusu hemen ortadan kalkacaktı.

Çözelti çağrısına basitçe stopUpdatingLocationdan applicationDidEnterBackgroundyerine.


2

İOS Simulator'ı kullanırken bu benim başıma geliyordu. Bunun gerçekleştiğini belirledim çünkü Çalışma Programım bir konum simüle ediyordu. Bence bu locationManager.startUpdatingLocation()açılışta çağrı ile aynı etkiye sahip ve bu yüzden iletişim kutusunu kapatıyordu.

Şemaları Düzenle iletişim kutusundaki "Konum Simülasyonuna İzin Ver" onay kutusunun işaretini kaldırmak sorunu çözdü. İstediğiniz gibi çalıştıktan ve izin ayarlandıktan sonra, konum simülasyonunu yeniden etkinleştirebilirsiniz ve simülatör bundan sonra iyi çalışır.


Bu benim için biraz çalıştı. En azından diyaloğu
görmeliyim

2

Swift 4 ve iOS 11 :

Dosyanıza gizlilik satırları (her zaman ve whenInUse ) eklediğinizden emin olun ve projenize Framework .plistekleyinCoreLocation

Değiştirdiğimde konum izni iletişim kutusu doğru görünüyor:

locationManager.requestAlwaysAuthorization()

ile:

locationManager.requestWhenInUseAuthorization()

PS .: TÜM önerileri denedim ve tüm başarısız ( locationManager yerine yerine yetki istemek viewDidLoad, istek sonra başlamıyorum .. Ben bir hata olduğunu düşünüyorum ve en kısa sürede çözecek umuyoruz ..varletstartUpdatingLocation()


Ben de tüm tavsiyeleri takip ettim ama hep aynı meseleye sahibim. Konum izni iletişim kutusu kısa bir süre için görünür, ardından hemen kaybolur. Daha sonra bildirim iletişim kutusu iznim belirir (bu normaldir), kabul et veya reddet düğmesine bastığımda başka bir konum izni belirir (bu sefer kalır ve kabul et veya reddetmeme izin ver).

@BitoQ Evet, benim için de. Aynı durum ama en azından bu iletişim kutusunu görebiliriz, umarım bir sonraki iOS 11.1 ile bu hatayı düzeltirler ..
Alessandro Ornano

1

SWIFT 4 @ Zoli çözümü aşağıdaki gibi görünecektir:

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
    }
}

0

locationManager değişkenini en çok global nesne olarak tanımlarsınız.

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

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

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

0

Seninle aynı durumla tanıştım.

  • Çözümüm, yerel değişkenten üye örneğine değiştirildi.
  • Bunun nedeni, yöntem tamamlandıktan sonra local değişkenini içeren local? Örneğinin geçersiz olmasıydı.
  • Çevrem: Xcode9.3.1
#ithalat 
@interface ViewController ()

@son

@implementation ViewController
@synthesize locManager; // sonra
- (geçersiz) viewDidLoad {
    [super viewDidLoad];
    // Görünümü yükledikten sonra, genellikle bir uçtan ek kurulumlar yapın.

    // MyLocationService * locManager = [[BSNLocationService ayırma] init: nil]; // önce. loc. temsilci çalışmadı, çünkü örnek bu yöntemden sonra geçersiz hale geldi.
    self-> locManager = [[MyLocationService ayırma] init: nil]; // sonra
    locManager.startService;
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.