+1 dzięki za opublikowanie prostego fragmentu kodu w celu uzupełnienia zaakceptowanej odpowiedzi
AngeloS
12
Uważaj na tym przykładzie, te wartości właściwości prowadzą do wyższego zużycia baterii.
DanSkeel
36
WAŻNE: Musisz także „stopUpdatingLocations”, w przeciwnym razie metoda delegata będzie wywoływana za każdym razem, gdy użytkownik zmieni swoją lokalizację. W związku z tym wspomniany powyżej problem z baterią, a także jeśli w tej metodzie delegata zostanie wyzwolona inna metoda, będzie ona nadal wywoływać. Happy Coding Guys !! Twoje zdrowie!!
Apple_iOS0304
5
Jesteś typem użytkownika, który sprawia, że StackOverflow jest świetny. Fragmenty kodu są wzorowe i mam nadzieję, że więcej osób uwzględni je w swoich odpowiedziach.
Danny
26
W przypadku iOS 8.0+ musisz uwzględnić następujące klucze w Info.plist projektu: NSLocationAlwaysUsageDescriptionjeśli używasz [self.locationManager requestAlwaysAuthorization]lub NSLocationWhenInUseUsageDescriptionjeśli używasz [self.locationManager requestWhenInUseAuthorization]. Aby obsługiwać systemy iOS 6.0+ do iOS 7.0+, dołącz klucz NSLocationUsageDescriptionlub „Prywatność - Opis wykorzystania lokalizacji”. Więcej informacji pod linkiem: developer.apple.com/library/ios/documentation/General/Reference/…
Próbowałem dokładnie tych samych kroków, które wymieniono powyżej. Ale w konsoli wyświetla się komunikat „Użytkownik wciąż myśli”. Czy to oznacza, że aplikacja nie ma uprawnień do korzystania z lokalizacji? Jeśli tak, jak zezwolić aplikacji na używanie lokalizacji. Proszę pomóż.
kirans_6891
61
Użyć ramy CoreLocation do informacji o swojej lokalizacji dostępu użytkownika. Konieczne będzie utworzenie wystąpienia obiektu CLLocationManager i wywołanie asynchronicznego komunikatu startUpdatingLocation . Otrzymasz wywołania zwrotne z lokalizacją użytkownika za pośrednictwem dostarczonego CLLocationManagerDelegate .
Po pierwsze. Musisz dodać swój opisowy ciąg w pliku info.plist dla kluczy NSLocationWhenInUseUsageDescriptionlub w NSLocationAlwaysUsageDescriptionzależności od rodzaju usługi, o którą prosisz
Kod
importFoundationimportCoreLocationclassLocationManager:NSObject,CLLocationManagerDelegate{
let manager:CLLocationManager
var locationManagerClosures:[((userLocation:CLLocation)->())]=[]
override init(){
self.manager =CLLocationManager()
super.init()
self.manager.delegate= self
}//This is the main method for getting the users location and will pass back the usersLocation when it is available
func getlocationForUser(userLocationClosure:((userLocation:CLLocation)->())){
self.locationManagerClosures.append(userLocationClosure)//First need to check if the apple device has location services availabel. (i.e. Some iTouch's don't have this enabled)ifCLLocationManager.locationServicesEnabled(){//Then check whether the user has granted you permission to get his locationifCLLocationManager.authorizationStatus()==.NotDetermined{//Request permission//Note: you can also ask for .requestWhenInUseAuthorization
manager.requestWhenInUseAuthorization()}elseifCLLocationManager.authorizationStatus()==.Restricted||CLLocationManager.authorizationStatus()==.Denied{//... Sorry for you. You can huff and puff but you are not getting any location}elseifCLLocationManager.authorizationStatus()==.AuthorizedWhenInUse{// This will trigger the locationManager:didUpdateLocation delegate method to get called when the next available location of the user is available
manager.startUpdatingLocation()}}}//MARK: CLLocationManager Delegate methods@objc func locationManager(manager:CLLocationManager, didChangeAuthorizationStatus status:CLAuthorizationStatus){if status ==.AuthorizedAlways|| status ==.AuthorizedWhenInUse{
manager.startUpdatingLocation()}}
func locationManager(manager:CLLocationManager, didUpdateToLocation newLocation:CLLocation, fromLocation oldLocation:CLLocation){//Because multiple methods might have called getlocationForUser: method there might me multiple methods that need the users location.//These userLocation closures will have been stored in the locationManagerClosures array so now that we have the users location we can pass the users location into all of them and then reset the array.
let tempClosures = self.locationManagerClosures
for closure in tempClosures {
closure(userLocation: newLocation)}
self.locationManagerClosures =[]}}
Stosowanie
self.locationManager =LocationManager()
self.locationManager.getlocationForUser {(userLocation:CLLocation)->() in
print(userLocation)}
wierzę, że w takich przypadkach jest szybki przełącznik (): ^)
Anton Tropashko,
self.locationManager = LocationManager()użyj tego wiersza w metodzie viewDidLoad, aby ARC nie usuwał instancji, a wyskakujące okienko lokalizacji zniknęło zbyt szybko.
Możesz skorzystać z tej usługi, którą napisałem, aby załatwić wszystko za Ciebie.
Ta usługa zażąda uprawnień i zajmie się obsługą CLLocationManager, więc nie musisz tego robić.
Użyj w ten sposób:
LocationService.getCurrentLocationOnSuccess({(latitude, longitude)->() in
//Do something with Latitude and Longitude}, onFailure:{(error)->() in
//See what went wrong
print(error)})
Odpowiedzi:
Odpowiedź RedBlueThing działała dla mnie całkiem nieźle. Oto przykładowy kod pokazujący, jak to zrobiłem.
nagłówek
MainFile
W metodzie init
Funkcja oddzwaniania
iOS 6
W iOS 6 funkcja delegata była przestarzała. Nowym delegatem jest
Dlatego, aby uzyskać nową pozycję, użyj
iOS 8
W iOS 8 przed rozpoczęciem aktualizacji lokalizacji należy wyraźnie zapytać o pozwolenie
Musisz także dodać ciąg dla kluczy
NSLocationAlwaysUsageDescription
lubNSLocationWhenInUseUsageDescription
do pliku Info.plist aplikacji. W przeciwnym razie wywołania dostartUpdatingLocation
będą ignorowane, a Twój pełnomocnik nie otrzyma żadnego oddzwonienia.I na koniec, gdy skończysz czytać lokalizację, zadzwoń do zatrzymania Aktualizowanie lokalizacji w odpowiednim miejscu.
źródło
NSLocationAlwaysUsageDescription
jeśli używasz[self.locationManager requestAlwaysAuthorization]
lubNSLocationWhenInUseUsageDescription
jeśli używasz[self.locationManager requestWhenInUseAuthorization]
. Aby obsługiwać systemy iOS 6.0+ do iOS 7.0+, dołącz kluczNSLocationUsageDescription
lub „Prywatność - Opis wykorzystania lokalizacji”. Więcej informacji pod linkiem: developer.apple.com/library/ios/documentation/General/Reference/…W iOS 6
jest przestarzałe.
Zamiast tego użyj następującego kodu
W przypadku iOS 6 ~ 8 powyższa metoda jest nadal konieczna, ale musisz obsłużyć autoryzację.
Jest to metoda delegata, która obsługuje autoryzację użytkownika
źródło
[locations lastObject]
?Użyć ramy CoreLocation do informacji o swojej lokalizacji dostępu użytkownika. Konieczne będzie utworzenie wystąpienia obiektu CLLocationManager i wywołanie asynchronicznego komunikatu startUpdatingLocation . Otrzymasz wywołania zwrotne z lokalizacją użytkownika za pośrednictwem dostarczonego CLLocationManagerDelegate .
źródło
Wypróbuj te proste kroki ....
UWAGA: Sprawdź szerokość i logitude lokalizacji urządzenia, jeśli używasz środków symulatora. Domyślnie jest to tylko none.
Krok 1: Importuj
CoreLocation
strukturę w pliku .hKrok 2: Dodaj delegata CLLocationManagerDelegate
Krok 3: Dodaj ten kod w pliku klasy
Krok 4: Metoda wykrywania aktualnej lokalizacji
Krok 5: Uzyskaj lokalizację za pomocą tej metody
źródło
W Swift (dla iOS 8+).
Info.plist
Po pierwsze. Musisz dodać swój opisowy ciąg w pliku info.plist dla kluczy
NSLocationWhenInUseUsageDescription
lub wNSLocationAlwaysUsageDescription
zależności od rodzaju usługi, o którą prosiszKod
Stosowanie
źródło
self.locationManager = LocationManager()
użyj tego wiersza w metodzie viewDidLoad, aby ARC nie usuwał instancji, a wyskakujące okienko lokalizacji zniknęło zbyt szybko.Dokumentacja Xcode zawiera bogatą wiedzę i przykładowe aplikacje - zapoznaj się z Przewodnikiem programowania rozpoznawania lokalizacji .
LocateMe przykładowy projekt przedstawia efekty modyfikowania CLLocationManager różne ustawienia dokładność „s
źródło
iOS 11.x Swift 4.0 Info.plist potrzebuje tych dwóch właściwości
I ten kod ... upewniając się oczywiście, że jesteś CLLocationManagerDelegate
I oczywiście ten kod, który możesz umieścić w viewDidLoad ().
I te dwa na prośbęLokalizacja, abyś mógł iść, aka oszczędzając ci konieczności wstawania z miejsca :)
źródło
Możesz skorzystać z tej usługi, którą napisałem, aby załatwić wszystko za Ciebie.
Ta usługa zażąda uprawnień i zajmie się obsługą CLLocationManager, więc nie musisz tego robić.
Użyj w ten sposób:
źródło
Dla Swift 5, oto krótka krótka klasa, aby uzyskać lokalizację:
źródło