ios 如何使用 CLLocationManager 快速获取位置用户?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24252645/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 00:56:13  来源:igfitidea点击:

How to get Location user with CLLocationManager in swift?

iosswiftcore-locationcllocationmanager

提问by user3745888

I have this code on my view controller but this not working:

我的视图控制器上有此代码,但这不起作用:

  import UIKit
  import CoreLocation

  class ViewController: UIViewController, CLLocationManagerDelegate {

   var location: CLLocationManager!

  override func viewDidLoad() {
     super.viewDidLoad()

     location=CLLocationManager()
     location.delegate = self
     location.desiredAccuracy=kCLLocationAccuracyBest
     location.startUpdatingLocation()
 }

  func locationManager(location:CLLocationManager, didUpdateLocations locations:AnyObject[]) {
     println("locations = \(locations)")
     label1.text = "success"
 }

I have the permissions how I read in other post. but I don't obtain never, no println..

我有我在其他帖子中阅读的权限。但我从来没有获得过,没有 println ..

Thanks!!

谢谢!!

回答by jayesh kavathiya

first add this two line in plist file

首先在 plist 文件中添加这两行

1) NSLocationWhenInUseUsageDescription

1) NSLocationWhenInUseUsageDescription

2) NSLocationAlwaysUsageDescription

2) NSLocationAlwaysUsageDescription

Then this is class working complete implement this

然后这是类工作完成实现这个

import UIKit 
import CoreLocation

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

var window: UIWindow?
var locationManager: CLLocationManager!
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    initLocationManager();
    return true
}

// Location Manager helper stuff
func initLocationManager() {
    seenError = false
    locationFixAchieved = false
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.locationServicesEnabled
    locationManager.desiredAccuracy = kCLLocationAccuracyBest

    locationManager.requestAlwaysAuthorization()
}

// Location Manager Delegate stuff

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)")
        }
}
}

回答by Devendra Singh

Following are the simple steps for getting user location in Swift 3

以下是在 Swift 3 中获取用户位置的简单步骤

1) First add this line in plist file with description

1)首先在plist文件中添加这一行,并带有说明

 NSLocationWhenInUseUsageDescription

2) Add CoreLocation.framework in your project(Under section Build Phases-> Link Binary With Library)

2) 在您的项目中添加 CoreLocation.framework(在 Build Phases-> Link Binary With Library 部分下)

3) In AppDelegate class

3) 在 AppDelegate 类中

   import CoreLocation

4) Create locationManager Object as follows

4)创建locationManager对象如下

    var locationManager:CLLocationManager!

5) Write following code in didFinishLaunchingWithOptions

5) 在 didFinishLaunchingWithOptions 中编写以下代码

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = 200
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()

6) Confirm CLLocationManagerDelegate delegate like as follows

6) 确认 CLLocationManagerDelegate 委托如下

   class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate

7) Write CLLocationManagerDelegate delegate method for getting user location

7) 编写 CLLocationManagerDelegate 委托方法获取用户位置

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

    print("location error is = \(error.localizedDescription)")

}


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

    let locValue:CLLocationCoordinate2D = (manager.location?.coordinate)!


    print("Current Locations = \(locValue.latitude) \(locValue.longitude)")
}

回答by David Berry

Since you're declaring location as an explicitly unwrapped optional (CLLocationManager!) it requires an initializer, either in an init method as suggested by jhurray, or just inline, as:

由于您将 location 声明为显式展开的可选(CLLocationManager!),因此它需要一个初始化程序,要么在 jhurray 建议的 init 方法中,要么只是内联,如:

var location: CLLocationManager! = nil

Note that you've got other possible problems as well, including that iOS 8 has new requirements for querying the user for permission to use CoreLocation. See this questionfor more information.

请注意,您还有其他可能的问题,包括 iOS 8 对查询用户使用 CoreLocation 的权限有新要求。有关更多信息,请参阅此问题

回答by Christopher Wade Cantley

This is the same code as above but cleaned up to work with Swift as of the date of this posting. This worked for me.

这是与上面相同的代码,但在本文发布之日已清理完毕,可与 Swift 一起使用。这对我有用。

Kudos to the original poster.

感谢原海报。

(note, stick this into whatever class you will use to handle your location stuff.)

(请注意,将其粘贴到您将用于处理位置信息的任何类中。)

var lastLocation = CLLocation()
var locationAuthorizationStatus:CLAuthorizationStatus!
var window: UIWindow?
var locationManager: CLLocationManager!
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    
    
    self.initLocationManager()
    
}
    // Location Manager helper stuff
    func initLocationManager() {
        seenError = false
        locationFixAchieved = false
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        
        locationManager.requestAlwaysAuthorization()
    }
    
    // Location Manager Delegate stuff
    
    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
        locationManager.stopUpdatingLocation()
        if ((error) != nil) {
            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)")
            }
    }

回答by be.with.veeresh

Do following stuff in viewcontroller [Using swift] -

在视图控制器中执行以下操作 [使用 swift] -

  class ViewController:     
  UIViewController,MKMapViewDelegate,CLLocationManagerDelegate {


  var locationManager: CLLocationManager?
  var usersCurrentLocation:CLLocationCoordinate2D?

  override func viewDidLoad() {
    super.viewDidLoad()

    self.locationManager = CLLocationManager()

    if CLLocationManager.authorizationStatus() == .NotDetermined{
        locationManager?.requestAlwaysAuthorization()
    }

    locationManager?.desiredAccuracy = kCLLocationAccuracyBest
    locationManager?.distanceFilter = 200
    locationManager?.delegate = self
    startUpdatingLocation()

    usersCurrentLocation = CLLocationCoordinate2DMake(LATTITUDE, LONGITUDE)
    let span = MKCoordinateSpanMake(0.005, 0.005)
    let region = MKCoordinateRegionMake(usersCurrentLocation!, span)
    mapview.setRegion(region, animated: true)
    mapview.delegate = self
    mapview.showsUserLocation = true

}

//MARK: CLLocationManagerDelegate methods

//MARK: CLLocationManagerDelegate 方法

func startUpdatingLocation() {
    self.locationManager?.startUpdatingLocation()
}

func stopUpdatingLocation() {
    self.locationManager?.stopUpdatingLocation()
}

// MARK: MKMapViewDelegate

// MARK: MKMapViewDelegate

func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation){
    mapview.centerCoordinate = userLocation.location!.coordinate
    mapview.showsUserLocation = true
    regionWithGeofencing()

}

回答by MacInnis

It should be written as func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

应该写成 func locationManager(manager: CLLocationManager, didUpdateLocations location: [CLLocation]) {

回答by jhurray

You need to have init functions.

你需要有 init 函数。

Override init(coder:) and init(nibName: bundle:) and add any custom init you want.

覆盖 init(coder:) 和 init(nibName: bundle:) 并添加您想要的任何自定义初始化。

Because you have said that location is not optional, you must initialize it before your super init calls in ALL of your init functions.

因为您已经说过 location 不是可选的,所以您必须在所有 init 函数中的 super init 调用之前对其进行初始化。

func init() {
...
location = CLLocationManager()
// either set delegate and other stuff here or in viewDidLoad
super.init(nibName:nil, bundle:nil)
// other initialization below

}