- Published on
CoreLocation β foydalanuvchi joylashuvi
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
CoreLocation β Apple ning qurilma joylashuvini aniqlash uchun framework i. U GPS, Wi-Fi va cellular tarmoq signallarini tahlil qilib, foydalanuvchi qayerdaligini aniqlaydi. Xaritalar, yetkazib berish ilovalari, ob-havo va fitness ilovalar uchun muhim. Joylashuvga ruxsat olish majburiy β foydalanuvchi ruxsat bermasa, ilova joylashuvni ololmaydi.
Asosiy komponentlar: CLLocationManager β joylashuvni boshqaruvchi class, CLLocation β koordinata, aniqlik, tezlik ma'lumotlari, CLGeocoder β koordinatani manzilga (va aksincha) aylantirish.
Joylashuv menejeri yaratish
CLLocationManager β joylashuv xizmatlarining markaziy class i. U delegate pattern bilan ishlaydi β joylashuv aniqlanganda yoki ruxsat o'zgarganda delegate metodlari chaqiriladi. desiredAccuracy β joylashuv aniqligini belgilaydi (aniqroq = ko'proq batareya sarfi).
import CoreLocation
// βββββββββββββββββββββββββββββββββββββββ
// JOYLASHUV MENEJERI β @Observable bilan
// βββββββββββββββββββββββββββββββββββββββ
@Observable
class JoylashuvMenejeri: NSObject, CLLocationManagerDelegate {
let menejer = CLLocationManager()
var joylashuv: CLLocation?
var ruxsat: CLAuthorizationStatus = .notDetermined
override init() {
super.init()
menejer.delegate = self
menejer.desiredAccuracy = kCLLocationAccuracyBest
}
// Ruxsat so'rash
func ruxsatSorash() {
menejer.requestWhenInUseAuthorization()
}
// Joylashuvni olish
func joylashuvniOlish() {
menejer.requestLocation() // Bir marta
// menejer.startUpdatingLocation() β doimiy kuzatish
}
// Delegate β ruxsat o'zgardi
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
ruxsat = manager.authorizationStatus
if ruxsat == .authorizedWhenInUse {
joylashuvniOlish()
}
}
// Delegate β joylashuv olindi
func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
joylashuv = locations.last
}
// Delegate β xato
func locationManager(_ manager: CLLocationManager,
didFailWithError error: Error) {
print("Joylashuv xatosi: \(error.localizedDescription)")
}
}
SwiftUI da ishlatish
SwiftUI da joylashuv menejerini @State bilan yaratib, ruxsat holatiga qarab turli ko'rinishlarni ko'rsatish mumkin. .notDetermined β hali so'ralmagan, .denied β foydalanuvchi rad etgan, .authorizedWhenInUse β ruxsat berilgan.
struct JoylashuvKorinishi: View {
@State private var menejer = JoylashuvMenejeri()
var body: some View {
VStack(spacing: 20) {
// Ruxsat holati
switch menejer.ruxsat {
case .notDetermined:
Button("Joylashuvga ruxsat berish") {
menejer.ruxsatSorash()
}
.buttonStyle(.borderedProminent)
case .denied, .restricted:
Text("Joylashuv ruxsati berilmagan")
.foregroundStyle(.red)
Text("Sozlamalar β Maxfiylik dan yoqing")
.font(.caption)
case .authorizedWhenInUse, .authorizedAlways:
if let joy = menejer.joylashuv {
Text("Kenglik: \(joy.coordinate.latitude, specifier: "%.4f")")
Text("Uzunlik: \(joy.coordinate.longitude, specifier: "%.4f")")
Text("Aniqlik: \(joy.horizontalAccuracy, specifier: "%.0f") metr")
} else {
ProgressView("Joylashuv aniqlanmoqda...")
}
@unknown default:
Text("Nomalum holat")
}
}
.padding()
}
}
Geocoding β koordinatani manzilga
Geocoding β koordinatani inson o'qiydigan manzilga aylantirish (va aksincha). Reverse geocoding β koordinata β manzil ("Toshkent, O'zbekiston"). Forward geocoding β manzil β koordinata. CLGeocoder class i ikkala yo'nalishda ishlaydi va async/await bilan chaqirish mumkin.
// βββββββββββββββββββββββββββββββββββββββ
// GEOCODING β koordinata β manzil
// βββββββββββββββββββββββββββββββββββββββ
class GeocoderMenejer {
private let geocoder = CLGeocoder()
// Koordinata β Manzil (Reverse Geocoding)
func manzilOlish(koordinata: CLLocationCoordinate2D) async -> String? {
let joy = CLLocation(latitude: koordinata.latitude,
longitude: koordinata.longitude)
do {
let natijalar = try await geocoder.reverseGeocodeLocation(joy)
if let birinchi = natijalar.first {
return [birinchi.locality, birinchi.country]
.compactMap { $0 }
.joined(separator: ", ")
}
} catch {
print("Geocoding xatosi: \(error)")
}
return nil
}
// Manzil β Koordinata (Forward Geocoding)
func koordinataOlish(manzil: String) async -> CLLocationCoordinate2D? {
do {
let natijalar = try await geocoder.geocodeAddressString(manzil)
return natijalar.first?.location?.coordinate
} catch {
print("Geocoding xatosi: \(error)")
}
return nil
}
}
Info.plist sozlash
Joylashuv xizmatlarini ishlatish uchun Info.plist fayliga majburiy kalit qo'shish kerak. Bu kalit foydalanuvchiga joylashuv nima uchun kerakligini tushuntiruvchi matn. Bu matnsiz Apple ilovani App Store ga qo'ymaydi.
Info.plist ga qo'shish kerak:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Key: NSLocationWhenInUseUsageDescription β
β Value: "Sizga yaqin joylarni ko'rsatish uchun β
β joylashuvingiz kerak" β
β β
β Key: NSLocationAlwaysUsageDescription (agar kerak) β
β Value: "Fon da joylashuvni kuzatish uchun kerak" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π― Topshiriq
Joylashuv ilovasi yarating: ruxsat so'rash, koordinatani ko'rsatish, CLGeocoder bilan shahar nomini aniqlash va Map view da ko'rsatish. Xaritada foydalanuvchi joylashuvini marker bilan belgilang.