Published on

CoreLocation β€” foydalanuvchi joylashuvi

Authors

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.

Buy mea coffee