उपयोगकर्ता के वर्तमान स्थान / निर्देशांक प्राप्त करें


194

मैं उपयोगकर्ता के वर्तमान स्थान को कैसे संग्रहीत कर सकता हूं और नक्शे पर स्थान भी दिखा सकता हूं?

मैं मानचित्र पर पूर्व-निर्धारित निर्देशांक दिखाने में सक्षम हूं, मुझे अभी यह नहीं पता है कि डिवाइस से जानकारी कैसे प्राप्त की जाए।

मुझे यह भी पता है कि मुझे कुछ वस्तुओं को एक मुट्ठी में जोड़ना होगा। मैं उसे कैसे कर सकता हूँ?

जवाबों:


225

उपयोगकर्ता का वर्तमान स्थान प्राप्त करने के लिए आपको घोषणा करने की आवश्यकता है:

let locationManager = CLLocationManager()

में viewDidLoad()आप का दृष्टांत के लिए है CLLocationManagerवर्ग, इसलिए पसंद:

// 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()
}

फिर CLLocationManagerDelegate विधि में आप उपयोगकर्ता के वर्तमान स्थान निर्देशांक प्राप्त कर सकते हैं:

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

Info.plist में आपको NSLocationAlwaysUsageDescription अपने कस्टम अलर्ट संदेश को जोड़ना होगा और पसंद करना होगा; AppName (डेमो ऐप) आपके वर्तमान स्थान का उपयोग करना चाहेगा।


60
वर्ग परिभाषा में Import MapKit+ CoreLocation+ जोड़ने के बारे में मत भूलना CLLocationManagerDelegate
लुकसीव

7
@ युशा अगर यह आपको ऑब्जेक्टिव-सी की तरह दिखता है, तो आपने कभी ऑब्जेक्टिव-सी (न ही स्विफ्ट)
मार्टिन मारकोसिनी

4
आप CLLocationManagerDelegate प्रोटोकॉल के कार्यान्वयन का उल्लेख करना भूल गए।
ssd352

13
NSLocationAlwaysUsageDescriptionनाम बदल दिया गया हैPrivacy - Location Always Usage Description
सौद रिज़वान

4
आप locationManagerएक स्थानीय चर के बजाय एक वैश्विक चर के रूप में घोषित करना चाहते हैंviewDidLoad
चेंग्सम

100

आपको उन चरणों को करना चाहिए:

  1. CoreLocation.frameworkBuildPhases में जोड़ें -> पुस्तकालयों के साथ लिंक बाइनरी (XCode 7.2.1 के अनुसार अब आवश्यक नहीं है)
  2. CoreLocationआपकी कक्षा में आयात - सबसे अधिक संभावना ViewController.swift
  3. CLLocationManagerDelegateअपनी कक्षा की घोषणा में जोड़ें
  4. जोड़ना NSLocationWhenInUseUsageDescriptionऔर NSLocationAlwaysUsageDescriptionचढ़ाना
  5. init स्थान प्रबंधक:

    locationManager = CLLocationManager()
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
  6. उपयोगकर्ता स्थान प्राप्त करें:

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

3
नया कार्य: func locationManager (प्रबंधक: CLLocationManager, didUpdateLocations स्थान: [CLLocation])
user523234

स्टेप बाय स्टेप जवाब। लेकिन कृपया इसे अपडेट करें। अभी इसके लिए काम नहीं कर रहा है।
धीरज डी

59

Swift 5 के साथ iOS 12.2 के लिए अपडेट करें

आपको plist फ़ाइल में निम्नलिखित गोपनीयता अनुमतियां मिलानी चाहिए

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

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

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

यहाँ है कि मैं कैसे हूँ

वर्तमान स्थान प्राप्त करना और स्विफ्ट 2.0 में मानचित्र पर दिखाना

सुनिश्चित करें कि आपने CoreLocation और MapKit ढांचे को अपनी परियोजना में जोड़ा है (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)
    }
}

यहाँ परिणाम स्क्रीन है

नक्शे का एक स्क्रीनशॉट, मुंबई में केंद्रित है


मैं आपका कोड चलाता हूं और मुझे एक खाली सफेद स्क्रीन मिलती है। क्या स्टोरीबोर्ड पर मुझे कोई दृश्य या कुछ और जोड़ना है?
ThisClark

1
स्विफ्ट 4 में मेरे लिए बहुत अच्छा काम किया, बस एक अंडरस्कोर जोड़ना था (एक्सकोड द्वारा प्रेरित) इसलिए लोकेशन मैन लाइन बन गया: फंक लोकेशन मैनजर (_ प्रबंधक: CLLocationManager, didUpdateLocations स्थानों [[CLLocation])
एलिजा लोफग्रेन

32

लाइब्रेरी आयात करें जैसे:

import CoreLocation

सेट प्रतिनिधि:

CLLocationManagerDelegate

चर की तरह लें:

var locationManager:CLLocationManager!

ViewDidLoad पर () यह सुंदर कोड लिखें:

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

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

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

अब स्थान तक पहुँचने के लिए अनुमति सेट करें, इसलिए इन महत्वपूर्ण मानों को अपनी info.plist फ़ाइल में जोड़ें

 <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>

यहां छवि विवरण दर्ज करें

बिना किसी मुद्दे के 100% काम करना। परीक्षण


मेरे पास दूसरी भाषा है तो यह काम नहीं कर रही है। मुझे अंग्रेजी भाषा ही चाहिए।
मौलिक शाह

29

@wonderwhy मैंने अपना कोड स्क्रीनशॉट जोड़ा है।  pls इसे जांचें।  प्राधिकरण के लिए आपको प्लास्ट में <code> NSLocationWhenInUseUsageDescription जोड़ना होगा। </ code>

NSLocationWhenInUseUsageDescription = एप्लिकेशन पृष्ठभूमि में होने पर स्थान सेवा का उपयोग करने की अनुमति का अनुरोध करें। अपनी plist फाइल में।

यदि यह काम करता है तो कृपया जवाब दें।


1
आप अपने जवाब को कोड जोड़कर और अधिक समझा सकते हैं। यदि आप चाहें
क्रुर्थ पटेल

16
स्क्रीनशॉट को चिपकाने के बजाय मार्कअप भाषा का उपयोग करके कोड का स्निपेट रखना अच्छा होगा
निकोलस एलियो

25

पहला आयात Corelocation और MapKit लाइब्रेरी:

import MapKit
import CoreLocation

हमारी कक्षा के लिए CLLocationManagerDelegate से विरासत में मिली

class ViewController: UIViewController, CLLocationManagerDelegate

एक स्थान प्रबंधक संस्करण बनाएँ, यह आपका स्थान डेटा होगा

var locationManager = CLLocationManager()

स्थान की जानकारी प्राप्त करने के लिए एक फ़ंक्शन बनाएं, विशिष्ट बनें यह सटीक वाक्य रचनाएं हैं:

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

अपने फ़ंक्शन में उपयोगकर्ताओं के लिए एक निरंतर स्थान बनाएं

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

स्थान अपडेट करना बंद करें, यह आपके डिवाइस को चलते समय अपने स्थान को केंद्रित करने के लिए विंडो को लगातार बदलने से रोकता है (यदि आप चाहते हैं कि यह कार्य करना चाहें तो इसे छोड़ सकते हैं)

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)//this basically tells your map where to look and where from what distance

अब क्षेत्र सेट करें और चुनें कि आप इसे एनीमेशन के साथ वहां जाना चाहते हैं या नहीं

mapView.setRegion(region, animated: true)

अपना कार्य बंद करें }

अपने बटन या किसी अन्य तरीके से आप स्वयं को locationManagerDeleget सेट करना चाहते हैं

अब स्थान दिखाने की अनुमति दें

सटीकता निर्धारित करें

locationManager.desiredAccuracy = kCLLocationAccuracyBest

प्रमाणीकरण करें:

 locationManager.requestWhenInUseAuthorization()

स्थान सेवा को अधिकृत करने में सक्षम होने के लिए आपको अपनी दो पंक्तियों को अपनी मुट्ठी में जोड़ना होगा

यहां छवि विवरण दर्ज करें

स्थान प्राप्त करें:

locationManager.startUpdatingLocation()

इसे उपयोगकर्ता को दिखाएं:

mapView.showsUserLocation = true

यह मेरा पूरा कोड है:

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

स्विफ्ट 3.0

यदि आप मानचित्र में उपयोगकर्ता का स्थान नहीं दिखाना चाहते हैं, लेकिन बस इसे फायरबेस या कुछ अन्य में संग्रहीत करना चाहते हैं, तो इस चरणों का पालन करें,

import MapKit
import CoreLocation

अब अपने VC पर CLLocationManagerDelegate का उपयोग करें और आपको नीचे दिखाए गए अंतिम तीन तरीकों को ओवरराइड करना चाहिए। आप देख सकते हैं कि अनुरोध विधि () विधि आपको इन विधियों का उपयोग करके वर्तमान उपयोगकर्ता स्थान कैसे मिलेगा।

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

}

अब आप नीचे दिए गए कॉल को एक बार उपयोगकर्ता साइन इन करने के लिए अपने ऐप में कोड कर सकते हैं। जब requestLocation () का आह्वान किया जाता है, तो यह ऊपर किए गए doUpdateLocations को और बढ़ा देगा और आप स्थान को Firebase या कहीं और स्टोर कर सकते हैं।

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

यदि आप जियोफायर का उपयोग कर रहे हैं तो ऊपर दिए गए डुप्लीकेटेशन विधि में आप नीचे दिए गए स्थान को स्टोर कर सकते हैं

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. 

अंतिम लेकिन कम से कम, अपने Info.plist पर जाएं और "प्राइवेसी -Location जब उपयोग उपयोग विवरण में सक्षम करें।"

जब आप सिमुलेटर का उपयोग करते हैं तो यह परीक्षण करने के लिए हमेशा आपको एक कस्टम स्थान देता है जिसे आपने सिम्युलेटर -> डिबग -> स्थान में कॉन्फ़िगर किया था।


नमस्ते, स्थान कहाँ हैं (देशांतर, अक्षांश), स्थानों को कितनी बार पुनः लोड किया जाता है?
क्रिस्टियन मोरा

@CristianMora जब locationManager.requestLocation का आह्वान किया जाता है, तो यह आह्वान किया गया locationManager (_ प्रबंधक: CLLocationManager, didUpdateLocations स्थानों: [CLLocation]) जहां यह एक स्थान सरणी है और आप उनमें से किसी एक का उपयोग कर सकते हैं या उपयोगकर्ता को सबसे उपयुक्त चुनने के लिए दिखा सकते हैं। स्थान टाइप CLLocation के हैं और आप इस ऑब्जेक्ट से लॉन्गट्यूड, अक्षांश प्राप्त कर सकते हैं। यदि आपको उपयोगकर्ता की जानकारी केवल एक बार चाहिए, तो आपको स्थानों को पुनः लोड करने की आवश्यकता नहीं है अन्यथा आप अनुरोध के रूप में कॉल कर सकते हैं ()। खोज अनुरोध का उदाहरण दें, आप पहले अनुरोध को स्थान दें () और फिर स्थान के आधार पर उत्तर दें।
ल्याजू आई एडविंसन

15

पहले अपनी परियोजना में दो रूपरेखाएँ जोड़ें

1: MapKit

2: Corelocation (XCode 7.2.1 के रूप में आवश्यक नहीं)

अपनी कक्षा में परिभाषित करें

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

फिर viewDidLoad विधि में यह कोड

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

//Setup our Map View
mapobj.showsUserLocation = true

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

क्योंकि कॉल requestWhenInUseAuthorizationअतुल्यकालिक है, locationManagerउपयोगकर्ता द्वारा अनुमति दिए जाने या उसे अस्वीकार करने के बाद ऐप फ़ंक्शन को कॉल करता है। इसलिए उपयोगकर्ता द्वारा दी गई अनुमति के अनुसार, उस फ़ंक्शन के अंदर अपना स्थान प्राप्त कोड रखना उचित है। यह इस पर मिला सबसे अच्छा ट्यूटोरियल है


10
 override func viewDidLoad() {

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

यह आपका दृष्टिकोण है, लोड विधि थी और व्यूकंट्रोलर क्लास में निम्नानुसार मैपस्टार्ट अपडेटिंग विधि भी शामिल है

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();
}

इसके अलावा अपनी परियोजना में CoreLocation.FrameWork और MapKit.Framework जोड़ने के लिए भूल नहीं है (अब आवश्यक के रूप में XCode 7.2.1 )


6

उपयोग:

कक्षा में क्षेत्र को परिभाषित करें

let getLocation = GetLocation()

सरल कोड द्वारा वर्ग के कार्य में उपयोग करें:

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

वर्ग:

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


Info.plist में "NSLocationWhenInUseUsageDescription" जोड़ना न भूलें।


1
धन्यवाद! Info.plist में "NSLocationWhenInUseUsageDescription" जोड़ना न भूलें
जोनास डेचलमैन

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

इस कोड को आवश्यक ViewController में लिखने की आवश्यकता है।

 //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

यहाँ एक कॉपी-पेस्ट उदाहरण है जो मेरे लिए काम करता है।

http://swiftdeveloperblog.com/code-examples/determine-users-current-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

IOS स्विफ्ट 4 में 100% काम कर रहे हैं: परमार सज्जाद

चरण 1: GoogleDeveloper Api कंसोल पर जाएं और अपना ApiKey बनाएं

चरण 2: गोटो प्रोजेक्ट को कोकोपोड्स Google मेप्स पॉड स्थापित करें

चरण 3: गोटो AppDelegate.swift GoogleMaps और आयात करें

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

    GMSServices.provideAPIKey("ApiKey")
    return true
}

चरण 4: आयात UIKit आयात GoogleMaps वर्ग ViewController: UIViewController, CLLocationManagerleele.com {

@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)

}

}

चरण 5: खुली जानकारी .plist फ़ाइल और गोपनीयता के नीचे जोड़ें - स्थान जब उपयोग में वर्णन विवरण ...... एक मुख्य स्टोरीबोर्ड फ़ाइल आधार नाम के नीचे

चरण 6: चलाएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.