Implementare i metodi CLLocualizzazioneManagerDelegare in Swift
-
21-12-2019 - |
Domanda
Ho cercato di far funzionare questo per un po 'ora, e sono venuto qui per chiedere: come faccio a fare con l'utilizzo dei metodi CLLLocationManagerDelegate in Swift?L'ho messo in cima alla mia classe:
var locationManager = CLLocationManager()
.
Ho messo il seguente nel mio metodo viewDidLoad
:
locationManager.delegate = self
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
.
E ho provato a utilizzare questi metodi delegati senza risultato:
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
locationReceived = true
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
locationReceived = false
}
.
Ho anche provato a utilizzare @optional davanti alle funzioni, ma Xcode lancia quindi un errore del compilatore.Qualche idea?
Soluzione
È necessario aggiungere la chiave NSLocationAlwaysUsageDescription
o NSLocationWhenInUseUsageDescription
TagCode al tuo Plist Se non lo hai già fatto, ora sono obbligatori,
.
iOS8 + richiede una di queste due stringhe da impostare per utilizzare le posizioni. Quale si utilizza dipende da come hai intenzione di chiedere la posizione.
- .
-
Utilizzare
NSLocationAlwaysUsageDescription
per app che desiderano utilizzare la posizione del dispositivo anche quando l'app non è aperta e utilizzata. -
Utilizzare
NSLocationWhenInUseUsageDescription
per app che desiderano utilizzare la posizione del dispositivo solo quando l'app è aperta e in uso.
Nota: Quando si aggiungono le stringhe, prima di costruire ed eseguire, eliminare l'app dal dispositivo e lasciare che faccia una nuova installazione. Sembra che se l'app sia stata autorizzata a utilizzare le posizioni prima di essere aggiornato a IOS8 non chiede di nuovo il tuo permesso e non vede che tu possa impostare quelle stringhe. Fare un cancellazione e pulire l'installazione risolve questo.
Impostazione di una delle stringhe richiede un pop-up in installazione / primo utilizzo lungo le linee di: "Consenti" ThisApp "di accedere alla posizione anche quando non si utilizza l'app"
Ecco una schermata del file Plist .
Altri suggerimenti
Prima aggiungi questa riga in file Plist
1) Nslocationwheninuseusagescription
2) Nslocationalwaysusagescription
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
}
func initLocationManager() {
seenError = false
locationFixAchieved = false
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.locationServicesEnabled
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
locationManager.stopUpdatingLocation()
if (error) {
if (seenError == false) {
seenError = true
print(error)
}
}
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
if (locationFixAchieved == false) {
locationFixAchieved = true
var locationArray = locations as NSArray
var locationObj = locationArray.lastObject as CLLocation
var coord = locationObj.coordinate
println(coord.latitude)
println(coord.longitude)
}
}
func locationManager(manager: CLLocationManager!,
didChangeAuthorizationStatus status: CLAuthorizationStatus) {
var shouldIAllow = false
switch status {
case CLAuthorizationStatus.Restricted:
locationStatus = "Restricted Access to location"
case CLAuthorizationStatus.Denied:
locationStatus = "User denied access to location"
case CLAuthorizationStatus.NotDetermined:
locationStatus = "Status not determined"
default:
locationStatus = "Allowed to location Access"
shouldIAllow = true
}
NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil)
if (shouldIAllow == true) {
NSLog("Location to Allowed")
// Start location services
locationManager.startUpdatingLocation()
} else {
NSLog("Denied access: \(locationStatus)")
}
}
. Per ottenere la posizione corrente dell'utente: -
Step 1: let locationManager = CLLocationManager() // make object of CLLocationManager class.
Step 2: In viewDidLoad instantiate the CLLocationManager class like,
// per l'uso in background
self.locationManager.requestAlwaysAuthorization()
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if (CLLocationManager.locationServicesEnabled())
{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
.
Step 3: Ora implementa i metodi delegati di CLLocationManager
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var locValue:CLLocationCoordinate2D = manager.location.coordinate
println("locations = \(locValue.latitude) \(locValue.longitude)")
}
.
Step 4:
Non dimenticare di aggiungere NSLocationAlwaysUsageDescription
in info.plist come in iOS 8 è obbligatorio aggiungere questo.Questo chiederà il permesso di utilizzare la posizione dell'utente.
Ho avuto lo stesso problema.DiduPdatelocazioni - non funzionava.Esegui la tua app. Vai alla pagina Impostazioni -> Privacy -> Posizione e disattivare i servizi di localizzazione.Didfailwitheirror catturerà l'errore sui servizi di localizzazione assenti.Quindi accendilo.Dal momento che quel momento had-updatelocazioni cattureranno luoghi.
Questo è un po 'di un vecchio filo, eppure nessuno dei precedenti ha funzionato per me su Swift 2.2 Xcode 7.3.1.
Il problema è che stavo usando:
func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) {
print("Got location")
locationManager.stopUpdatingLocation()
}
.
E questo non è mai stato chiamato.Quando sono cambiato in:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("Got location")
locationManager.stopUpdatingLocation()
}
.
Tutto è stato risolto.Sembra che il delegato non venga chiamato quando si utilizza [AnyObject]