0
votes

Pourquoi mon application n'affiche pas l'alerte pour demander à accéder à l'emplacement de l'utilisateur?

Je développe une application de navigation dans iOS qui utilise des services de localisation, mais j'ai un problème avec cela. J'ai un objet utableviewcontroller code> qui crée une instance de EmplacementManager code>, la configure pour la précision souhaitée, le filtre à distance, etc. J'ai des délégués pour DidupdaTelocations CODE> et DidChangeAuthorisation Code> Mais pour une raison quelconque, il se bloque dans les conditions suivantes. Les services de localisation sont désactivés, je lance l'application et je reçois une alerte pour activer les services d'emplacement que je fais, puis revenez à l'application qui s'attend à ce qu'il affiche une autre alerte à propos de demander à l'emplacement de l'utilisateur, mais elle n'apparaît jamais. L'application se bloque lorsque je sélectionne une ligne dans ma table, car l'emplacement actuel de l'utilisateur n'a pas été initialisé dans mon UitailViewController code>. DIDUPDATELOCATIONS CODE> n'est pas appelé.

//  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...
        }

    }

}


4 commentaires

avez-vous ajouté nslocyclocyclingusagedescription ou nslocationQueDescription dans le fichier de plis


Initialise Emplacement Manager Objet dans ViewDidLoad Like Cet emplacementManager = CllouerManager ()


Pas exactement connexe mais - dans DIDUPDATELOCATIONS Vous prenez la toute première tentative à un endroit et en cours d'exécution avec elle. Le gestionnaire d'emplacement vous enverra un flux d'emplacements (espérons-le) plus précis que le dernier. Vous seriez normalement surveiller ces retours et arrêtez le responsable lorsque une précision prédéterminée a été améliorée. Le premier retour pourrait avoir une énorme erreur / incertitude ou peut même contenir une erreur.


Bonjour, oui j'ai déjà ajouté les touches info.plist.


3 Réponses :


0
votes

Vérifiez cette réponse https://stackoverflow.com/a/38727017/2376336

À peu près beaucoup, il vous dit que vous devez ajouter ces clés dans votre info.plist :

  • NSLOCIPOCATIONScriptionDescription
  • nslocactoringwaywaySusrogiescription

    Dans le passé, vous pouvez simplement les ajouter et les laisser en blanc, ce n'est plus le cas. Assurez-vous d'entrer une description appropriée et concise pour la raison pour laquelle vous avez besoin de l'emplacement de l'utilisateur.


0 commentaires

0
votes

Si votre application nécessite l'emplacement de l'utilisateur pour "ON app utilisation", vous devez ajouter

Confidentialité - emplacement lors de l'utilisation d'utilisation Description IN info.Plist

Si votre application nécessite l'emplacement de l'utilisateur pour "Toujours utiliser", vous devez ajouter

Confidentialité - Emplacement lors de l'utilisation Description de l'utilisation

Confidentialité - Emplacement Toujours et lors de l'utilisation Description de l'utilisation dans info.plist


1 commentaires

Salut, oui j'ai ajouté les paires d'info.plist Key-Value à mon application.



0
votes

in EmplacementManager (Manager: DidChangeAutorization) Je devais modifier le si Expression conditionnelle sur Status! = .AuthorizeininUtilise et faire un appel à EmplacementManager.RequestWheninUneAuthorisation () Ensuite, je reçois la deuxième alerte pour demander à accéder à l'emplacement de l'utilisateur. Le niveau d'autorisation n'avait pas été changé de .notDeteminefinné à .AuthorizeKheninininininuse SO EmplacementManager (Manger: DidupDaTelocations) n'a pas eu de non-nil valeur pour l'emplacement actuel de l'utilisateur. Cette valeur nul a été transmise à un autre contrôleur d'affichage qui attendait une valeur non nulle et n'en avait pas un, donc il s'est écrasé.


0 commentaires