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...
}
}
}
3 Réponses :
Vérifiez cette réponse https://stackoverflow.com/a/38727017/2376336 P>
À peu près beaucoup, il vous dit que vous devez ajouter ces clés dans votre 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. P> info.plist code>: p>
NSLOCIPOCATIONScriptionDescription Code> Li>
nslocactoringwaywaySusrogiescription code> li>
ul>
Si votre application nécessite l'emplacement de l'utilisateur pour "ON app utilisation", vous devez ajouter P>
Si votre application nécessite l'emplacement de l'utilisateur pour "Toujours utiliser", vous devez ajouter P>
Confidentialité - emplacement lors de l'utilisation d'utilisation Description CODE> IN
info.Plist code> p> P>
Confidentialité - Emplacement lors de l'utilisation Description de l'utilisation CODE> P>
Confidentialité - Emplacement Toujours et lors de l'utilisation Description de l'utilisation Code>
dans
info.plist code> p>
Salut, oui j'ai ajouté les paires d'info.plist Key-Value à mon application.
in EmplacementManager (Manager: DidChangeAutorization) Code> Je devais modifier le
si code> Expression conditionnelle sur
Status! = .AuthorizeininUtilise code> et faire un appel à
EmplacementManager.RequestWheninUneAuthorisation () Code> 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é code> à
.AuthorizeKheninininininuse code> SO
EmplacementManager (Manger: DidupDaTelocations) Code> 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é. P>
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 CODE> 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.