Служби локації не працюють в iOS 11


83

Я просто відновив свій додаток за допомогою iOS 11 SDK, намагаючись видалити той, blue bannerякий зараз завжди з’являється. Я подумав - "Блискуче, це спрацювало", лише виявивши, що служби локації зараз взагалі не працюють.

Додаток раніше працював з iOS 10 - Хто-небудь щось чув?


Додайте NSLocationAlwaysAndWhenInUseUsageDescription у Info.plist
Jayprakash Dubey

Відповіді:


156

Здається, apple додав ще одну функцію конфіденційності. Користувач тепер може перевизначити наш requestAlwaysAuthorizationі понизити його до requestWhenInUseAuthorization- Це означає, що як розробник ми тепер повинні подати обидва описи вInfo.plist

Я виявив, що вони додали новий ключ NSLocationAlwaysAndWhenInUseUsageDescription

/*
*      Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the
*      NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription
*      keys must be specified in your Info.plist; otherwise, this method will do
*      nothing, as your app will be assumed not to support Always authorization.
*/

Однак, використовуючи цей новий ключ - служба локації все ще не працювала, при подальшому пошуку я виявив, що цей самоцвіт змішався з усією додатковою інформацією про налагодження:

Цей додаток намагався отримати доступ до конфіденційних даних без опису використання. Info.plist програми повинен містити як NSLocationAlwaysAndWhenInUseUsageDescription, так і NSLocationWhenInUseUsageDescription ключі із рядковими значеннями, що пояснюють користувачеві, як програма використовує ці дані

Що прямо суперечить коментарю, який я знайшов в оновленому CLLocationManager.hфайлі. Отже, я створив радар.

Хороші новини, якщо ви будете слідувати порадам консолі налагодження, IE. додайте як новий ключ, так NSLocationAlwaysAndWhenInUseUsageDescriptionі один зі старих ключів NSLocationWhenInUseUsageDescription, служби розташування знову почнуть працювати.


2
Я стикаюся з дуже схожою ситуацією. Тільки я тестую в iOS 10.2, і я NSLocationAlwaysUsageDescriptionдодав до свого Info.plist, який є потрібним дозволом. Але я отримую вищезазначене повідомлення в консолі, в якому сказано, що мені потрібно також додати NSLocationWhenInUseUsageDescription.
Ісуру

7
На жаль, тепер користувач отримує діалог із трьома відповідями, де найімовірніше, що його вдарять через нетерплячість користувача, щоб розпочати, це найкращий вибір: "Тільки під час використання програми". Що призведе до того, що програми, для яких потрібно постійно використовувати, будуть марними, якщо користувач не пройде через усі клопоти щодо зміни налаштувань після цього. Принаймні "Завжди дозволяти" повинен був бути найкращим вибором, коли це те, про що вимагає додаток!
Hans Terje Bakke

1
Я додав усі три ключі опису, і досі не отримую оновлення про місцезнаходження. Я додаю locationmanagerdelgate у viewwillAppear і видаляю делегат у viewwilldisapper. Якщо я перейду до налаштування та виберу вже вибраний Дозволити завжди. Я отримую оновлення лише один раз, а потім не більше. Будь-яка ідея, як це виправити. Спасибі заздалегідь!!
LoveMeSomeFood

@Uma - дзвониш startUpdatingLocationчи requestLocation?
Вільям Джордж

@WilliamGeorge я використовуюstartUpdatingLocation
LoveMeSomeFood

43

Просто додати кроки з виправлення цього:

2 способи зробити це:

A) Найпростіший спосіб: Виберіть файл Info.plist, додайте властивості, зауважте, що вони починаються з PRIVCY замість LOCATION ... отже, точні назви цих змінних починаються з "Privacy - Location ..." тощо, додайте кожен тут, і опишіть, як користувач побачив би це у попередженні.

Б) Важкий / цікавий / програмний спосіб (мені цей спосіб більше подобається):

Клацніть правою кнопкою миші на вашому Info.plist для вашої програми, а потім виберіть "Переглянути вихідний код", ви повинні побачити все це в XML,

Дотримуйтесь іншого формату ...... та додайте такі властивості наступним чином:

<key>NSLocationAlwaysUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string>

Збережіть, а потім клацніть правою кнопкою миші на файлі info.plist, а потім виберіть Властивість, це повинно переглянути файл назад у подання за замовчуванням.

РЕДАГУВАТИ:

Інший учасник запитав код, ось він:

1) У своєму .H-файлі додайте:

@property (strong, nonatomic) CLLocationManager *LocationManager;

2) У своєму .M-файлі додайте під функцією ViewDidAppear ():

_LocationManager = [[CLLocationManager alloc] init];
[_LocationManager setDelegate:self];
_LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
_LocationManager.pausesLocationUpdatesAutomatically = NO;
[_LocationManager requestAlwaysAuthorization];

_LocationManager.headingFilter = 5;
_LocationManager.distanceFilter = 0;

[_LocationManager startUpdatingLocation];
[_LocationManager startUpdatingHeading];

Це те, що добре працює для мене, сподіваюся, код спрацює і для вас.

З повагою

Хайдера


1
Я додав усі три ключі опису, і досі не отримую оновлення про місцезнаходження. Я додаю locationmanagerdelgate в viewwillAppear і видаляю делегата в viewwilldisapper. Якщо я перейду до налаштування і виберу вже вибране Allow Always. Я отримую оновлення лише один раз, а потім не більше. Будь-яка ідея, як це виправити. Спасибі заздалегідь!!
LoveMeSomeFood

Зараз я додам свій код, щоб проілюструвати, що для мене працює:
Хайдер Саті,

У мене такий самий код, як у вас. Але все-таки я не отримую оновлення про місцезнаходження, якщо не заходжу додому і не повертаюся до програми. Це відбувається лише в iOS 11. Я все ще не міг зрозуміти, чому.
LoveMeSomeFood

Не могли б ви поглянути на цю тему? stackoverflow.com/questions/46616496/… . Дякую!
LoveMeSomeFood

Привіт Ума, Один із наших користувачів повідомив про таку саму проблему на одному з пристроїв, я розслідую це і зв’яжусь з тобою, мабуть IOS11 на даний момент робить нас усіх надзвичайно зайнятими ... вирішіть це якомога швидше, будь ласка, потерпіть зі мною ... дякую
Хайдер Саті

23

працюючи під iOS11, я виявив, що Info.plist потребує принаймні NSLocationAlwaysAndWhenInUseUsageDescription у Info.plist:

введіть тут опис зображення

Як не дивно, коли ваш додаток багатомовний, але локалізованим версіям ваших рядків потрібні всі три клавіші, згадані в цій публікації, requestAlwaysAuthorization()і вони locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) будуть мовчки невдалими.

Кадр, що показує як переклад німецьку мову як приклад:

введіть тут опис зображення

Сподіваюся, це заощадить ваш час, коли ви натрапите.


Дякую, @iDoc! Це заощадило мені багато часу.
Reinhard Männer

Це правильна відповідь, в iOS 11 обов’язково локалізувати ключі конфіденційності розташування.
jberlana

Через 10 годин я діходжу до цього повідомлення ... tnx
1110,

17

Робота в Swift 4.0.3

   <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
   <string>Description</string>

   <key>NSLocationAlwaysUsageDescription</key>
   <string>Will you allow this app to always know your location?</string>

   <key>NSLocationWhenInUseUsageDescription</key>
   <string>Do you allow this app to know your current location?</string>  

Дякую vipulkumarmehta
Keshav Gera

13

Виконайте такі дії:

Я зіткнувся з тією ж проблемою з додатком, який потребував "Завжди авторизуватися", і вирішив його, виконавши такі дії:

1. Додати NSLocationWhenInUseUsageDescription ключ доInfo.plist

2. Додати NSLocationAlwaysAndWhenInUseUsageDescription доInfo.plist

3. Додати NSLocationAlwaysUsageDescription до Info.plist(для підтримки <iOS 11)

4. Телефонуйте requestWhenInUseAuthorization() ПЕРЕД requestAlwaysAuthorization( )

Ви не можете виконати requestAlwaysAuthorization () перед requestWhenInUseAuthorization (). Ви повинні перерости до цього рівня дозволу. Щойно я вніс ці зміни, оновлення місцеположення знову почало працювати належним чином.

Детальніше тут:

https://developer.apple.com/documentation/corelocation/choaching_the_authorization_level_for_location_services/requesting_always_authorization


1
З цим нічого не змінилося :(
Cemal BAYRI 13.03.18

Я вирішив, увімкнувши прапор allowBackgroundLocationUpdates. Див stackoverflow.com/a/50733860/2610888
Andrea Gorrieri

6

Краще в безпеці, ніж шкода. У iOS 11: додайте нижче, і все добре.

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

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>

5

Тестується на iOS 12.2 із Swift 5

Крок 1. Ви повинні додати наступні дозволи на конфіденційність у файл plist

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

Крок 2. переконайтесь, що у вас є такий швидкий код, щоб отримати поточні місця

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    // MARK: Variables declearations
    @IBOutlet weak var mapView: MKMapView!
    var locationManager: CLLocationManager!

    // MARK: View Controller life cycle methods
    override func viewDidLoad() {
        super.viewDidLoad()
        //TODO: Make user you must add following three privacy permissions in plist
        //NSLocationWhenInUseUsageDescription
        //NSLocationAlwaysAndWhenInUseUsageDescription
        //NSLocationAlwaysUsageDescription

        getCurrentLocation()
    }

    func getCurrentLocation()
    {
        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    // MARK: Location Manager Delegate methods
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let locationsObj = locations.last! as CLLocation
        print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)")
        showOnMap(location: locationsObj)
    }
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Get Location failed")
    }

    func showOnMap(location: CLLocation )
    {
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        mapView.setRegion(region, animated: true)
    }
}

2

Свіфт: 3 Я зіткнувся з такою ж проблемою. я був повністю зіпсований у пошуку рішення. ось як я виправив проблему.

крок 1: Файл проекту> Можливості> фонові режими> виберіть Оновлення місця

крок 2: Додайте ключі NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription до Info.plist

крок 3:

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true

allowBackgroundLocationUpdates однозначно вирішив мою проблему, я не можу повірити, що про це не повідомляється в інших відповідях та форумах. З документації Apple: "Ви використовуєте цю властивість для програмного ввімкнення та вимкнення фонових оновлень. Наприклад, ви можете встановити для цієї властивості значення true лише після того, як користувач увімкне функції у вашому додатку, де потрібні фонові оновлення." Msgstr "Значення за замовчуванням для цього властивості хибне." developer.apple.com/documentation/corelocation/…
Андреа Горрієрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.