Службы геолокации не работают в 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.
Isuru
7
К сожалению, теперь пользователь получает диалог с тремя ответами, где из-за нетерпения пользователя начать работу наиболее вероятно будет лучший вариант: «Только при использовании приложения». Это сделает приложения, которые постоянно используются, бесполезными, если пользователь не пройдет через все хлопоты по изменению настройки снова после этого. По крайней мере, «Всегда разрешать» должно было быть лучшим выбором, когда это то, о чем приложение просит!
Ханс Терье Бакке,
1
Я добавил все три ключа описания, но все еще не получаю обновления местоположения. Я добавляю locationmanagerdelgate в viewwillAppear и удаляю делегата в viewwilldisapper. Если я перейду к настройке и выберу уже выбранный Разрешить всегда. Я получаю обновление только один раз и не более того. Любая идея, как это исправить. Заранее спасибо!!
LoveMeSomeFood 02
@ Ума - ты звонишь startUpdatingLocationили requestLocation?
Уильям Джордж
@WilliamGeorge Я используюstartUpdatingLocation
LoveMeSomeFood
44

Просто добавьте шаги по исправлению этого:

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 02
Я добавлю свой код сейчас, чтобы проиллюстрировать, что у меня работает:
Heider Sati
У меня такой же код, как и у вас. Но, тем не менее, я не получаю обновления местоположения, если не пойду домой и не вернусь в приложение. Такое бывает только в iOS 11. Так и не понял почему.
LoveMeSomeFood
Не могли бы вы взглянуть на эту ветку? stackoverflow.com/questions/46616496/… . Спасибо!
LoveMeSomeFood
Привет, Ума! Один из наших пользователей сообщил о той же проблеме на одном из устройств, я изучаю это и вернусь к вам, я думаю, что IOS11 делает нас всех очень занятыми в данный момент ... Мне нужно будет выяснить и разрешите это как можно скорее, пожалуйста,
Heider Sati
23

работая под iOS11, я обнаружил, что Info.plist нуждается как минимум в NSLocationAlwaysAndWhenInUseUsageDescription в Info.plist:

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

Как ни странно, когда ваше приложение многоязычно, локализованные версии ваших строк нуждаются во всех трех ключах, упомянутых в этом сообщении, requestAlwaysAuthorization()и не locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) будут работать без предупреждения.

Снимок, показывающий немецкий перевод в качестве примера:

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

Надеюсь, это сэкономит вам время, когда вы наткнетесь.

iDoc
источник
Спасибо, @iDoc! Это сэкономило мне много времени.
Рейнхард
Это правильный ответ, в 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
Кешав Гера
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/choosing_the_authorization_level_for_location_services/requesting_always_authorization

mhit0
источник
1
Ничего не изменилось :(
Cemal BAYRI
Я решил, включив флаг 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)
    }
}
SwiftBoy
источник
2

Swift: 3 Я столкнулся с той же проблемой. я был полностью облажался, когда нашел решение. вот как я исправил проблему.

шаг 1: Файл проекта> Возможности> фоновые режимы> выберите Обновление местоположения

Шаг 2: Добавьте ключи NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription в Info.plist

шаг 3 :

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
Сантош Саху
источник
allowBackgroundLocationUpdates определенно решил мою проблему, я не могу поверить, что об этом не сообщалось в других ответах и ​​на форумах. Из документации Apple: «вы используете это свойство для программного включения и отключения фоновых обновлений. Например, вы можете установить для этого свойства значение true только после того, как пользователь включит в вашем приложении функции, требующие фоновых обновлений». «Значение этого свойства по умолчанию - false». developer.apple.com/documentation/corelocation/…
Андреа Горриери,