# Apple Frameworks Cheat Sheet

iOS ekotizimidagi eng muhim mahalliy (native) imkoniyatlar: `UserNotifications`, `LocalAuthentication` (Face ID), `CoreLocation`, `PhotosUI`, `StoreKit 2` va `Haptics` bo'yicha tezkor qo'llanma.

---

## 1. UserNotifications (Bildirishnomalar)

```swift
import UserNotifications

final class NotificationManager {
    static let shared = NotificationManager()

    // 1. Ruxsat so'rash
    func requestPermission() async -> Bool {
        do {
            return try await UNUserNotificationCenter.current().requestAuthorization(
                options: [.alert, .badge, .sound]
            )
        } catch {
            return false
        }
    }

    // 2. Mahalliy bildirishnoma rejalashtirish
    func scheduleReminder(title: String, body: String, delaySeconds: TimeInterval) {
        let content = UNMutableNotificationContent()
        content.title = title
        content.body = body
        content.sound = .default

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: delaySeconds, repeats: false)
        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

        UNUserNotificationCenter.current().add(request)
    }
}
```

---

## 2. LocalAuthentication (Face ID / Touch ID)

```swift
import LocalAuthentication

final class BiometricAuthManager {
    static func authenticateUser() async -> (success: Bool, error: String?) {
        let context = LAContext()
        var error: NSError?

        guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
            return (false, "Biometriya qo'llab-quvvatlanmaydi yoki o'rnatilmagan")
        }

        let reason = "Ilovaga kirish uchun shaxsingizni tasdiqlang"
        do {
            let success = try await context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason)
            return (success, nil)
        } catch {
            return (false, error.localizedDescription)
        }
    }
}
```

---

## 3. CoreLocation (Geolokatsiya)

```swift
import CoreLocation

final class LocationService: NSObject, CLLocationManagerDelegate {
    private let manager = CLLocationManager()
    var onLocationUpdate: ((CLLocation) -> Void)?

    override init() {
        super.init()
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
    }

    func requestLocationPermission() {
        manager.requestWhenInUseAuthorization()
    }

    func startTracking() {
        manager.startUpdatingLocation()
    }

    // Delegate metodlari
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else { return }
        onLocationUpdate?(location)
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Geolokatsiya xatosi:", error.localizedDescription)
    }
}
```

---

## 4. PhotosUI: Zamonaviy Rasm Tanlash (PhotosPicker)

### SwiftUI (iOS 16+):
```swift
import SwiftUI
import PhotosUI

struct AvatarPickerView: View {
    @State private var selectedItem: PhotosPickerItem?
    @State private var selectedImage: Image?

    var body: some View {
        PhotosPicker(selection: $selectedItem, matching: .images) {
            if let selectedImage {
                selectedImage.resizable().scaledToFit().frame(width: 100, height: 100)
            } else {
                Label("Rasm tanlash", systemImage: "photo")
            }
        }
        .onChange(of: selectedItem) { _, newItem in
            Task {
                if let data = try? await newItem?.loadTransferable(type: Data.self),
                   let uiImage = UIImage(data: data) {
                    selectedImage = Image(uiImage: uiImage)
                }
            }
        }
    }
}
```

---

## 5. StoreKit 2 (In-App Purchases & Obunalar)

Apple'ning zamonaviy `async/await` asosidagi to'lov tizimi.

```swift
import StoreKit

@MainActor
final class StoreManager: ObservableObject {
    @Published var products: [Product] = []

    func loadProducts() async {
        do {
            products = try await Product.products(for: ["uz.azimjondev.pro_monthly", "uz.azimjondev.lifetime"])
        } catch {
            print("Mahsulotlarni yuklashda xato:", error)
        }
    }

    func purchase(product: Product) async throws -> Bool {
        let result = try await product.purchase()

        switch result {
        case .success(let verification):
            switch verification {
            case .verified(let transaction):
                // To'lov muvaffaqiyatli o'tdi, transaction.finish() qilish shart
                await transaction.finish()
                return true
            case .unverified:
                return false
            }
        case .userCancelled:
            return false
        case .pending:
            return false
        @unknown default:
            return false
        }
    }
}
```

---

## 6. Haptic Feedback (Vibratsiya va Qaytma Aloqa)

Foydalanuvchi tugmalarni bosganda yoki biror amal muvaffaqiyatli bo'lganda taktil sezgi hosil qilish:

```swift
import UIKit

enum Haptics {
    // Ta'sir (Impact): .light, .medium, .heavy, .rigid, .soft
    static func impact(_ style: UIImpactFeedbackGenerator.FeedbackStyle = .medium) {
        let generator = UIImpactFeedbackGenerator(style: style)
        generator.prepare()
        generator.impactOccurred()
    }

    // Xabarnoma (Notification): .success, .warning, .error
    static func notification(_ type: UINotificationFeedbackGenerator.FeedbackType) {
        let generator = UINotificationFeedbackGenerator()
        generator.prepare()
        generator.notificationOccurred(type)
    }

    // Tanlov o'zgarganda (Selection)
    static func selection() {
        let generator = UISelectionFeedbackGenerator()
        generator.prepare()
        generator.selectionChanged()
    }
}

// Ishlatish:
Haptics.impact(.medium)
Haptics.notification(.success)
```
