Почему мое приложение не отображает предупреждение, запрашивающее доступ к местоположению пользователя? - PullRequest
0 голосов
/ 05 марта 2019

Я разрабатываю навигационное приложение для iOS, которое использует Location Services, но у меня возникла проблема с ним.У меня есть объект UITableViewController, который создает экземпляр LocationManager, настраивает его для желаемой точности, фильтра расстояния и т. Д. У меня есть делегаты для didUpdateLocations и didChangeAuthorization, но по какой-то причине он падает при следующих условиях.Службы определения местоположения отключены, я запускаю приложение и получаю предупреждение о включении служб определения местоположения, которое я делаю, а затем возвращаюсь к приложению, ожидая, что оно отобразит другое предупреждение о запросе доступа к местоположению пользователя, но оно никогда не появляется.Приложение вылетает, когда я выбираю строку в своей таблице, потому что текущее местоположение пользователя не было инициализировано в моем UITableViewController.didUpdateLocations не вызывается.

//  CountiesTableVC.swift
//  TableViewsApp
//
//  Created by Stephen Learmonth on 10/12/2018.
//  Copyright © 2018 Stephen Learmonth. All rights reserved.
//

import UIKit
import CoreLocation
import MapKit

class CountiesTableVC: UITableViewController {

    let england : England = England()
    var countiesArray : [String] = ["Northamptonshire",
                                    "Bedfordshire",
                                    "Hertfordshire",
                                    "Staffordshire",
                                    "Essex",
                                    "North Yorkshire",
                                    "Herefordshire",
                                    "Cornwall",
                                    "Dorset",
                                    "Derbyshire",
                                    "Leicestershire",
                                    "Lancashire",
                                    "Cheshire",
                                    "Merseyside",
                                    "Suffolk",
                                    "County Durham",
                                    "Cumbria",
                                    "Gloucestershire",
                                    "Wiltshire",
                                    "Nottinghamshire",
                                    "Devon",
                                    "Somerset",
                                    "Lincolnshire"
                                    ]
    var sortedCounties : [ String ] = []

    var selectedCounty : String? = nil

    var currentCoordinate: CLLocationCoordinate2D! = nil
    var locationManager = CLLocationManager()

    override func viewDidLoad() {

        super.viewDidLoad()

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        locationManager.distanceFilter = 10.0
        locationManager.pausesLocationUpdatesAutomatically = true
        locationManager.requestWhenInUseAuthorization()

        sortedCounties = countiesArray.sorted{ $0 < $1 }

   }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return sortedCounties.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "CountyTableViewCell", for: indexPath) as! CountyTableViewCell

        let county = sortedCounties[indexPath.row]
        let countySites = england.counties[county]
        var siteIsSelectable = false
        if (countySites?.isEmpty)! == true {
            cell.backgroundColor = .gray
            cell.isUserInteractionEnabled = false
        } else {
            siteIsSelectable = true
            cell.backgroundColor = .blue
            cell.isUserInteractionEnabled = true
        }

        cell.setLabel(cellLabel: sortedCounties[indexPath.row], selectable: siteIsSelectable)

        return cell
    }


    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "toSitesTableVC" {

            let sitesTableVC = segue.destination as? SitesTableVC

            if let indexPath = self.tableView.indexPathForSelectedRow {
                selectedCounty = sortedCounties[indexPath.row]
                sitesTableVC?.selectedCounty = selectedCounty
                sitesTableVC?.currentCoordinate = currentCoordinate
            }

        } else {
            return
        }
    }


}

extension CountiesTableVC: CLLocationManagerDelegate {

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

    // get current location if avaialble
    guard let currentLocation = locations.last else { return }

    // get coordinates of current user location
    currentCoordinate = currentLocation.coordinate

    locationManager.stopUpdatingLocation()

    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        if status == .authorizedWhenInUse {

            // authorized location status when app is in use; update current location
            locationManager.startUpdatingLocation()
            // implement additional logic if needed...
        }

    }

}

Любая помощь будет принята с благодарностью.Благодаря.

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

, если вашему приложению требуется местоположение пользователя для "использования приложения", вам нужно добавить

Privacy - Location When In Use Usage Description в info.plist

в случае, если вашему приложению требуется местоположение пользователя для «всегда использовать», необходимо добавить

Privacy - Location When In Use Usage Description

Privacy - Location Always and When In Use Usage Description в info.plist

0 голосов
/ 06 марта 2019

В locationManager(manager:didChangeAuthorization) Мне нужно было изменить условное выражение if на status != .authorizedWhenInUse и позвонить на locationManager.requestWhenInUseAuthorization(), после чего мне выдается второе предупреждение с просьбой получить доступ к местоположению пользователя.Уровень авторизации не был изменен с .notDetemined на .authorizedWhenInuse, поэтому locationManager(manger:didUpdateLocations) не имеет ненулевого значения для текущего местоположения пользователя.Это нулевое значение было передано другому контроллеру представления, который ожидал отличного от нуля значения и не имел его, поэтому он вылетел.

0 голосов
/ 05 марта 2019

Проверьте этот ответ https://stackoverflow.com/a/38727017/2376336

В основном это говорит о том, что вам нужно добавить эти ключи в ваш info.plist:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Раньше вы могли просто добавлять их и оставлять их пустыми, это уже не так.Убедитесь, что вы ввели правильное и краткое описание того, зачем вам нужно местоположение пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...