Nhận vị trí / tọa độ hiện tại của người dùng


194

Làm cách nào tôi có thể lưu trữ vị trí hiện tại của người dùng và cũng hiển thị vị trí trên bản đồ?

Tôi có thể hiển thị tọa độ được xác định trước trên bản đồ, tôi chỉ không biết cách nhận thông tin từ thiết bị.

Ngoài ra tôi biết tôi phải thêm một số mục vào Plist. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


225

Để có được vị trí hiện tại của người dùng, bạn cần khai báo:

let locationManager = CLLocationManager()

Trong viewDidLoad()bạn phải khởi tạo CLLocationManagerlớp, như vậy:

// Ask for Authorisation from the User.
self.locationManager.requestAlwaysAuthorization() 

// For use in foreground
self.locationManager.requestWhenInUseAuthorization()

if CLLocationManager.locationServicesEnabled() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.startUpdatingLocation()
}

Sau đó, trong phương thức CLLocationManagerDelegate, bạn có thể nhận tọa độ vị trí hiện tại của người dùng:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
    print("locations = \(locValue.latitude) \(locValue.longitude)")
}

Trong thông tin.plist, bạn sẽ phải thêm NSLocationAlwaysUsageDescription và thông báo cảnh báo tùy chỉnh của bạn như; AppName (Ứng dụng Demo) muốn sử dụng vị trí hiện tại của bạn.


60
Đừng quên về Import MapKit+ CoreLocation+ thêm CLLocationManagerDelegatevào định nghĩa lớp.
Lukesivi 7/12/2015

7
@Yusha Nếu điều này giống như Objective-C đối với bạn, thì bạn chưa bao giờ thấy Objective-C (cũng không phải Swift)
Martin Marconcini

4
Bạn đã quên đề cập đến việc thực hiện giao thức CLLocationManagerDelegate.
ssd352

13
NSLocationAlwaysUsageDescriptionđã được đổi tên thànhPrivacy - Location Always Usage Description
Saoud Rizwan

4
Bạn PHẢI khai báo locationManagerlà biến toàn cục thay vì biến cục bộ trongviewDidLoad
chengsam

100

bạn nên làm những bước đó:

  1. thêm CoreLocation.frameworkvào BuildPhase -> Liên kết nhị phân với thư viện (không còn cần thiết kể từ XCode 7.2.1)
  2. nhập khẩu CoreLocation vào lớp của bạn - rất có thể là ViewControll.swift
  3. thêm vào CLLocationManagerDelegate vào khai báo lớp của bạn
  4. thêm NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescriptionđể
  5. quản lý vị trí init:

    locationManager = CLLocationManager()
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
  6. lấy vị trí người dùng theo:

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    }

3
chức năng mới: func locationManager (người quản lý: CLLocationManager, didUpdateLocations vị trí: [CLLocation])
user523234 18/03/2016

Từng bước trả lời. Nhưng hãy cập nhật nó. Nó không hoạt động bây giờ.
Dheeraj D

59

Cập nhật cho iOS 12.2 với Swift 5

bạn phải thêm quyền riêng tư sau trong tệp plist

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>

Đây là tôi

nhận vị trí hiện tại và hiển thị trên Bản đồ trong Swift 2.0

Đảm bảo bạn đã thêm khung CoreLocationMapKit vào dự án của mình (Điều này không bắt buộc với XCode 7.2.1)

import Foundation
import CoreLocation
import MapKit

class DiscoverViewController : UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var map: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

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

        let location = locations.last! as CLLocation

        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

        self.map.setRegion(region, animated: true)
    }
}

Đây là màn hình kết quả

Ảnh chụp màn hình bản đồ, tập trung ở Mumbai


Tôi chạy mã của bạn và tôi nhận được một màn hình trắng trống. Có một cái nhìn hoặc một cái gì đó tôi cần thêm vào bảng phân cảnh?
ThisClark

1
Tôi đã làm việc rất tốt với Swift 4, chỉ cần thêm dấu gạch dưới (được nhắc bởi Xcode) để dòng locationManager trở thành: func locationManager (_ manager: CLLocationManager, didUpdateLocations vị trí: [CLLocation])
Elijah Lofgren

32

Nhập thư viện như:

import CoreLocation

đặt Đại biểu:

CLLocationManagerDelegate

Lấy biến như:

var locationManager:CLLocationManager!

Trên viewDidLoad () viết mã đẹp này:

 locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()

    if CLLocationManager.locationServicesEnabled(){
        locationManager.startUpdatingLocation()
    }

Viết phương thức ủy nhiệm CLLocation:

    //MARK: - location delegate methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation :CLLocation = locations[0] as CLLocation

    print("user latitude = \(userLocation.coordinate.latitude)")
    print("user longitude = \(userLocation.coordinate.longitude)")

    self.labelLat.text = "\(userLocation.coordinate.latitude)"
    self.labelLongi.text = "\(userLocation.coordinate.longitude)"

    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(userLocation) { (placemarks, error) in
        if (error != nil){
            print("error in reverseGeocode")
        }
        let placemark = placemarks! as [CLPlacemark]
        if placemark.count>0{
            let placemark = placemarks![0]
            print(placemark.locality!)
            print(placemark.administrativeArea!)
            print(placemark.country!)

            self.labelAdd.text = "\(placemark.locality!), \(placemark.administrativeArea!), \(placemark.country!)"
        }
    }

}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Error \(error)")
}

Bây giờ thiết lập quyền truy cập cho các vị trí, vì vậy thêm những giá trị quan trọng vào bạn info.plist tập tin

 <key>NSLocationAlwaysUsageDescription</key>
<string>Will you allow this app to always know your location?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>

nhập mô tả hình ảnh ở đây

100% làm việc mà không có vấn đề gì. THỬ NGHIỆM


Tôi có một ngôn ngữ khác sau đó nó không hoạt động. tôi chỉ muốn ngôn ngữ tiếng anh
Maulik shah

29

@wonderwhy Tôi đã thêm ảnh chụp màn hình mã của tôi.  vui lòng kiểm tra nó  Bạn sẽ phải thêm <code> NSLocationWhenInUseUsageDes mô tả trong danh sách để được ủy quyền. </ Code>

NSLocationWhenInUseUsageDescription = Yêu cầu quyền sử dụng dịch vụ định vị khi các ứng dụng ở chế độ nền. trong tập tin plist của bạn.

Nếu điều này hoạt động thì hãy bỏ phiếu trả lời.


1
bạn có thể giải thích câu trả lời của mình nhiều hơn bằng cách thêm mã. Nếu bạn muốn
Krutarth Patel

16
sẽ rất tuyệt nếu có đoạn mã sử dụng ngôn ngữ đánh dấu thay vì dán ảnh chụp màn hình
Nicholas Allio

25

Nhập thư viện Corelocation và MapKit đầu tiên:

import MapKit
import CoreLocation

kế thừa từ CLLocationManagerDelegate cho lớp của chúng tôi

class ViewController: UIViewController, CLLocationManagerDelegate

tạo một biến locationManager, đây sẽ là dữ liệu vị trí của bạn

var locationManager = CLLocationManager()

tạo một hàm để lấy thông tin vị trí, cụ thể cú pháp chính xác này hoạt động:

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

trong chức năng của bạn tạo một hằng số cho vị trí hiện tại của người dùng

let userLocation:CLLocation = locations[0] as CLLocation // note that locations is same as the one in the function declaration  

dừng cập nhật vị trí, điều này ngăn thiết bị của bạn liên tục thay đổi Cửa sổ để căn giữa vị trí của bạn trong khi di chuyển (bạn có thể bỏ qua phần này nếu bạn muốn nó hoạt động khác)

manager.stopUpdatingLocation()

khiến người dùng phối hợp từ userLocatin bạn vừa xác định:

let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)

xác định mức độ phóng to mà bạn muốn bản đồ của mình là:

let span = MKCoordinateSpanMake(0.2,0.2) kết hợp hai để có được khu vực:

let region = MKCoordinateRegion(center: coordinations, span: span)//this basically tells your map where to look and where from what distance

Bây giờ hãy đặt khu vực và chọn xem bạn có muốn nó đi đến đó với hoạt hình hay không

mapView.setRegion(region, animated: true)

đóng chức năng của bạn }

từ nút của bạn hoặc một cách khác mà bạn muốn đặt locationManagerDel Don thành tự

bây giờ cho phép vị trí được hiển thị

chỉ định độ chính xác

locationManager.desiredAccuracy = kCLLocationAccuracyBest

ủy quyền:

 locationManager.requestWhenInUseAuthorization()

để có thể ủy quyền dịch vụ định vị, bạn cần thêm hai dòng này vào danh sách

nhập mô tả hình ảnh ở đây

lấy địa điểm:

locationManager.startUpdatingLocation()

hiển thị cho người dùng:

mapView.showsUserLocation = true

Đây là mã hoàn chỉnh của tôi:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!

    var locationManager = CLLocationManager()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func locateMe(sender: UIBarButtonItem) {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()

        mapView.showsUserLocation = true

    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let userLocation:CLLocation = locations[0] as CLLocation

        manager.stopUpdatingLocation()

        let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
        let span = MKCoordinateSpanMake(0.2,0.2)
        let region = MKCoordinateRegion(center: coordinations, span: span)

        mapView.setRegion(region, animated: true)

    }
}

20

Swift 3.0

Nếu bạn không muốn hiển thị vị trí người dùng trong bản đồ, nhưng chỉ muốn lưu trữ vị trí đó trong căn cứ hỏa lực hoặc một số nơi khác thì hãy làm theo các bước này,

import MapKit
import CoreLocation

Bây giờ sử dụng CLLocationManagerDelegate trên VC của bạn và bạn phải ghi đè ba phương thức cuối cùng được hiển thị bên dưới. Bạn có thể xem phương thức requestLocation () sẽ đưa bạn vị trí người dùng hiện tại bằng cách sử dụng các phương thức này như thế nào.

class MyVc: UIViewController, CLLocationManagerDelegate {

  let locationManager = CLLocationManager()

 override func viewDidLoad() {
    super.viewDidLoad()

    isAuthorizedtoGetUserLocation()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    }
}

 //if we have no permission to access user location, then ask user for permission.
func isAuthorizedtoGetUserLocation() {

    if CLLocationManager.authorizationStatus() != .authorizedWhenInUse     {
        locationManager.requestWhenInUseAuthorization()
    }
}


//this method will be called each time when a user change his location access preference.
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse {
        print("User allowed us to access location")
        //do whatever init activities here.
    }
}


 //this method is called by the framework on         locationManager.requestLocation();
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("Did location updates is called")
    //store the user location here to firebase or somewhere 
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Did location updates is called but failed getting location \(error)")
}

}

Bây giờ bạn có thể mã cuộc gọi bên dưới khi người dùng đăng nhập vào ứng dụng của bạn. Khi requestLocation () được gọi, nó sẽ tiếp tục gọi didUpdateLocations ở trên và bạn có thể lưu trữ vị trí vào Firebase hoặc bất cứ nơi nào khác.

if CLLocationManager.locationServicesEnabled() {
            locationManager.requestLocation();
 }

nếu bạn đang sử dụng GeoFire thì trong phương thức didUpdateLocations ở trên, bạn có thể lưu trữ vị trí như bên dưới

geoFire?.setLocation(locations.first, forKey: uid) where uid is the user id who logged in to the app. I think you will know how to get UID based on your app sign in implementation. 

Cuối cùng nhưng không kém phần quan trọng, hãy truy cập Info.plist của bạn và bật "Quyền riêng tư-Vị trí khi sử dụng Mô tả sử dụng."

Khi bạn sử dụng trình giả lập để kiểm tra, nó luôn cung cấp cho bạn một vị trí tùy chỉnh mà bạn đã định cấu hình trong Trình mô phỏng -> Gỡ lỗi -> Vị trí.


Xin chào, các vị trí (kinh độ, vĩ độ) ở đâu, tần suất tải lại các vị trí như thế nào?
Cristian Mora

@CristianMora khi địa điểm locationager các vị trí thuộc loại CLLocation và bạn có thể nhận được độ dài, vĩ độ từ đối tượng này. Nếu bạn chỉ cần thông tin người dùng một lần thì bạn không cần tải lại các vị trí nếu không bạn có thể gọi requestLocation () nếu cần. Ví dụ một yêu cầu tìm kiếm, bạn gọi requestLocation () trước và sau đó dựa trên vị trí đưa ra câu trả lời.
Lyju I Edwinson

15

đầu tiên thêm hai khung trong dự án của bạn

1: MapKit

2: Corelocation (không còn cần thiết kể từ XCode 7.2.1)

Xác định trong lớp học của bạn

var manager:CLLocationManager!
var myLocations: [CLLocation] = []

sau đó trong mã phương thức viewDidLoad này

manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestAlwaysAuthorization()
manager.startUpdatingLocation()

//Setup our Map View
mapobj.showsUserLocation = true

đừng quên thêm hai giá trị này vào tệp plist

1: NSLocationWhenInUseUsageDescription

2: NSLocationAlwaysUsageDescription

11
import CoreLocation
import UIKit

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
    } 

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status != .authorizedWhenInUse {return}
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
        let locValue: CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    }
}

Vì cuộc gọi đến requestWhenInUseAuthorizationkhông đồng bộ, ứng dụng sẽ gọi locationManagerchức năng sau khi người dùng đã cấp phép hoặc từ chối nó. Do đó, việc đặt mã vị trí của bạn bên trong chức năng đó là do người dùng cấp quyền. Đây là hướng dẫn tốt nhất về điều này tôi đã tìm thấy trên đó .


10
 override func viewDidLoad() {

    super.viewDidLoad()       
    locationManager.requestWhenInUseAuthorization();     
    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }
    else{
        print("Location service disabled");
    }
  }

Đây là chế độ xem của bạn đã tải phương thức và trong Lớp ViewContoder cũng bao gồm phương thức cập nhật mapStart như sau

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    var locValue : CLLocationCoordinate2D = manager.location.coordinate;
    let span2 = MKCoordinateSpanMake(1, 1)    
    let long = locValue.longitude;
    let lat = locValue.latitude;
    print(long);
    print(lat);        
    let loadlocation = CLLocationCoordinate2D(
                    latitude: lat, longitude: long            

   )     

    mapView.centerCoordinate = loadlocation;
    locationManager.stopUpdatingLocation();
}

Cũng đừng quên thêm CoreLocation.FrameWork và MapKit.Framework trong dự án của bạn (không còn cần thiết kể từ XCode 7.2.1 )


6

Sử dụng:

Xác định trường trong lớp

let getLocation = GetLocation()

Sử dụng trong chức năng của lớp bằng mã đơn giản:

getLocation.run {
    if let location = $0 {
        print("location = \(location.coordinate.latitude) \(location.coordinate.longitude)")
    } else {
        print("Get Location failed \(getLocation.didFailWithError)")
    }
}

Lớp học:

import CoreLocation

public class GetLocation: NSObject, CLLocationManagerDelegate {
    let manager = CLLocationManager()
    var locationCallback: ((CLLocation?) -> Void)!
    var locationServicesEnabled = false
    var didFailWithError: Error?

    public func run(callback: @escaping (CLLocation?) -> Void) {
        locationCallback = callback
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        manager.requestWhenInUseAuthorization()
        locationServicesEnabled = CLLocationManager.locationServicesEnabled()
        if locationServicesEnabled { manager.startUpdatingLocation() }
        else { locationCallback(nil) }
    }

   public func locationManager(_ manager: CLLocationManager,
                         didUpdateLocations locations: [CLLocation]) {
        locationCallback(locations.last!)
        manager.stopUpdatingLocation()
    }

    public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        didFailWithError = error
        locationCallback(nil)
        manager.stopUpdatingLocation()
    }

    deinit {
        manager.stopUpdatingLocation()
    }
}


Đừng quên thêm "NSLocationWhenInUseUsageDes mô tả" trong thông tin.plist.


1
Cảm ơn! Đừng quên thêm "NSLocationWhenInUseUsageDes mô tả" trong thông
tin.plist

2
import Foundation
import CoreLocation

enum Result<T> {
  case success(T)
  case failure(Error)
}

final class LocationService: NSObject {
private let manager: CLLocationManager

init(manager: CLLocationManager = .init()) {
    self.manager = manager
    super.init()
    manager.delegate = self
}

var newLocation: ((Result<CLLocation>) -> Void)?
var didChangeStatus: ((Bool) -> Void)?

var status: CLAuthorizationStatus {
    return CLLocationManager.authorizationStatus()
}

func requestLocationAuthorization() {
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    if CLLocationManager.locationServicesEnabled() {
        manager.startUpdatingLocation()
        //locationManager.startUpdatingHeading()
    }
}

func getLocation() {
    manager.requestLocation()
}

deinit {
    manager.stopUpdatingLocation()
}

}

 extension LocationService: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    newLocation?(.failure(error))
    manager.stopUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.sorted(by: {$0.timestamp > $1.timestamp}).first {
        newLocation?(.success(location))
    }
      manager.stopUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined, .restricted, .denied:
        didChangeStatus?(false)
    default:
        didChangeStatus?(true)
    }
}
}

Cần phải viết mã này trong ViewControll cần thiết.

 //NOTE:: Add permission in info.plist::: NSLocationWhenInUseUsageDescription


let locationService = LocationService()

 @IBAction func action_AllowButtonTapped(_ sender: Any) {
  didTapAllow()
 }

 func didTapAllow() {
   locationService.requestLocationAuthorization()
 }

 func getCurrentLocationCoordinates(){
   locationService.newLocation = {result in
     switch result {
      case .success(let location):
      print(location.coordinate.latitude, location.coordinate.longitude)
      case .failure(let error):
      assertionFailure("Error getting the users location \(error)")
   }
  }
}

    func getCurrentLocationCoordinates(){
    locationService.newLocation = {result in
        switch result {
        case .success(let location):
            print(location.coordinate.latitude, location.coordinate.longitude)
            CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in
                if error != nil {
                    print("Reverse geocoder failed with error" + (error?.localizedDescription)!)
                    return
                }
                if (placemarks?.count)! > 0 {
                    print("placemarks", placemarks!)
                    let pmark = placemarks?[0]
                    self.displayLocationInfo(pmark)
                } else {
                    print("Problem with the data received from geocoder")
                }
            })
        case .failure(let error):
            assertionFailure("Error getting the users location \(error)")
        }
    }
}

0

đây là một ví dụ sao chép-dán làm việc cho tôi.

http://swiftdeveloperblog.com/code-examples/determine-users-civerse-location-example-in-swift/

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager:CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        determineMyCurrentLocation()
    }


    func determineMyCurrentLocation() {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestAlwaysAuthorization()

        if CLLocationManager.locationServicesEnabled() {
            locationManager.startUpdatingLocation()
            //locationManager.startUpdatingHeading()
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let userLocation:CLLocation = locations[0] as CLLocation

        // Call stopUpdatingLocation() to stop listening for location updates,
        // other wise this function will be called every time when user location changes.

       // manager.stopUpdatingLocation()

        print("user latitude = \(userLocation.coordinate.latitude)")
        print("user longitude = \(userLocation.coordinate.longitude)")
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
    {
        print("Error \(error)")
    }
}

-1
// its with strongboard 
@IBOutlet weak var mapView: MKMapView!

//12.9767415,77.6903967 - exact location latitude n longitude location 
let cooridinate = CLLocationCoordinate2D(latitude: 12.9767415 , longitude: 77.6903967)
let  spanDegree = MKCoordinateSpan(latitudeDelta: 0.2,longitudeDelta: 0.2)
let region = MKCoordinateRegion(center: cooridinate , span: spanDegree)
mapView.setRegion(region, animated: true)

-1

100% hoạt động trong iOS Swift 4 bởi: Parmar Sajjad

Bước 1: Goto GoogleDeveloper Api Console và tạo ApiKey của bạn

Bước 2: Dự án Goto cài đặt Cocoapods GoogleMaps pod

Bước 3: Goto AppDelegate.swift nhập GoogleMaps và

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    GMSServices.provideAPIKey("ApiKey")
    return true
}

Bước 4: nhập UIKit nhập lớp GoogleMaps ViewCont Bộ điều khiển: UIViewControll, CLLocationManagerDelegate {

@IBOutlet weak var mapview: UIView!
let locationManager  = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    locationManagerSetting()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func locationManagerSetting() {

    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    self.showCurrentLocationonMap()
    self.locationManager.stopUpdatingLocation()
}
func showCurrentLocationonMap() {
    let
    cameraposition  = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)!  , longitude: (self.locationManager.location?.coordinate.longitude)!, zoom: 18)
    let  mapviewposition = GMSMapView.map(withFrame: CGRect(x: 0, y: 0, width: self.mapview.frame.size.width, height: self.mapview.frame.size.height), camera: cameraposition)
    mapviewposition.settings.myLocationButton = true
    mapviewposition.isMyLocationEnabled = true

    let marker = GMSMarker()
    marker.position = cameraposition.target
    marker.snippet = "Macczeb Technologies"
    marker.appearAnimation = GMSMarkerAnimation.pop
    marker.map = mapviewposition
    self.mapview.addSubview(mapviewposition)

}

}

Bước 5: mở tệp info.plist và Thêm bên dưới Quyền riêng tư - Vị trí khi sử dụng Mô tả sử dụng ...... bên dưới tên cơ sở của bảng phân cảnh chính

bước 6: chạy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.