Показывает только одно предупреждение о разрешении местоположения

Я хочу, чтобы мое приложение определяло местоположение в активном и фоновом режимах (если используется только разрешение NSLocationAlwaysUsageDescription, тогда myLocationButton не отображается). Я установил в Info.plist:

<key>NSLocationAlwaysUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>
<key>UIBackgroundModes</key>

И добавьте MapViewController

self.locationManager.requestWhenInUseAuthorization()
self.locationManager.requestAlwaysAuthorization()

Но когда приложение запускается, отображается только первое предупреждение о разрешении на размещение, а второе предупреждение о разрешении появляется после повторного открытия приложения.

Обновлять:

override func viewDidLoad() {
        super.viewDidLoad()
 ...    
 locationManager.delegate = self
 locationManager.requestWhenInUseAuthorization()
 viewMap.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.new, context: nil)
        self.startLocationUpdates()
 ...
}

func startLocationUpdates() {
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationManager.activityType = CLActivityType.automotiveNavigation
    self.locationManager.distanceFilter = distanceFilterMetr
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.startUpdatingLocation()
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        let myLocation: CLLocation = change?[NSKeyValueChangeKey.newKey] as! CLLocation
        viewMap.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: observeZoom)
        mapRoute.coordinateLatitude = myLocation.coordinate.latitude
        mapRoute.coordinateLongitude = myLocation.coordinate.longitude
        viewMap.delegate = self
        viewMap.settings.myLocationButton = true
        viewMap.settings.compassButton = true
        didFindMyLocation = true
}

person Roman    schedule 11.04.2017    source источник
comment
Вам нужно только всегда запрашивать авторизацию. Это дает вашему приложению разрешение использовать местоположение на переднем и заднем плане.   -  person Paulw11    schedule 11.04.2017
comment
@Paulw11 Paulw11 Я пишу о том, что если использовать только разрешение NSLocationAlwaysUsageDescription, то myLocationButton не отображается (обновление местоположения, но кнопка не отображается) iOS 10.3 swift 3   -  person Roman    schedule 11.04.2017
comment
Как вы решаете, показывать ли эту кнопку? Я могу заверить вас, что постоянная аутентификация — это все, что требуется для расположения на переднем плане и в фоновом режиме.   -  person Paulw11    schedule 11.04.2017
comment
@ Paulw11, пожалуйста, обновите мой код. СПАСИБО!!!   -  person Roman    schedule 11.04.2017
comment
Какое свойство вы наблюдаете? Почему вы используете КВО?   -  person Paulw11    schedule 11.04.2017
comment
@Paulw11 Я использую этот учебник Они говорят, что текущее местоположение пользователя описывается свойством объекта представления карты с именем myLocation. Хорошей новостью относительно этого свойства является то, что оно совместимо с KVO (соответствие ключ-значение), что означает, что мы просто должны наблюдать за изменениями его значения, и таким образом мы сможем узнать, когда местоположение пользователя будет обновлено. . я   -  person Roman    schedule 11.04.2017
comment
Обратите внимание, что в руководстве они реализуют метод делегата didChangeAuthorizationStatus и используют его для включения кнопки моего местоположения. Вы реализовали этот метод и внесли изменения для постоянной авторизации, которую вы запрашиваете?   -  person Paulw11    schedule 11.04.2017
comment
@Paulw11 БОЛЬШОЕ СПАСИБО!!! Да, я забыл изменить на всегда! Виноват!   -  person Roman    schedule 11.04.2017


Ответы (1)


Добавьте этот делегат в свой класс:

CLLocationManagerDelegate

Теперь внутри вашего класса:

var locationManager:CLLocationManager!
var map = GMSMapView()
var currentLatitude:Double!
var currentLongitude:Double!

После этого добавьте это в свой код:

override func loadView() {

    print("loadView called")

    // Enable some map settings

    map.isMyLocationEnabled = true
    map.settings.myLocationButton = true
    map.settings.compassButton = true
    map.settings.scrollGestures = true
    map.settings.zoomGestures = true
    map.delegate = self

    view = map
}

override func viewDidLoad() {

    super.viewDidLoad()

    print("ViewDidLoad called")

    // Configuring location manager.

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.requestAlwaysAuthorization()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.startUpdatingLocation()
    locationManager.startMonitoringSignificantLocationChanges()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    print("locationManager function called")

    // Fetch current location coordinates

    let locValue:CLLocationCoordinate2D = (locationManager.location?.coordinate)!
    currentLatitude = locValue.latitude
    currentLongitude = locValue.longitude
    print("Current Location = \(currentLatitude!), \(currentLongitude!)")

    // Zoom to current location

    let target = CLLocationCoordinate2D(latitude: currentLatitude!, longitude: currentLongitude!)
    map.camera = GMSCameraPosition.camera(withTarget: target, zoom: 17)

    locationManager.stopUpdatingLocation()

}

После добавления этого кода щелкните правой кнопкой мыши свой Info.plist и выберите «Открыть как исходный код». Добавьте это в свой Info.plist.

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>googlechromes</string>
    <string>comgooglemaps</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSBluetoothPeripheralUsageDescription</key>
<string></string>
<key>NSCameraUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSMotionUsageDescription</key>
<string></string>
<key>NSPhotoLibraryUsageDescription</key>
<string></string>
<key>NSRemindersUsageDescription</key>
<string></string>
<key>NSSiriUsageDescription</key>
<string></string>
<key>NSSpeechRecognitionUsageDescription</key>
<string></string>
<key>NSVideoSubscriberAccountUsageDescription</key>
<string></string>
person Akhil Nair    schedule 11.04.2017