为什么我无法获取位置信息?
Why i can't get Location?
我想获取我的位置坐标。由于任何原因,我的 loactionManger:didUpdateLocations
不起作用。我希望你能帮忙。
import CoreLocation
class Location: NSObject , CLLocationManagerDelegate {
let locationManager = CLLocationManager()
var latitude = 0.0
var longitude = 0.0
func getLocation() -> (latitude:Double , longitude: Double ){
if(CLLocationManager.locationServicesEnabled()){
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
locationManager.requestWhenInUseAuthorization()
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
return (latitude, longitude)
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var location :CLLocationCoordinate2D = manager.location.coordinate
latitude = location.latitude
longitude = location.longitude
println("Location: latitude: \(latitude)")
println("Location: longitude: \(longitude)")
locationManager.stopUpdatingLocation()
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("Error while updating location" + error.localizedDescription)
}
}
这是一个有效的例子。检查框架可以 return 的各种授权和错误。
有一点要记住:实现CLLocationManagerDelegate
的对象需要强烈保留。一旦对象被取消初始化,您的委托调用也会停止。
用法:用于创建对象的 ctor,如果您想在委托方法中传输位置数据(未提供流代码),请在客户端调用 startObserving()
和 stopObserving()
。使用 getCurrentLocation()
获取一次性值。
import CoreLocation
let DEFAULT_LOCATION_ACCURACY = kCLLocationAccuracyHundredMeters
struct LocationOptions {
var accuracy: Double
init(enableHighAccuracy: Bool = true) {
accuracy = enableHighAccuracy ? kCLLocationAccuracyBest : DEFAULT_LOCATION_ACCURACY
}
}
let loc = LocationOptions(enableHighAccuracy: false)
class LocationObserver: NSObject, CLLocationManagerDelegate {
var _locationManager = CLLocationManager()
var _observingLocation: Bool?
var _observerOptions: LocationOptions?
// Lifecycle
init(accuracy: Bool = true) {
super.init()
_locationManager.delegate = self
_locationManager.distanceFilter = DEFAULT_LOCATION_ACCURACY
_observerOptions = LocationOptions(enableHighAccuracy: accuracy)
}
deinit {
_locationManager.stopUpdatingLocation()
_locationManager.delegate = nil
}
// Private API
private func beginLocationUpdates() {
// Request location access permission
_locationManager.requestWhenInUseAuthorization()
// Start observing location
_locationManager.startUpdatingLocation()
}
// Public API
func startObserving() {
_locationManager.desiredAccuracy = _observerOptions!.accuracy
beginLocationUpdates()
_observingLocation = true
}
func stopObserving() {
// Stop observing
_observingLocation = false
// Stop updating if no pending requests
_locationManager.stopUpdatingLocation()
}
func getCurrentPosition(options: LocationOptions) {
if !CLLocationManager.locationServicesEnabled() {
NSLog("Location services disabled.")
return
}
if CLLocationManager.authorizationStatus() == .Denied {
return
}
// Configure location manager and begin updating location
_locationManager.desiredAccuracy = min(_locationManager.desiredAccuracy, options.accuracy)
beginLocationUpdates()
}
// CLLocationManagerDelegate
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [AnyObject]) {
// Get location data
let location = locations[locations.count - 1] as! CLLocation
// latitude: location.coordinate.latitude,
// longitude: location.coordinate.longitude,
// altitude: location.altitude,
// accuracy: location.horizontalAccuracy,
// altitudeAccuracy": location.verticalAccuracy,
// heading: location.course,
// speed: location.speed,
//
// STORE LOCATION DATA INSIDE SOME STRUCTURE HERE.
//
// Stop updating if not observing
if !(_observingLocation!) {
_locationManager.stopUpdatingLocation()
}
// Reset location accuracy
_locationManager.desiredAccuracy = DEFAULT_LOCATION_ACCURACY
}
}
// Usage
let locObs = LocationObserver() // Location Observer with high accuracy by default
locObs.startObserving() // Start observing
// Gather data inside the CLLocationManagerDelegate locationManager:didUpdateLocations: method
locObs.stopObserving() // Stop observing
// Alternative to start/stop. get one time location with low accuracy (for example)
locObs.getCurrentPosition(LocationOptions(enableHighAccuracy: false))
我想获取我的位置坐标。由于任何原因,我的 loactionManger:didUpdateLocations
不起作用。我希望你能帮忙。
import CoreLocation
class Location: NSObject , CLLocationManagerDelegate {
let locationManager = CLLocationManager()
var latitude = 0.0
var longitude = 0.0
func getLocation() -> (latitude:Double , longitude: Double ){
if(CLLocationManager.locationServicesEnabled()){
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
locationManager.requestWhenInUseAuthorization()
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
return (latitude, longitude)
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var location :CLLocationCoordinate2D = manager.location.coordinate
latitude = location.latitude
longitude = location.longitude
println("Location: latitude: \(latitude)")
println("Location: longitude: \(longitude)")
locationManager.stopUpdatingLocation()
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("Error while updating location" + error.localizedDescription)
}
}
这是一个有效的例子。检查框架可以 return 的各种授权和错误。
有一点要记住:实现CLLocationManagerDelegate
的对象需要强烈保留。一旦对象被取消初始化,您的委托调用也会停止。
用法:用于创建对象的 ctor,如果您想在委托方法中传输位置数据(未提供流代码),请在客户端调用 startObserving()
和 stopObserving()
。使用 getCurrentLocation()
获取一次性值。
import CoreLocation
let DEFAULT_LOCATION_ACCURACY = kCLLocationAccuracyHundredMeters
struct LocationOptions {
var accuracy: Double
init(enableHighAccuracy: Bool = true) {
accuracy = enableHighAccuracy ? kCLLocationAccuracyBest : DEFAULT_LOCATION_ACCURACY
}
}
let loc = LocationOptions(enableHighAccuracy: false)
class LocationObserver: NSObject, CLLocationManagerDelegate {
var _locationManager = CLLocationManager()
var _observingLocation: Bool?
var _observerOptions: LocationOptions?
// Lifecycle
init(accuracy: Bool = true) {
super.init()
_locationManager.delegate = self
_locationManager.distanceFilter = DEFAULT_LOCATION_ACCURACY
_observerOptions = LocationOptions(enableHighAccuracy: accuracy)
}
deinit {
_locationManager.stopUpdatingLocation()
_locationManager.delegate = nil
}
// Private API
private func beginLocationUpdates() {
// Request location access permission
_locationManager.requestWhenInUseAuthorization()
// Start observing location
_locationManager.startUpdatingLocation()
}
// Public API
func startObserving() {
_locationManager.desiredAccuracy = _observerOptions!.accuracy
beginLocationUpdates()
_observingLocation = true
}
func stopObserving() {
// Stop observing
_observingLocation = false
// Stop updating if no pending requests
_locationManager.stopUpdatingLocation()
}
func getCurrentPosition(options: LocationOptions) {
if !CLLocationManager.locationServicesEnabled() {
NSLog("Location services disabled.")
return
}
if CLLocationManager.authorizationStatus() == .Denied {
return
}
// Configure location manager and begin updating location
_locationManager.desiredAccuracy = min(_locationManager.desiredAccuracy, options.accuracy)
beginLocationUpdates()
}
// CLLocationManagerDelegate
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [AnyObject]) {
// Get location data
let location = locations[locations.count - 1] as! CLLocation
// latitude: location.coordinate.latitude,
// longitude: location.coordinate.longitude,
// altitude: location.altitude,
// accuracy: location.horizontalAccuracy,
// altitudeAccuracy": location.verticalAccuracy,
// heading: location.course,
// speed: location.speed,
//
// STORE LOCATION DATA INSIDE SOME STRUCTURE HERE.
//
// Stop updating if not observing
if !(_observingLocation!) {
_locationManager.stopUpdatingLocation()
}
// Reset location accuracy
_locationManager.desiredAccuracy = DEFAULT_LOCATION_ACCURACY
}
}
// Usage
let locObs = LocationObserver() // Location Observer with high accuracy by default
locObs.startObserving() // Start observing
// Gather data inside the CLLocationManagerDelegate locationManager:didUpdateLocations: method
locObs.stopObserving() // Stop observing
// Alternative to start/stop. get one time location with low accuracy (for example)
locObs.getCurrentPosition(LocationOptions(enableHighAccuracy: false))