İOS 8'de Konum Servisleri çalışmıyor


608

İOS 7'de iyi çalışan uygulamam iOS 8 SDK ile çalışmıyor.

CLLocationManagerbir konum döndürmüyor ve uygulamamı Ayarlar -> Konum Servisleri altında da görmüyorum . Bu konuda Google'da bir arama yaptım, ancak hiçbir şey gelmedi. Ne yanlış olabilir?


Bunu ayrıca çözüm için referans uygulaması olarak da kullanabilirsiniz github.com/jbanford/ConstantLocationUpdates
ashok vadivelu


2
Çekirdek Konum API'lerini basitleştiren ve hoş bir blok tabanlı arayüzü ortaya çıkaran ve farklı iOS sürümleri arasındaki tüm farkları normalleştiren bu kütüphaneyi kullanmayı deneyebilirsiniz (Tam açıklama: Ben yazarım): github.com/lmirosevic/GBLocation
lms

Burada bazı referanslar buldum datacalculation.blogspot.in/2014/11/…
iOS Test

2
@nevanking Sizi efendim! bir taca ihtiyacım var! Değişimden bu yana bu sorunla mücadele ediyorum ve henüz nasıl düzeltmek için bir "rehber" bulmak için, bu noob dostu oldu .. Rehberiniz benim gibi bir aptal yaptı, sorunu kendim ele. Bu bağlantı için çok teşekkür ederim.
Patrick R

Yanıtlar:


1086

Sonunda kendi sorunumu çözdüm.

Görünüşe göre iOS 8 SDK'da, requestAlwaysAuthorization(arka plan konumu için) veya requestWhenInUseAuthorization(yalnızca ön plandayken konum) CLLocationManagerkonum güncellemelerine başlamadan önce çağrı yapılması gerekiyor.

Ayrıca olması gerekir NSLocationAlwaysUsageDescriptionveya NSLocationWhenInUseUsageDescriptionanahtar Info.plistbir mesajla istemi görüntülenecek. Bunları eklemek sorunumu çözdü.

enter image description here

Umarım başka birine yardımcı olur.

EDIT: Daha kapsamlı bilgi için, bir göz atın: Core-Location-Manager-Değişiklikler-in-ios-8


6
Info.plist'te tam olarak güncellenen valur u'yu paylaşabilir misiniz? Bu anahtarı Info.plistimde göremiyorum. Ekledim ve hala çalışmıyor gibi görünüyor. Swift, iOS8 ve XCode 6 beta 4 kullanıyorum
Vijay Kumar AB

4
@Vjay - Info.plist dosyasını bir düzenleyicide düzenlemeniz gerekir, bu anahtarları Xcode'da ayarlayamazsınız (beta 6'dan itibaren).
Kendall Helmstetter Gelner

11
Sadece bir hatırlatma, kullanıcıya özel açıklama göstermek istemiyorsanız, bu anahtarı boş bir dizeye ayarlayın.
nonamelive

7
Çalışması için locationManager'ınızı korumanız gerekir. CLLocationManager'ınızı güçlü bir mülk olarak yapın
Vassily

273
Ben 'plist girdisini terk ederseniz hiçbir hata, uyarı, günlük mesajı, hiçbir şey almayı seviyorum'. Temel olarak Apple, uygun plist girişiniz yoksa HİÇBİR ŞEY yapan bir API çağrısı oluşturdu. @OrtwinGentz'e bunu çözdüğü için teşekkürler.
MobileVet

314

Saçımı da aynı sorunla çekiyordum. Xcode size şu hatayı verir:

MapKitKonum yetkilendirmesi sormadan konum güncellemelerini başlatmaya çalışıyorum . Aramalı -[CLLocationManager requestWhenInUseAuthorization]veya -[CLLocationManager requestAlwaysAuthorization]önce.

Ancak yukarıdaki yöntemlerden birini uygulasanız bile, info.plist NSLocationAlwaysUsageDescriptionveya için bir giriş olmadığı sürece kullanıcıdan bilgi istemez NSLocationWhenInUseUsageDescription.

Bilgi satırınıza aşağıdaki satırları ekleyin; burada dize değerleri kullanıcıların konumuna erişmeniz için gerekeni gösterir

<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>

Xcode 5'te bu projeyi başlattığımdan beri bu girişlerin eksik olabileceğini düşünüyorum. Xcode 6 bu anahtarlar için varsayılan girişler ekleyebilir, ancak onaylamadı.

Bu iki Ayar hakkında daha fazla bilgiyi burada bulabilirsiniz


13
xcode 6 varsayılan olarak bu anahtarları eklemez, CLLocationManager'ı uygulamak istiyorsanız bunları manuel olarak eklemeniz gerekir
Wesley Smith

1
Ayrıca bunları manuel olarak eklemek zorunda kaldım, Xcode6'daki info.plist'in RawValues ​​görünümünden ekleyemedim!
Kendall Helmstetter Gelner

1
Sonsuza dek bunun için baktım. [CLLLocationManager authorizationStatus] iletim yalnızca <nil> değerini döndürüyordu. Yukarıdaki tuşları ekledikten sonra, mesajların çıktısı için ilgili numaralandırmaları döndürmeye başladı. Ive bulduğumdan bu bilinen bir iOS 8 hatası ama yaşım boyunca bağlamımda bir şey bulamadım. Bir mil teşekkürler!
MrOli3000


1
İleti, Uyarı'da kullanıcının konumunu paylaşmak isteyip istemediğini soran alt mesaj olarak görünür. Bu nedenle, sadece boş (boş) olmak başvurumda en mantıklı görünüyor. Konumu neden kullanmak istediğinizin açıklaması da mantıklı olacaktır. Ancak, NSLocationWhenInUseUsageDescription benim için beklendiği gibi davranmadı (yani, dönüş değeri doğru olsa bile izin verilmedi. NSLocationAlwaysUsageDescription iyi çalıştı.
arcady bob

104

Bunun iOS 7 ile geriye doğru uyumlu olduğundan emin olmak için kullanıcının iOS 8 veya iOS 7 çalıştırıp çalıştırmadığını kontrol etmelisiniz. Örneğin:

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

//In ViewDidLoad
if(IS_OS_8_OR_LATER) {
   [self.locationManager requestAlwaysAuthorization];
}

[self.locationManager startUpdatingLocation];

164
Sürümü kontrol etmekten daha iyi bir yol, nesnenin bu seçiciye sahip olup olmadığını kontrol etmektir, örneğin: if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
progrmr

1
Metodun ne olduğunu bilmediği için Xcode 5 üzerine inşa ederken sadece @ progrmr çözümünü uygulamakta sorun yaşadım requestAlwaysAuthorization. Benim ek solüsyon içinde bu çizgiyi kullanmaktı ifyerine normal bir yöntem çağrısının açıklamada: [self.locationManager performSelector:@selector(requestAlwaysAuthorization)];. Belki bu diğer insanlar için açıktır, ama çözmem biraz zaman aldı. Son Xcode 6 piyasaya sürülene kadar doğru çözüm olduğunu düşünüyorum.
VinceFior

2
Doğru çözüm Xcode 6 ile inşa etmektir. Xcode 5 ile yapıyorsanız, yetkilendirme istemeniz gerekmez, bu otomatiktir.
progrmr

Bir noktanız olabilir. Endişem, kodum Xcode 5'te derlenmesini istedi (Xcode 6'da derlenmedikçe iOS 8'de çalışmayacak olsa da) ekibim Xcode 6'ya geçerken, ancak kodu normal olarak yazmak daha iyi bir iş akışı olabilir ve Xcode 6'ya geçene kadar birleştiremeyiz .. Teşekkürler.
VinceFior

@VinceFior önerilen yaklaşım SDK tanımlı makro __IPHONE_OS_VERSION_MAX_ALLOWED( #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) kullanarak koşullu olarak derlemektir ( )
Steven Kramer

50
- (void)startLocationManager
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingLocation];
    [locationManager requestWhenInUseAuthorization]; // Add This Line


}

Ve info.plist Dosyanıza resim açıklamasını buraya girin



2
@Hemang: Apple Dev Documentation'a göre: Uygulamanızın yetkilendirme durumu belirlenmeden konum hizmetlerini başlatmak güvenlidir. Konum hizmetlerini başlatabilseniz de, bu hizmetler yetkilendirme durumu kCLAuthorizationStatusAuthorizedAlways veya kCLAuthorizationStatusAuthorizedWhenInUse olarak değişene kadar herhangi bir veri göndermez.
Andrew

Biraz geç, ama ben özellikle plist dosyanızın alakasız kısımlarını gizlemenizi tavsiye ederim FacebookAppID
Przemysław Wrzesiński

Teşekkürler ama bu sadece bir kukla örnek :)
neo d1

Projenin doğru info.plist'e (anahtarın tanımlandığı listeye) işaret etmesi de önemlidir . Bu, Info.plist Dosyası altındaki proje oluşturma ayarlarında belirlenir.
Clearlight

30

Apple belgelerine göre:

İOS 8'den itibaren, uygulamanızın Info.plist dosyasında bir NSLocationWhenInUseUsageDescriptionveya NSLocationAlwaysUsageDescriptionanahtar değerinin bulunması gerekir. Daha sonra, konum güncellemelerine kaydolmadan önce, arayarak [self.myLocationManager requestWhenInUseAuthorization]veya [self.myLocationManager requestAlwaysAuthorization]ihtiyacınıza bağlı olarak kullanıcıdan izin istemeniz gerekir. Info.plist'e girdiğiniz dize, sonraki iletişim kutusunda görüntülenir.

Kullanıcı izin verirse, her zamanki gibi iş yapar. İzin vermezlerse, temsilci konum güncellemeleri hakkında bilgilendirilmez.



28
- (void)viewDidLoad
{

    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];

    self.locationManager.delegate = self;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
        NSUInteger code = [CLLocationManager authorizationStatus];
        if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
            // choose one request according to your business.
            if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
                [self.locationManager requestAlwaysAuthorization];
            } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
                [self.locationManager  requestWhenInUseAuthorization];
            } else {
                NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
            }
        }
    }
    [self.locationManager startUpdatingLocation];
}

>  #pragma mark - CLLocationManagerDelegate

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        NSLog(@"didFailWithError: %@", error);
        UIAlertView *errorAlert = [[UIAlertView alloc]
                                   initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
    }

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"didUpdateToLocation: %@", newLocation);
        CLLocation *currentLocation = newLocation;

        if (currentLocation != nil) {
            longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
            latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
        }
    }

İOS 8'de konumun çalışması için iki ek şey yapmanız gerekir: Info.plist'inize bir anahtar ekleyin ve konum yöneticisinden başlamasını isteyen bir yetki isteyin. Yeni konum yetkilendirmesi için iki Info.plist anahtarı vardır. Bu anahtarlardan biri veya her ikisi de gereklidir. Anahtarlardan hiçbiri orada değilse, startUpdatingLocation öğesini çağırabilirsiniz, ancak konum yöneticisi aslında başlamaz. Temsilciye bir hata mesajı göndermez (hiç başlamadığından başarısız olamaz). Anahtarlardan birini veya her ikisini eklerseniz ancak açıkça yetkilendirme isteğinde bulunmayı unutursanız da başarısız olur. Yapmanız gereken ilk şey, Info.plist dosyanıza aşağıdaki anahtarlardan birini veya her ikisini eklemektir:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Bu tuşların her ikisi de bir dize alır

Bu, konum hizmetlerine neden ihtiyacınız olduğunu açıklamaktadır. İOS 7'de olduğu gibi InfoPlist.strings dosyasında yerelleştirilebilen “Nerede olduğunuzu öğrenmek için konum gereklidir” gibi bir dize girebilirsiniz.

resim açıklamasını buraya girin


19

Xcode 5'te derlenebilecek çözümüm:

#ifdef __IPHONE_8_0
    NSUInteger code = [CLLocationManager authorizationStatus];
    if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
        // choose one request according to your business.
        if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
            [self.locationManager requestAlwaysAuthorization];
        } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
            [self.locationManager  requestWhenInUseAuthorization];
        } else {
            NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
        }
    }
#endif
    [self.locationManager startUpdatingLocation];

2
Tüm uygulamalarda kullanmak için güzel dinamik çözüm. Ben olsa sipariş değiştirmek ve iphone 8.0 için kontrol yerine, konum yöneticisi yetkisine yanıt verip vermediğini kontrol edin ve sonra kodu almak için authorizationstatus çalıştırın. Bu onu daha evrensel hale getirecektir.
zirinisp

XCode 7.2 üzerinde de çalıştı.
Totoro

17

Konum sormanın eski kodu iOS 8'de çalışmaz. Konum yetkilendirme için bu yöntemi deneyebilirsiniz:

- (void)requestAlwaysAuthorization
{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    // If the status is denied or only granted for when in use, display an alert
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status ==        kCLAuthorizationStatusDenied) {
        NSString *title;
        title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" :   @"Background location is not enabled";
        NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings";

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                            message:message
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];
        [alertView show];
    }
    // The user has not enabled any location services. Request background authorization.
    else if (status == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestAlwaysAuthorization];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        // Send the user to the Settings for this app
        NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:settingsURL];
    }
}

UIAlertView kullanımdan kaldırıldı. Bunun yerine UIAlertController kullanmalısınız.
Pasan Premaratne

Evet, kullanımdan kaldırıldığını biliyorum ama bu da işe yarayacak. ama evet daha iyi IOS8 için UIAlertController kullanın.
Nits007ak

12

İOS 8'de konumun çalışması için iki ek şey yapmanız gerekir: Info.plist'inize bir anahtar ekleyin ve konum yöneticisinden başlamasını isteyen bir yetki isteyin

Info.plist:

<key>NSLocationUsageDescription</key>
<string>I need location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>I need location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>I need location</string>

Bunu kodunuza ekleyin

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

1
sözde kodunuzun bir önişlemci çağrısı mı yoksa normal bir çağrı mı olduğu belli değil
El Dude

1
Bunu constants.h veya .pch dosyanıza ekleyin: #define IS_OS_8_OR_LATER ([[UIDevice currentDevice] .systemVersion floatValue]> = 8.0)
OxenBoxen

Neden her ikisini de talep edersiniz, uygulama gereksinimlerinize bağlı olarak yalnızca birini veya diğerini kullanmak için bir yorum eklemelisiniz
powerj1984

info.plist kısmı Unity3d'de yapmak için yeterince kolaydır, ancak unity3d kullanıyorsanız kod parçasını nasıl eklerim? nerede ?
CthulhuJon

11

Swift geliştiricileri için yaygın bir hata:

Öncelikle plist'e NSLocationWhenInUseUsageDescriptionveya için bir değer eklediğinizden emin olun NSLocationAlwaysUsageDescription.

Eğer varsa hala bir pencere yetki isteyen açılır göremiyorum, sen çizgiyi koyarak olup olmadığını görmek için bakmak var locationManager = CLLocationManager()için Görünüm Kontrolörünün içinde viewDidLoadyöntemle. Eğer yaparsanız, arasanız bile locationManager.requestWhenInUseAuthorization(), hiçbir şey görünmez. Bunun nedeni, viewDidLoad yürütüldükten sonra locationManager değişkeninin serbest bırakılmasıdır (temizlenir).

Çözüm, var locationManager = CLLocationManager()sınıf yönteminin en üstündeki satırı bulmaktır .


9

Daha önce [locationManager startUpdatingLocation];bir iOS8 konum hizmetleri isteği ekleyin:

if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
    [locationManager requestAlwaysAuthorization];

Uygulamanızı düzenleyin ve kullanıcıya görüntülenecek dize değerine sahip bir Info.plistanahtar ekleyin NSLocationAlwaysUsageDescription(örneğin,We do our best to preserve your battery life. )

Uygulamanızın yalnızca uygulama açıkken konum hizmetlerine ihtiyacı varsa değiştirin:

requestAlwaysAuthorizationile requestWhenInUseAuthorizationve

NSLocationAlwaysUsageDescriptionile NSLocationWhenInUseUsageDescription.


9

İOS 8'e yükseltilmiş bir uygulama üzerinde çalışıyordum ve konum hizmetleri çalışmayı durdurdu. Muhtemelen şu şekilde Hata Ayıklama alanında hata alırsınız:

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

En az müdahaleci prosedürü yaptım. Öncelikle NSLocationAlwaysUsageDescriptioninfo.plist'inize giriş ekleyin :

Resim açıklamasını buraya girin

Bu anahtarın değerini doldurmadım. Bu hala çalışıyor ve bu bir şirket içi uygulama olduğundan endişelenmiyorum. Ayrıca, zaten konum hizmetlerini kullanmak isteyen bir başlık var, bu yüzden gereksiz bir şey yapmak istemiyordu.

Sonra iOS 8 için bir koşul oluşturdum:

if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [_locationManager requestAlwaysAuthorization];
}

Bundan sonra locationManager:didChangeAuthorizationStatus:yöntem çağrılır:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:  (CLAuthorizationStatus)status
{
    [self gotoCurrenLocation];
}

Ve şimdi her şey yolunda gidiyor. Her zaman olduğu gibi, belgelere bakın .


7

Geriye dönük uyumluluk ile çözüm:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
    [self.locationManager respondsToSelector:requestSelector]) {
    [self.locationManager performSelector:requestSelector withObject:NULL];
} else {
    [self.locationManager startUpdatingLocation];
}

Info.plist'inizde NSLocationWhenInUseUsageDescription anahtarını ayarlayın


2
Bu doğru değil, kCLAuthorizationStatusDenied davası ne olacak? başkasına atlar ve doğru olmayan konumu güncellemeye başlar!
electronix384128

@BenMarten Bunun önemli olduğunu düşünmüyorum. Bunu kendiniz halletmelisiniz locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error. Ancak, if deyimine startUpdatingLocation öğesini eklemeyi unuttu, böylece kabul ettikten veya reddettikten sonra, aslında startUpdateLocation'ı çağırmaz.
Chris

6

Xcode uyarıları oluşturmayan geriye dönük uyumluluğa sahip çözüm:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
  [self.locationManager respondsToSelector:requestSelector]) {
((void (*)(id, SEL))[self.locationManager methodForSelector:requestSelector])(self.locationManager, requestSelector);
  [self.locationManager startUpdatingLocation];
} else {
  [self.locationManager startUpdatingLocation];
}

Kurulum NSLocationWhenInUseUsageDescriptionanahtarı Info.plist.

İOS sürümü 11.0+ İçin Kurulumu: NSLocationAlwaysAndWhenInUseUsageDescriptionGözlerinde farklı anahtarın Info.plist. diğer 2 tuşla birlikte.


Bu doğru değil, kCLAuthorizationStatusDenied davası ne olacak? başkasına atlar ve doğru olmayan konumu güncellemeye başlar!
electronix384128

Bu oldukça garip, bu benim için iyi çalışıyor hem izin hem de izin vermeme ile gayet iyi değil. Jacob çözümü bile doğru görünüyor ama benim için çalışmadı. Garip ama çalıştı !!!
josh

İstekten hemen sonra [self.locationManager startUpdatingLocation] öğesi çağrıldığındaWhenInUseAuthorization'ın bir anlamı yok
Kostia Kim

5

Bu ios 8 ile ilgili bir sorundur Kodunuza ekleyin

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

ve info.plist'e:

 <key>NSLocationUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationAlwaysUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationWhenInUseUsageDescription</key>
 <string>I need location</string>

NSLocationUsageDescriptioniOS8 + 'da kullanılmaz
Carlos Ricardo

4

İOS 8'de Kullanıcı Konumuna erişmek için şunu eklemeniz gerekir:

NSLocationAlwaysUsageDescription in the Info.plist 

Bu, kullanıcıdan geçerli konumunu alma iznini isteyecektir.


4

Objective-C Prosedürü Aşağıdaki talimatları izleyin:

İOS-11 için iOS 11 için şu Yanıt'a göz atın: iOS 11 konum erişimi

Pliste iki Anahtar eklemeniz ve aşağıdaki resimdeki gibi mesaj sağlamanız gerekir:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

resim açıklamasını buraya girin İOS-10 ve altı için:

NSLocationWhenInUseUsageDescription

resim açıklamasını buraya girin

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
    [locationManager requestWhenInUseAuthorization];
}else{
    [locationManager startUpdatingLocation];
} 

Delege Yöntemleri

#pragma mark - Lolcation Update 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
        case kCLAuthorizationStatusRestricted:
        case kCLAuthorizationStatusDenied:
        {
            // do some error handling
        }
            break;
        default:{
            [locationManager startUpdatingLocation];
        }
            break;
    }
}
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];
    userLatitude =  [NSString stringWithFormat:@"%f", location.coordinate.latitude] ;
    userLongitude =  [NSString stringWithFormat:@"%f",location.coordinate.longitude];
    [locationManager stopUpdatingLocation];
}

Hızlı Prosedür

Aşağıdaki talimatları izleyin:

İOS-11 için iOS 11 için şu Yanıt'a göz atın: iOS 11 konum erişimi

Pliste iki Anahtar eklemeniz ve aşağıdaki resimdeki gibi mesaj sağlamanız gerekir:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

resim açıklamasını buraya girin İOS-10 ve altı için:

resim açıklamasını buraya girin

import CoreLocation
class ViewController: UIViewController ,CLLocationManagerDelegate {
var locationManager = CLLocationManager()

//MARK- Update Location 
func updateMyLocation(){
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
    if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)){
       locationManager.requestWhenInUseAuthorization()
    }
    else{
        locationManager.startUpdatingLocation()
    }
}

Delege Yöntemleri

//MARK: Location Update
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    NSLog("Error to update location :%@",error)
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .NotDetermined: break
    case .Restricted: break
    case .Denied:
            NSLog("do some error handling")
        break
    default:
        locationManager.startUpdatingLocation()
    }
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     let location = locations.last! as CLLocation
    var latitude = location.coordinate.latitude
    var longitude = location.coordinate.longitude

}

Lütfen NSLocationAlwaysUsageDescription öğesinin de eklendiğinden emin olun, aksi takdirde uygulama mağazasına yüklerken bir hata alırsınız.
Alok

Mesajınız da bilgilendirici olmalıdır, aksi takdirde elma uygulamayı geri alırken uygulamayı reddeder.
Alok

3

Xamarin'i kullananlar NSLocationWhenInUseUsageDescriptioniçin, Xamarin 5.5.3 Build 6 veya XCode 6.1'deki açılır listelerde bulunmadığından info.plist'e el ile anahtar eklemem gerekiyordu - sadece NSLocationUsageDescriptionlistede bulunuyordu ve bu CLLocationManagerda sessizce başarısız olur.


2
        // ** Don't forget to add NSLocationWhenInUseUsageDescription in MyApp-Info.plist and give it a string

        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        // Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
        if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
            [self.locationManager requestWhenInUseAuthorization];
        }
        [self.locationManager startUpdatingLocation];


    // Location Manager Delegate Methods    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        NSLog(@"%@", [locations lastObject]);

}

2

Birden fazla Info.plist dosyasına sahip olan hepiniz için küçük bir yardımcı ...

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Add NSLocationWhenInUseUsageDescription string' {} 

Gerekli etiketi geçerli dizindeki (ve alt klasörlerin) tüm Info.plist dosyalarına ekler.

Diğeri:

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Set NSLocationWhenInUseUsageDescription $YOURDESCRIPTION' {} 

Açıklamanızı tüm dosyalara ekler.



2

İOS9'da benzer bir hata alıyorum (Xcode 7 ve Swift 2 ile çalışıyor): Konum yetkisi sormadan MapKit konum güncellemelerini başlatmaya çalışıyorum. Önce - [CLLocationManager isteğiWhenInUseAuthorization] veya - [CLLocationManager requestAlwaysAuthorization] çağrısı yapılmalıdır. Bir öğreticiyi takip ediyordum ama öğretmen iOS8 ve Swift 1.2 kullanıyordu. Xcode 7 ve Swift 2'de bazı değişiklikler var, bu kodu buldum ve benim için iyi çalışıyor (birinin yardıma ihtiyacı varsa):

import UIKit
import MapKit
import CoreLocation

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    // MARK: Properties
    @IBOutlet weak var mapView: MKMapView!

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
        self.mapView.showsUserLocation = true

    }

    // MARK: - Location Delegate Methods

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location = locations.last
        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1))
        self.mapView.setRegion(region, animated: true)
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print("Errors: " + error.localizedDescription)
    }
}

Son olarak, bunu info.plist'e koydum: Bilgi Özellik Listesi: NSLocationWhenInUseUsageDescription Değer: Uygulama, personel için konum sunucularına ihtiyaç duyuyor


2

İOS'ta kullanıcıların konumuna erişmek için. İki anahtar eklemeniz gerekiyor

NSLocationWhenInUseUsageDescription

NSLocationAlwaysUsageDescription

Info.plist dosyasına.

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Because I want to know where you are!</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Want to know where you are!</string>

Aşağıdaki resme bakın.

Info.plist resmi


1
  1. Her hedefin her birinde GPS kullanılmasını isteyen anahtar NSLocationWhenInUseUsageDescriptionveya anahtar NSLocationAlwaysUsageDescription(arka plan GPS kullanımı) ekleyin info.plist.

  2. Çalıştırarak izin isteyin:

    [self initLocationManager: locationManager];

Nerede initLocationManager:

// asks for GPS authorization on iOS 8
-(void) initLocationManager:(CLLocationManager *) locationManager{

    locationManager = [[CLLocationManager alloc]init];

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
        [locationManager requestAlwaysAuthorization];
}

Anahtarlar info.plisther hedef için her biri üzerinde değilse , uygulamanın kullanıcıya sormayacağını unutmayın. ifİOS 7 ile uyumluluk sağlar ve respondsToSelector:yöntem sadece iOS 7 ve 8 için konuyu çözmek yerine gelecek uyumluluğu garanti eder.


0

Benim için sorun CLLocationManagerDelegate, tüm delege yöntemlerinin çağrılmasını engelleyen sınıfın özel olmasıydı. Sanırım bu çok yaygın bir durum değil ama t kimseye yardım etmesi durumunda bahsettiğimi düşündüm.


0

Ben bu anahtarı eklemek InfoPlist.stringsde iOS 8.4, iPad Mini 2. Çok çalışır. Ben herhangi bir tuşa gibi ayarlamayın NSLocationWhenInUseUsageDescriptionskinTenimde, Info.plist.


InfoPlist.strings :

"NSLocationWhenInUseUsageDescription" = "I need GPS information....";

Bu iş parçacığı üzerinde Baz örgüt, as in iOS 7, InfoPlist.strings lokalize edilebilir. Testimde, bu anahtarlar doğrudan dosyada yapılandırılabilir InfoPlist.strings.

Yapmanız gereken ilk şey, aşağıdaki anahtarlardan birini veya her ikisini de Info.plist dosyanıza eklemektir:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Bu anahtarların her ikisi de, konum hizmetlerine neden ihtiyacınız olduğunu açıklayan bir dize alır. Gibi olan “Konum nerede olduğunu öğrenmek için gereklidir” gibi bir dize girebilirsiniz iOS 7 , InfoPlist.strings dosyasında lokalize edilebilir.


GÜNCELLEME:

Bence @IOSyöntemi daha iyi. Anahtarına Info.plistboş bir değer ekleyin ve yerelleştirilmiş dizeler ekleyin InfoPlist.strings.

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.