Подтвердить что ты не робот

Местоположение Услуги, не работающие в iOS 11

Я только что перестроил свое приложение с помощью iOS 11 SDK, пытаясь удалить blue banner, который теперь всегда появляется. Я подумал: "Блестящий, это сработало", только чтобы обнаружить, что службы местоположения теперь вообще не работают.

Приложение, используемое для работы с iOS 10 - Кто-нибудь слышал что-нибудь?

4b9b3361

Ответ 1

Похоже, что яблоко добавило еще одну функцию конфиденциальности. Теперь пользователь может переопределить наш 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

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

2 способа сделать это:

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

B) Жесткий/интересный/программный способ (мне нравится больше):

Щелкните правой кнопкой мыши на вашем 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];

Это то, что отлично работает для меня, надеюсь, код будет работать и на вас.

Привет

Хайдер

Ответ 3

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

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

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

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

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

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

Ответ 4

Работа в 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>  

Ответ 5

Следуй этим шагам:

Я столкнулся с той же проблемой с приложением, которому требовалась "Всегда авторизация", и решил ее, выполнив следующие действия:

1. Добавьте ключ NSLocationWhenInUseUsageDescription в Info.plist

2. Добавьте NSLocationAlwaysAndWhenInUseUsageDescription в Info.plist

3. Добавьте NSLocationAlwaysUsageDescription в Info.plist (для поддержки <iOS 11)

4. Вызовите requestWhenInUseAuthorization() ПЕРЕД requestWhenInUseAuthorization() requestAlwaysAuthorization()

Вы не можете выполнить requestAlwaysAuthorization() перед requestWhenInUseAuthorization(). Вы должны перейти на этот уровень разрешений. После внесения этих изменений обновления местоположения снова начали работать правильно.

Более подробную информацию можно найти здесь:

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

Ответ 6

Лучше безопасно, чем жаль.. В iOS 11: добавьте ниже, и вы хорошо.

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

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

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

Ответ 7

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

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

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

шаг 3 :

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true

Ответ 8

Протестировано на iOS 12.2 с Swift 5

Шаг 1. Вы должны добавить следующие разрешения на конфиденциальность в файл plist

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

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

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

Шаг 2. убедитесь, что у вас есть следующий код swift для получения текущего местоположения

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