it-swarm.com.de

iOS 8 requestWhenInUseAuthorization kein Popup

Ich habe versucht, mein AppProject iOS 8 fertig zu machen. Ich hatte viel darüber gelesen

[_locationManager requestWhenInUseAuthorization];

und der eintrag in plist

NSLocationWhenInUseUsageDescription

Also habe ich alle notwendigen Codezeilen geändert.

Es funktioniert einwandfrei, aber jetzt habe ich mein Projekt erneut von meiner iOS 7-Basis kopiert, um neue Funktionen aufzunehmen. Aber wenn ich die Änderungen für den iOS8-Standortdatenschutz vornehme, wird das Popup nicht mehr angezeigt.

Mein Code hat funktioniert, bis ich kopiert habe.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>NSLocationWhenInUseUsageDescription</key>
        <string>tolle sache </string>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>CFBundleIdentifier</key>
        <string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundlePackageType</key>
        <string>BNDL</string>
        <key>CFBundleShortVersionString</key>
        <string>1.0</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
        <string>1</string>
    </dict>
</plist>

und hier ist mein Anruf

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {

        _UserLocation = [[CLLocation alloc]init];
        _locationManager = [[CLLocationManager alloc]init]; // initializing locationManager
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy
        [_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST
        [_locationManager startUpdatingLocation];  //requesting location updates

        NSLog(@"passed initwithcode");

    }
    return self;
}

Wie kann ich das beheben?

49
Marcus

Aus der Dokumentation

NSLocationWhenInUseUsageDescription (String - iOS) beschreibt den Grund, warum die App auf den Standort des Benutzers zugreift, während sie im Vordergrund ausgeführt wird. Fügen Sie diesen Schlüssel hinzu, wenn Ihre App Standortdienste verwendet, um den aktuellen Standort des Benutzers direkt zu verfolgen. Dieser Schlüssel unterstützt nicht die Verwendung von Standortdiensten zur Überwachung von Regionen oder die Überwachung des Standorts des Benutzers mithilfe des Dienstes für signifikante Standortänderungen. Das System fügt den Wert dieses Schlüssels in das Warnfenster ein, das dem Benutzer angezeigt wird, wenn er die Erlaubnis zur Nutzung von Ortungsdiensten anfordert.

Dieser Schlüssel ist erforderlich, wenn Sie die requestWhenInUseAuthorization-Methode der CLLocationManager-Klasse verwenden, um die Autorisierung für Standortdienste anzufordern. Wenn der Schlüssel beim Aufrufen der requestWhenUseAuthorization-Methode nicht vorhanden ist, ohne diesen Schlüssel einzuschließen, ignoriert das System Ihre Anforderung.

Dieser Schlüssel wird in iOS 8.0 und höher unterstützt. Wenn Ihre Info.plist-Datei sowohl diesen Schlüssel als auch den NSLocationUsageDescription-Schlüssel enthält, verwendet das System diesen Schlüssel und ignoriert den NSLocationUsageDescription-Schlüssel.

Lesen Sie darüber hier .

Ich finde, dass der einfachste Weg, diesen Schlüssel zu Ihrer info.plist hinzuzufügen, darin besteht, mit der rechten Maustaste auf die info.plist zu klicken und auszuwählen

Open As-> Source Code

und füge am Ende vor Folgendes hinzu </dict></plist>

<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

Wenn Sie möchten, können Sie zwischen <string></string> Einen Text einfügen, der dem Benutzer beschreibt, warum Sie seinen Standort verwenden möchten. Dieser Text wird unter dem Standardtext in der Warnung angezeigt.

101
Groot

Versuchen Sie, eine NSLocationWhenInUseUsageDescription in Info.plist zu schreiben

19
Masatsugu Hosoi

iOS 8.3, Xcode 6.3.1, ARC aktiviert

Die Frage wurde gelöst, aber ich habe (2) Anmerkungen, die ich aus meiner letzten Beschäftigung mit CLLocationManager hinzufügen muss.

1) In Ihrer * .plist-Datei müssen folgende Schlüssel eingegeben sein:

enter image description here

Die am häufigsten verwendeten Schlüssel haben allgemeinere, aussagekräftigere Namen, z. B. "Privacy - Location Usage Description", bei dem es sich tatsächlich um den Schlüssel "NSLocationUsageDescription" handelt.

Um die "rohen" Schlüsselnamen zu sehen, gehen Sie zu "* -Info.plist" und klicken Sie mit der rechten Maustaste in den Navigator-Bereich, in dem die Schlüssel aufgelistet sind, siehe unten:

enter image description here

Und Sie erhalten die folgenden Ergebnisse:

enter image description here

Die drei Schlüssel, die sich auf diesen Artikel beziehen, sind:

enter image description here

2) Stellen Sie sicher, dass Sie Ihre Implementierung von CLLocationManager zuordnen und initialisieren, bevor Sie versuchen, die Autorisierung anzufordern oder den Speicherort zu aktualisieren.

* .h Datei:

@interface SomeController : UIViewController <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *locationManager;

* .m Datei:

- (IBAction)locationButton:(UIButton *)sender
{
    if (self.locationManager == nil)
    {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
    }
    else
    {
        nil;
    }

    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
    {
        [self.locationManager requestWhenInUseAuthorization];
    }
    else
    {
        nil;
    }

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}

Hoffe das spart jemand Zeit! Vielen Dank.

10
serge-k

Hier ist ein bisschen Gotcha. Stellen Sie sicher, dass Sie die Schlüssel NSLocationAlwaysUsageDescription oder NSLocationWhenInUseUsageDescription zur Hauptpaketliste hinzufügen und nicht zu einer Ihrer Testziellisten!

3
smileBot

Hatte das gleiche Problem verursacht, weil ich CLLocationManager in einer lokalen var innerhalb einer Methode instanziierte, es löste, das CLLocationManager eine Klasseneigenschaft machend.
Nach einer Weile habe ich die Lösung hier gefunden, aber ich lasse sie hier, da dies das erste Ergebnis in Google ist. Ich hoffe, ich spare Ihnen etwas Zeit:

requestWhenInUseAuthorization () funktioniert in iOS 8 nicht mit NSLocationWhenInUseUsageDescription Key in Info.plist

1
Mark E

Bezüglich der Apple Watch:

Sie müssen den requestWhenInUseAuthorization -Schlüssel in den Info.plist - Code des iPhones eingeben, nicht in die WatchKit-App.

Das hat mich jetzt zweimal gebissen.

0
HenryRootTwo